Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 11.02.2013 20:40:20

samssrus
Откуда: Moscow
Сообщений: 3

Blade шаблоны из базы данных

Доброго времени суток.
Подскажите в какую сторону копать по следующему вопросу.

Есть файл базового шаблона (layout) views/layouts/main.blade.php:

PHP
<html>
<
body>
    @yield(
'content')
</
body>
</
html>

Есть шаблон конкретной страницы views/page/index.blade:

PHP
@layout('layouts.main')
@
section('content')
    {{ 
$test_variable }}
@
endsection

Для примера, в action некоторого контроллера (или в routes) выполняется следующее:

PHP
return View::make('page.index',array('test_variable'=>$test_variable));

Все работало замечательно до тех пор пока…
… не столкнулся с необходимостью передать через $test_variable конструкцию шаблона типа такой:

PHP
{{ HTML::link('/','На главную') }}

По задумке хочу хранить шаблоны в базе данных.

Естественно вместо ожидаемой ссылки (<a href="/">На главную</a>) получил то, что передал…

Отсюда вопрос: — Как?
Возможно, где-то в документации просмотрел какой метод… ткните пальцем.
С другой стороны, понимаю, что это echo и вряд ли в лоб можно реализовать задуманное. Не хотелось бы городить огород и изобретать велосипед.
Поэтому, прошу подсказать идею как лучше реализовать задуманное.
Заранее благодарю.

Не в сети

#2 12.02.2013 00:40:30

Re: Blade шаблоны из базы данных

Из описания проблемы мало что понятно.

  1. получил то, что передал…

То есть сроку {{ HTML::link('/','На главную') }}, как она есть?

А PHP$test_variable в примере 3 — это строка {{ HTML::link('/','На главную') }}?

Если так, то разумеется, что она выводится как есть. Шаблон компилируется в обычный PHP-код вида:

PHP
...layout('layouts.main')
...section('content')
    <?php echo $test_variable?>
...endsection

Поэтому содержимое переменной просто выводится. Если хочется, чтобы вывелась ссылка — так надо выполнить функцию и передать её результат, а не сам код в виде Blade:

PHP
$test_variable HTML::link('/','На главную');
return 
View::make('page.index',array('test_variable'=>$test_variable));

Не в сети

#3 12.02.2013 15:50:10

samssrus
Откуда: Moscow
Сообщений: 3

Re: Blade шаблоны из базы данных

Прошу прощения за корявость изложения и постановки задачи.

Я с Laravel ознакомился не так давно и простота работы с некоторыми вещами меня подкупила.
Поэтому и хотел узнать, возможно ли отделаться «малой кровью» за реализацию задуманного.

Шаблоны Blade хорошая штука, но я хотел бы хранить их не отдельными файлами, а записями в базе данных.
То есть, если у меня был файл, например, index.blade.php с совершенно различным содержимым:

PHP
@layout('layouts.main')
@
section('content')
    <
p>здесь просто текст</p>
    <
p>тут ссылки:</p>
    {{ 
HTML::link('/','На главную') }}
    <
p>здесь форма:</p>
    {{ 
Form::open('/') }}
    ...

    <
p>здесь данные из базы данных</p>
    @foreach(
$pages as $page)
    ...
@
endsection

Я бы хотел поместить его в базу данных, а в нужный момент в контроллере сделать нечто подобное:

PHP
return OtherView::make(шаблон_из_бдданные_в_шаблон));

Мне бы не хотелось компилировать что-либо в контроллере:

PHP
$test_variable HTML::link('/','На главную');

а затем отдавать это в вид, потому как данные будут совершенно разного плана.

В контроллере я хочу брать шаблон вида из базы данных, передать ему нужные данные и отправить все это рендериться в вид для вставки в базовый layout.
На данный момент я мыслю, что нужно немного покумекать с наследованием либо от класса вида, либо от класса блейда.
Поэтому, повторюсь, перед тем как изобретать велосипед, хотел узнать может кто уже сталкивался с подобной задачей и знает в какую сторону копать. Может бандл какой есть. Может где функцию в документации просмотрел.
Не может быть, что бы мне одному пришла в голову столь извращенная идея.

Еще, размышляя на данную тему, в голову пришла мысль использовать сторонний шаблонизатор позволяющий выполнить подобное. Но раз в Laravel уже есть собственный шаблонизатор хотелось бы использовать именно его, даже если для этого придется немного поизвращаться.

На крайняк, неким ветиеватым способом брать шаблон из базы данных и подсовывать его в шаблонизатор в виде рhp-файла (*.blade.php). Но это просто как один из возможных вариантов рассматриваемых в последнюю очередь.

В общем, что думаете по этому поводу?

Изменено samssrus (12.02.2013 15:52:52)

Не в сети

#4 12.02.2013 21:31:28

Re: Blade шаблоны из базы данных

  1. Шаблоны Blade хорошая штука, но я хотел бы хранить их не отдельными файлами, а записями в базе данных.

Ну так напиши свой обработчик события PHPView::loader (который по умолчанию вызывает PHPView::file()) — пусть он грузит их не из файла, а из БД. Изменять код, использующий шаблоны, не потребуется.

Другое дело, что PHPView::loader возвращает не строку-шаблон, а путь к файлу шаблона, поэтому всё равно придётся сохранять их из БД на диск. Для высоконагруженных приложений это плохое решение. Это ограничение Laravel, обойти можно только не используя стандартный класс PHPView.

Кроме этого нужно будет сохранить умолчательный обработчик, чтобы загружать файлы сначала с диска, а потом из БД — ведь не все шаблоны в ней будут (пакеты, например, могут их иметь на диске).

Если это то, что требуется, могу набросать простой пример обработчика.

Не в сети

#5 13.02.2013 15:49:16

samssrus
Откуда: Moscow
Сообщений: 3

Re: Blade шаблоны из базы данных

Proger_XP, благодарю за совет.
В классе View я уже почти присмотрел хорошее место чтобы реализовать задуманное. Буду мастерить.

Не в сети

Подвал раздела