Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток.
Подскажите в какую сторону копать по следующему вопросу.
Есть файл базового шаблона (layout) views/layouts/main.blade.php:
<html>
<body>
@yield('content')
</body>
</html>
Есть шаблон конкретной страницы views/page/index.blade:
@layout('layouts.main')
@section('content')
{{ $test_variable }}
@endsection
Для примера, в action некоторого контроллера (или в routes) выполняется следующее:
return View::make('page.index',array('test_variable'=>$test_variable));
Все работало замечательно до тех пор пока…
… не столкнулся с необходимостью передать через $test_variable конструкцию шаблона типа такой:
{{ HTML::link('/','На главную') }}
По задумке хочу хранить шаблоны в базе данных.
Естественно вместо ожидаемой ссылки (<a href="/">На главную</a>) получил то, что передал…
Отсюда вопрос: — Как?
Возможно, где-то в документации просмотрел какой метод… ткните пальцем.
С другой стороны, понимаю, что это echo и вряд ли в лоб можно реализовать задуманное. Не хотелось бы городить огород и изобретать велосипед.
Поэтому, прошу подсказать идею как лучше реализовать задуманное.
Заранее благодарю.
Не в сети
Из описания проблемы мало что понятно.
- получил то, что передал…
То есть сроку {{ HTML::link('/','На главную') }}, как она есть?
А PHP$test_variable
в примере 3 — это строка {{ HTML::link('/','На главную') }}?
Если так, то разумеется, что она выводится как есть. Шаблон компилируется в обычный PHP-код вида:
...layout('layouts.main')
...section('content')
<?php echo $test_variable?>
...endsection
Поэтому содержимое переменной просто выводится. Если хочется, чтобы вывелась ссылка — так надо выполнить функцию и передать её результат, а не сам код в виде Blade:
$test_variable = HTML::link('/','На главную');
return View::make('page.index',array('test_variable'=>$test_variable));
Не в сети
Прошу прощения за корявость изложения и постановки задачи.
Я с Laravel ознакомился не так давно и простота работы с некоторыми вещами меня подкупила.
Поэтому и хотел узнать, возможно ли отделаться «малой кровью» за реализацию задуманного.
Шаблоны Blade хорошая штука, но я хотел бы хранить их не отдельными файлами, а записями в базе данных.
То есть, если у меня был файл, например, index.blade.php с совершенно различным содержимым:
@layout('layouts.main')
@section('content')
<p>здесь просто текст</p>
<p>тут ссылки:</p>
{{ HTML::link('/','На главную') }}
<p>здесь форма:</p>
{{ Form::open('/') }}
...
<p>здесь данные из базы данных</p>
@foreach($pages as $page)
...
@endsection
Я бы хотел поместить его в базу данных, а в нужный момент в контроллере сделать нечто подобное:
return OtherView::make(шаблон_из_бд, данные_в_шаблон));
Мне бы не хотелось компилировать что-либо в контроллере:
$test_variable = HTML::link('/','На главную');
а затем отдавать это в вид, потому как данные будут совершенно разного плана.
В контроллере я хочу брать шаблон вида из базы данных, передать ему нужные данные и отправить все это рендериться в вид для вставки в базовый layout.
На данный момент я мыслю, что нужно немного покумекать с наследованием либо от класса вида, либо от класса блейда.
Поэтому, повторюсь, перед тем как изобретать велосипед, хотел узнать может кто уже сталкивался с подобной задачей и знает в какую сторону копать. Может бандл какой есть. Может где функцию в документации просмотрел.
Не может быть, что бы мне одному пришла в голову столь извращенная идея.
Еще, размышляя на данную тему, в голову пришла мысль использовать сторонний шаблонизатор позволяющий выполнить подобное. Но раз в Laravel уже есть собственный шаблонизатор хотелось бы использовать именно его, даже если для этого придется немного поизвращаться.
На крайняк, неким ветиеватым способом брать шаблон из базы данных и подсовывать его в шаблонизатор в виде рhp-файла (*.blade.php). Но это просто как один из возможных вариантов рассматриваемых в последнюю очередь.
В общем, что думаете по этому поводу?
Изменено samssrus (12.02.2013 15:52:52)
Не в сети
- Шаблоны Blade хорошая штука, но я хотел бы хранить их не отдельными файлами, а записями в базе данных.
Ну так напиши свой обработчик события PHPView::loader
(который по умолчанию вызывает PHPView::file()
) — пусть он грузит их не из файла, а из БД. Изменять код, использующий шаблоны, не потребуется.
Другое дело, что PHPView::loader
возвращает не строку-шаблон, а путь к файлу шаблона, поэтому всё равно придётся сохранять их из БД на диск. Для высоконагруженных приложений это плохое решение. Это ограничение Laravel, обойти можно только не используя стандартный класс PHPView
.
Кроме этого нужно будет сохранить умолчательный обработчик, чтобы загружать файлы сначала с диска, а потом из БД — ведь не все шаблоны в ней будут (пакеты, например, могут их иметь на диске).
Если это то, что требуется, могу набросать простой пример обработчика.
Не в сети
Proger_XP, благодарю за совет.
В классе View я уже почти присмотрел хорошее место чтобы реализовать задуманное. Буду мастерить.
Не в сети
Страницы 1