Добрый день есть такие файлы
default.php
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<?=$this->getMeta()?>
</head>
<body>
<h1>Шаблон Default</h1>
<?=$content; ?>
</body>
</html>
Где с помощью getMeta выводится мета теги. Они и выводится но значения что я записываю в MainController не идут
namespace app\controllers;
class MainController extends AppController
{
public function indexAction(){
$dsa = $this->setMeta('Главная страница','Мой суперский сайт', 'keyowrds');
}
}
controller.php
<?php
namespace ishop\base;
abstract class Controller
{
public $route;
public $controller;
public $model;
public $view;
public $layout;
public $prefix;
public $data = [];
public $meta = ['title' => '', 'description'=>'', 'keywords'=>''];
public function __construct($route)
{
$this->route = $route;
$this->controller = $route['controller'];
$this->model = $route['controller'];
$this->view = $route['action'];
$this->prefix = $route['prefix'];
}
public function getView(){
$viewObject = new View($this->route, $this->layout, $this->view, $this->meta);
$viewObject->render($this->data);
}
public function set($data){
$this->data = $data;
}
public function setMeta($title = '', $description = '', $keywords = ''){
$this->$meta['title'] = $title;
$this->$meta['description'] = $description;
$this->$meta['keywords'] = $keywords;
}
}
view.php
<?php
namespace ishop\base;
use ishop\App;
use mysql_xdevapi\Exception;
class View
{
public $route;
public $controller;
public $model;
public $view;
public $layout;
public $prefix;
public $data = [];
public $meta = [];
public function __construct($route, $layout = '', $view = '', $meta)
{
$this->route = $route;
$this->controller = $route['controller'];
$this->model = $route['controller'];
$this->view = $view;
$this->prefix = $route['prefix'];
$this->meta = $meta;
if($layout === false){
$this->layout = false;
}
else{
$this->layout = $layout ?: LAYOUT;
}
}
public function render($data){
$viewfile = APP ."/views/{$this->prefix}{$this->controller}/{$this->view}.php";
if(is_file($viewfile)){
ob_start();
require_once $viewfile;
$content = ob_get_clean();
}
else{
throw new \Exception("Не найден вид {$viewfile}",500);
}
if(false !== $this->layout){
$layoutFile = APP . "/views/layouts/{$this->layout}.php";
if(is_file($layoutFile)){
require_once $layoutFile;
}
else{
throw new \Exception("Шаблон {$this->layout} не найден",500);
}
}
}
public function getMeta(){
$output = "<title>" . $this->meta['title'] . "</title>" .PHP_EOL;
$output .= '<meta name="description" content="' . $this->$meta['description'] . '">' .PHP_EOL;
$output .= '<meta name="keywords" content="' . $this->$meta['keywords'] . '">' .PHP_EOL;
return $output;
}
}
Вы обращаетесь к свойству объекта анонимно через $this->$meta
, когда оно у вас определено public $meta
, замените ваш метод на этот:
public function setMeta($title = '', $description = '', $keywords = ''){
$this->meta['title'] = $title;
$this->meta['description'] = $description;
$this->meta['keywords'] = $keywords;
}
Вы обращались $this->$meta
, переменной $meta
в методе setMeta()
не было объявлено и судя по всему в глобальной видимости тоже - и вообще так делать вам не нужно было(специально ее где-то определять). Напомню, что данное обращение $this->$meta
является анонимным, или "magic access", потому что вы не знаете что лежит в переменной $meta
, там может лежать значение 'trump'
и получается что вызываете $this->trump
.
Вам не имеет смысла определять переменную dsa
, потому что метод setMeta()
ничего не возвращает(void
). Можете просто ее убрать:
public function indexAction()
{
$this->setMeta('Главная страница','Мой суперский сайт', 'keyowrds');
}
<?=$content; ?>
- ;
необязательно ставить, в таких случаях она мозолит глаза и ухудшает читаемость.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Задача "Как сохранить порядок отображения подстрок"!
Подскажите пожалуйста, при использовании DI-контейнера возникло несколько вопросов: