Контактная информация            Баг трекер            Предложение хостинг-провайдерам

Использование stub-блоков в Open Constructor

Игорь Бронников (ne0d1n) Автор: Игорь Бронников (ne0d1n)
Дата: 7 сентября 2007
Рубрика: How-to

Stub-блоки — одна из очень гибких особенностей Open Constructor, и небольшой пример, который мы разберем, это покажет.

Что же такое stub-блок? Чем он отличается от обычного блока?

Обычные блоки в шаблонах страниц задаются так:

{run_block id=head}

Объект, размещенный в таком блоке, осуществит выборку данных и выведет эти данные, используя соответствующий шаблон.

Stub-блоки в шаблонах страниц задаются так:

{def_block id=stub1}

Stub-блоки отличаются от обычных тем, что объект, который находится в stub блоке загружается (т. е. осуществляет выборку данных), но не запускается (не осуществляет вывод  этих данных).

Где это можно использовать?

Приведем простой пример.

На сайте есть список открытых вакансий. Вакансии реализованы гостевой книгой, где в поле Тема (subject) лежит наименование вакансии, а в контенте (content) — требования к вакансии.  Остальные поля гостевой книги мы использовать не будем.

Итак, список вакансий есть. Как и где их выводить, мы обсуждать не будем, чтобы не уйти в сторону от основной темы.

Теперь на сайте нужна форма, в которой можно предложить свою кандидатуру на одну из вакансий. В форме будут поля, которые реализуются элементарно, такие как: имя, e-mail, телефон.

Но как быть со списком вакансий (drop-box)?

Данные для этого списка  можно получить из списка вакансий. Вот тут нам и пригодится stub-блок.

Идея такая: на странице с формой будут 2 объекта:  первый объект — список вакансий, который будет находиться в stub-блоке, второй объект — форма подачи заявки, которая будет находиться в обычном блоке.

Как это делается:

В шаблоне страницы поместим где-нибудь в самом начале шаблона определение блока {def_block id=stub1}

Далее  создадим объект «список всех сообщений», который будет помещен в этот блок на странице с формой. Шаблон объекта создадим такой:

 

{foreach from=$messages item=message}
 <option>{$message.subject}</option>
{/foreach}

 

Поскольку объект «список вакансий» будет находиться в stub-блоке на странице с формой, он загрузит данные о вакансиях, но не выведет его. Мы выведем его в другом месте. В шаблоне формы.

Саму форму реализуем «включением шаблона».

Код шаблона будет такой:

{set cid = $ctx->newCaptchaId()}
<form method="post" action="sent/?cid={$cid}" enctype="multipart/form-data">

     Имя<br>
     <input type="text" name="name" value="{$smarty.get.name|escape}"><br>
     {if $smarty.get.failed.name}<div class=error>{$smarty.get.failed.name}</div>{/if}
       
     <br>
     E-mail<br>
     <input type="text" name="email" value="{$smarty.get.email|escape}"><br>
     {if $smarty.get.failed.email}<div class=error>{$smarty.get.failed.email}</div>{/if}
       
     <br>
     Телефон<br>
     <input type="text" name="phone" value="{$smarty.get.phone|escape}"><br>
     {if $smarty.get.failed.phone}<div class=error>{$smarty.get.failed.phone}</div>{/if}
       
     <br>
     Вакансия<br>
     <select name="vacancy">{run_block id=stub1}</select><br>
       
     <br>
     Файл с резюме<br>
     <input type="file" name="attachment"><br>
     <small>Принимается файлы в форматах doc, pdf, размером не более 500Кб</small><br>
       
     <br>
     <img class=captcha src="/res/captcha/{$cid}.png" onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date()).getTime();"><br>
     <small>Введите символы, которые Вы видите на картинке.</small><br>
     <input type="text" name="f_cid" value="" size="6">
     {if $smarty.get.failed.f_cid}<div class=error>{$smarty.get.failed.f_cid}</div>{/if}
     <br><br>
     <input type="submit" value="Отправить">
</form>


Как видно в коде,  внутри  тега <select> поля «Вакансия» стоит блок {run_block id=stub1}, который и выведет данные из stub-блока stub1.

Комментарии

RSS RSS
ButscH, 21 августа 2009
Не мешало бы добавить что у {run_block} есть параметр comment, т.е. чтобы убрать в шаблоне название объекта при генерации страницы.

{run_block id=... comment=0}

Добавить комментарий

Имя:     Email:
Комментарий:
Введите символы, которые видите на картинке.
Если символы неразборчивы, кликните по картинке несколько раз.