Я прохожу некоторые из кода и проектов, представленных здесь http://fatfreeframework.com/development. Моя цель — создать легкий кикстартер MVC, использующий F3. Я знаю, что это было сделано раньше, но я использую это как учебное упражнение, и я надеюсь, что в итоге получится что-то полезное.
Самым большим камнем преткновения, с которым я сталкиваюсь сейчас, является концепция макетов. Я знаю, что в документации упоминается использование шаблонов в шаблонах, но я изо всех сил пытаюсь реализовать это на практике. В конце я хочу иметь 1 или 2 макета (макет по умолчанию, может быть, пользовательский макет для модальных всплывающих окон и т. Д.), А затем сделать мои представления обернутыми внутри этих макетов. Я хочу макет по умолчанию, а затем возможность переопределить по умолчанию для нескольких страниц, которые нуждаются в пользовательских. Вот код, который я использовал:
// this is the handler for one of my routes, it's on a controller class called Index
public function index($f3, $params)
{
// this (or anything else) should get passed into the view
$f3->set('listOfItems',array("item1", "item2"));
// set the view
$f3->set('content', 'index.htm')
// render the layout
\Template::instance()->render('layout.htm');
}
К сожалению, я продолжаю получать пустую страницу. Я иду по этому совершенно неправильному пути, или я на правильном пути? Есть ли способ установить макет по умолчанию где-нибудь, чтобы он использовался до тех пор, пока не будет переопределен?
Ну, вы можете создать базовый класс с макетом по умолчанию. Затем вы расширяете его для каждого класса контроллера. Например:
abstract class Layout {
protected $tpl='layout.htm';
function afterRoute($f3,$params) {
echo \Template::instance()->render($this->tpl);
}
}
Затем:
class OneController extends Layout {
function index($f3,$params) {
$f3->set('listOfItems',...);
$f3->set('content','one/index.htm');
}
}
class AnotherController extends Layout {
protected $tpl='popup.htm';//override default layout here
function index($f3,$params) {
$f3->set('listOfItems',...);
$f3->set('content','another/index.htm');
}
}
В layout.htm:
<body>
<div id="content">
<include href="{{@content}}" if="isset(@content)"/>
</div>
</body>
Структура UI
папка:
/ui
|-- layout.htm
|-- popup.htm
|-- one
|-- index.htm
|-- another
|-- index.htm
Это только один пример того, как вы могли бы организовать свой код. F3 достаточно свободен, чтобы позволить вам организовать его множеством способов.
У меня была точно такая же проблема — все настроить, как нужно, отрисовал макет и продолжал получать пустую страницу. Также, когда я проверял исходный HTML-код отображаемой страницы, она была полностью пустой.
Если вы присмотритесь, но рендеринга макета недостаточно, вы должны также Распечатать это с помощью echo
команда. Так что вместо следующего примера, который на первый взгляд кажется правильным:
$f3->route('GET /',
function($f3) {
// Instantiates a View object
$view = new View;
// Render the page
$view->render('template/layout.php');
вам на самом деле нужна последняя строка для начала echo
:
echo $view->render('template/layout.php');
Дополнительные примеры см .:
Кроме того, по какой-то причине (что, я уверен, скоро станет ясно — я только начал использовать Fat Free Framework), вы также можете визуализировать .htm
файл, который содержит встроенный PHP (т.е. они не должны иметь .php
расширение).