AVXNWNK
@AVXNWNK
Middle DevOps-engineer

Как подключить Fenom к моему проекту?

Приветствую всех заглянувших в мой ask. Случилась такая неприятность с моим проектом на PHP, не так давно я начал осваивать Composer и решил заняться подключением шаблонизатора Fenom, на замену своему штатному, работавший по принципу вывода буфера через ob. В общем к проекту я его подключил, вывел свой Layout, но никак не могу вывести Content, наглухо застрял и не знаю, как быть. Жалуется на то, что не может преобразовать массив в строку. Может я конечно тут "накостылил" или того хуже, но все-таки решать проблему как-то нужно. Вот фрагменты кода:

index.php:
define('VIEWS_PATH', ROOT . DS . 'views');

App::run($_SERVER['REQUEST_URI']);


App.class.php:
self::$router = new Router($url);

$controller_class = ucfirst(self::$router->getController()) . 'Controller';
$controller_method = strtolower(self::$router->getMethodPrefix() . self::$router->getAction());

$layout = self::$router->getRoute();

$fenom = Fenom::factory(VIEWS_PATH, VIEWS_PATH.'/cache', array(
    'disable_cache' => 'true',
));
$controller_object = new $controller_class;

if (method_exists($controller_object, $controller_method)) {
    $content = $fenom->display($controller_object->$controller_method(), $controller_object->getData());
} else {
    throw new Exception('meth_not_found');
}

$fenom->display($layout.'.html', compact('content'));


Ну а в Layout'е вывожу переменную в таком виде:
{$content}

Ну и чтобы было более понятней, в старом "шаблонизаторе" все выглядело примерно так:
App.class.php:
if (method_exists($controller_object, $controller_method)) {
    $view_path = $controller_object->$controller_method();
    $view_object = new View($controller_object->getData(), $view_path);
    $content = $view_object->render();
} else {
    throw new Exception('meth_not');
}

$layout_path = VIEWS_PATH . DS . $layout . '.html';
$layout_view_object = new View(compact('content'), $layout_path);

echo $layout_view_object->render();


View.class.php:
public function render()
{
    $data = $this->data;
    ob_start();
    include($this->path);
    $content = ob_get_clean();

    return $content;
}


А в Layout'е контент подключался так:
<?=$data['content']?>

Заранее благодарю!
  • Вопрос задан
  • 351 просмотр
Решения вопроса 1
AVXNWNK
@AVXNWNK Автор вопроса
Middle DevOps-engineer
Я решил проблему следующим образом:

Объявил $fenom в App.class.php, затем создал для него getter, что позволило подключить Fenom и к View.class.php, затем в App.class.php я вывел Layout:
self::$fenom->display($layout.'.html', compact('content'));

Тем временем View.class.php узнает, где мы находимся и пишет строку $path, а также формирует массив $data. Затем Fenom подключается к View из App и в $content пишется путь к шаблону и данные:
$content = $fenom->fetch($this->path, $this->data);

Затем $content возвращается в App и он уже рисует его в Layout в переменной {$content}.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
А что у вас в самой переменной $content? Через var_dump не смотрели?
А еще смущает вот эта строка:
$content = $fenom->display($controller_object->$controller_method(), $controller_object->getData());

Там, исходя из документации, нужно вот это :
$content = $fenom->fetch($controller_object->$controller_method(), $controller_object->getData());


Ссылка на документацию:
https://github.com/fenom-template/fenom/blob/maste...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы