Я работаю с PHP Fat Free и пытаюсь создать систему макета/подмакета, которая в конечном итоге будет в некоторой степени имитировать MVC. У меня есть основной макет с заполнителями (по сути, серверная часть устанавливает разные вложенные макеты или частичные пути к файлам, а затем представление позаботится о вызове рендеринга этого имени файла. Все это прекрасно работает.
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужен встроенный javascript в моем подмакете для запуска после скриптов в основном макете (например, после строки включения jquery). В предыдущем фреймворке, который я использовал, я мог выполнить буферизацию вывода ob_start и ob_get_clean, чтобы получить скрипт в подмакете, а затем передать его в макет для отображения под строкой скрипта. Я надеюсь, что это имеет смысл, но если нет, вот текущий код, с которым я работаю в F3.
Маршрут:
$f3->route('GET /test',
function($f3) {
// set the sublayout name
$f3->set('sublayout', 'testpage.php');
// render the whole shebang
echo View::instance()->render('testlayout.php');
}
);
Расположение:
<!DOCTYPE html>
<html>
<head>
<title>Test Layout</title>
</head>
<body>
<h1>Test Layout</h1>
<?php echo View::instance()->render($sublayout) ?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" />
<!-- inline script should go here -->
</body>
</html>
Подмакет:
<h2>My Test Page</h2>
<div id='message'></div>
<script>
// This code needs to be placed AFTER the jquery include in the main layout
$(function(){
$('#message').html('This is my message');
});
</script>
Я попытался расширить представление, включив в него функции «beginRegion» и endRegion, которые в основном обрабатывали часть ob_start и ob_get_clean, чтобы можно было подобрать мой встроенный скрипт, но как только я оказался в подмакете, я не смог понять, как передайте этот буферизованный код обратно в макет, чтобы его можно было повторить после включения jquery.
Прежде чем вы скажете мне, что я не должен использовать встроенный скрипт, я знаю это, и большинство вещей, которые я делаю, находятся во внешних файлах скриптов, для которых у меня есть решение, но бывают случаи, когда мне нужно это встроено, и именно здесь я застрял .
Есть ли способ справиться с тем, что я пытаюсь сделать с буферизацией вывода, или, что еще лучше, есть ли лучший способ решить эту проблему, чем подход к буферизации вывода?
Обновление. Согласно рекомендациям, вы должны размещать скрипт внизу страницы прямо перед закрывающим тегом body. Если я помещу сценарий над вложенным макетом, это нарушит оба наших передовых метода FE и будет иметь тот недостаток, что остальная часть страницы будет заблокирована во время загрузки сценария. Вот почему я хотел бы, чтобы он был структурирован так, как я отметил, вместо того, чтобы размещать jquery include ВЫШЕ подмакета.