Большинство функций в хелпере используют теги, определенные в файле под названием tags.ini.php. В основной конфигурации Cake содержится tags.ini.php, но если вы хотите внести какие-то изменения, создайте копию /cake/config/tags.ini.php и поместите ее в ваш каталог /app/config/. Хелпер использует теги, определенные в этом файле чтобы сгенерировать теги, которые вы запросили. Использования HTML Хелпера может быть полезным для создания некоторого кода для ваших отображений, также изменения в файле tags.ini.php выплывут в изменениях каскада сайта.
К тому же, если AUTO_OUTPUT имеет значение true в основном конфиг-файле вашего приложения (/app/config/core.php), хелпер будет автоматически выводить теги, а не возвращать значения. Это попытка удовлитворить тех, кто не любит короткие теги (<?= ?>) или множество запросов echo() в своих кодах отображений. Функции включающие параметр $return позволяют вам принудительно заменять настройки в вашем центральном конфиге. Установите $return true если хотите, чтобы хелпер возвратил HTML код не обращая внимания ни на какие настройки AUTO_OUTPUT.
Функции HTML Хелпера также включают в себя параметр $htmlAttributes, который позволяет вам присоединять дополнительные атрибуты к вашим тегам. Например, если у вас есть тег, к которому вы хотите добавить атрибут class, вы вставляете его в переменную $htmlAttribute как значение:
array('class'=>'someClass')
Действие редактирования в NotesController<?
function edit($id) {
// Во-первых, давайте проверим отправлены ли данные из формы // в действие.
if (!empty($this->data['Note'])) {
// Вот здесь мы пытаемся проверить данные формы // и сохранить их
if ($this->Note->save($this->data['Note'])) {
// Если мы успешно сохранили, отправляем пользователя // в подходящее место
$this->flash('Your information has been saved.', '/notes/edit/' . $id); exit();
}
else
{
// Генерируем сообщения об ошибках для подходищих полей // это не обязательно, посколько сохранение это уже сделало, но это пример
//вызываем $this->Note->validates($this->data['Note']); если вы не делаете сохранения
//затем используем метод ниже, чтобы заполнить метод хелпера tagErrorMsg()
$this->validateErrors($this->Note);
//И рендерим редактированный код отображения
$this->render(); }
}
//Если мы не получили никаких данных из формы, берем заметку, которую хотим редактировать, и отправляем //эту информацию в отображение
$this->set('note', $this->Note->find("id = $id"));
$this->render(); }
?>
Раз уж мы настроили наш контроллер, давайте посмотрим на код отображения (который можно найти в app/views/notes/edit.thtml). Наша модель Заметки достаточно простая на этом этапе, поскольку включает в себя только id. Этот код отображения подразумевает отображение данных заметки и позволяет пользователю вводить новые заничения и сохранять эти данные в модель.
HTML Хелпер доступен во всех отображениях по умолчанию, можно получить доступ используя $html.
Давайте просто взглянем на таблицу, где находятся все внутренности формы:
Образец кода отображения редактирования(edit.thtml)
<!-- Этот тег создает тег нашей формы --><?php echo $html->formTag('/notes/edit/' . $html->tagValue('Note/id')?>
<table cellpadding="10" cellspacing="0">
<tr>
<td align="right">Body: </td>
<td>
<!-- Вот где мы используем HTML Хелпер чтобы отрендерить тег
textarea и его возможные сообщения об ошибках
переменная $note была создана контроллером, и местит
данные для заметки, которую мы редактируем. -->
<?php echo
$html->textarea('Note/body', array('cols'=>'60', 'rows'=>'10'));
?>
<?php echo $html->tagErrorMsg('Note/body',
'Please enter in a body for this note.') ?>
</td>
</tr>
<tr>
<td></td>
<td>
<!-- Мы также можем использовать HTML Хелпер чтобы включить
спрятанные теги внутрь нашей таблицы -->
<?php echo $html->hidden('Note/id')?>
<?php echo $html->hidden('note/submitter_id', $this->controller->Session->read('User.id'))?>
</td>
</tr>
</table>
<!--И наконец подтверждающая кнопка-->
<?php echo $html->submit()?>
</form>
Большинство функций генерирования тегов (вместе с tagErrorMsg) обязывают вас включать $fieldName. Эта $fieldName позволяет Cake узнавать какие данные вы вставляете, так что он может проверить и сохранить данные коректно. Строка вставленная в параметр $fieldName находится в модели формы «modelname/fieldname». Если вы собираетесь добавить новое поле title в нашу Заметку, вы можете добавить в отображение что-то вроде этого:
<?php echo $html->input('Note/title') ?><?php
echo $html->tagErrorMsg('Note/title', 'Please supply a title for this note.')?>
Сообщения об ошибках отображаются функцией tagErrorMsg() согласно <div class="error_message"></div> для простоты CSS стайлинга.
Вот теги формы, которые HTML хелпер может сгенерировать (большинство из них прямолинейны):
HTML Хелпер также включает набор функций которые помогают в создании тегов, относящихся к датам. С параметром $tagName следует обращаться также как и с параметром $fieldName. Просто предоставьте имя поля, к которому относиться этот тег работы с датой(date option tag). Когда данные обработаются, вы увидите это в вашем контроллере с частью данных, которыми он управляет до конца имени поля. Например, если в моих Заметках есть поле завершения срока, и мой dayOptionTag, параметр $tagName, имеет значение 'note/deadline', данные дня будут показаны в переменной $params, когда данные из формы отправлены в действие контроллера:
$this->data['Note']['deadline_day']
Потом вы можете воспользоваться этой информацией, чтобы перевести дату в формат, который соответствует настройкам вашей базы данных. Этот код помещается как раз перед попыткой сохранить данные, и сохраненные данные из масива $data используются для сохранения информации в модель.
Перевод даты перед сохранением модели (выдержка из NotesController)<?
function edit($id) {
//Во-первых, давайте проверим были ли посланы какие-то данные из формы в действие.
if (!empty($this->data['Note'])) {
//Перевод даты для хранения...
$this->data['Note']['deadline'] =
$this->data['Note']['deadline_year'] . "-" .
$this->data['Note']['deadline_month'] . "-" .
$this->data['Note']['deadline_day'];
//Вот где мы пытаемся проверить данные формы (см. Главу 10) и сохранить их
if ($this->Note->save($this->data['Note'])) {
...
?>
Большинство функций этого хелпера подразумевают использование особого масива $options как параметра. Этот масив используется для определения разных вещей об операциях Ajax. Вот разные значения, которые вы можете определить:
Вот функции хелпера для того, чтобы сделать Ajax в Cake легким и быстрым:
<?function autocomplete (){
$this->set('posts',
$this->Post->findAll(
"subject LIKE '{$this->data['Post']['subject']}'") );
$this->layout = "ajax";}
?>
А ваше отображения для действия autocomplete() будет выглядить так:
<ul><?php foreach($posts as $post): ?>
<li><?php echo $post['Post']['subject']; ?></li><?php endforeach; ?>
</ul>
Фактическое поле авто-завершения, как оно будет выглядить в отображении, будет выглядить так:
<form action="/users/index" method="POST"> <?php echo $ajax->autoComplete('Post/subject', '/posts/autoComplete')?>
<?php echo $html->submit('View Post')?></form>
Функция autoComplete() использует информацию, чтобы отрендерить тектовое поле, и некоторые разделы, которые будут использованы, чтобы показать условия автозавершения, поддерживаемые вашим действием. Может вы захотите стилизировать отображение чем-то вроде следующего:
<style type="text/css">
div.auto_complete {
position :absolute;
width :250px;
background-color :white;
border :1px solid #888;
margin :0px;
padding :0px;
}
li.selected { background-color: #ffb; }
</style>
// (The version numbers refer to script.aculo.us versions)<?
$options
['handle'] // (v1.0) Устанавливает должен ли элемент быть // доступным для перестасикания только внедреным манипулятором.Значение должно быть
//ссылкой на жлемент или id элемента.
$options['handle'] // (V1.5)Как и выше, кроме того, что теперь значение может быть // строкой ссылающейся на значение класса CSS. string referencing a CSS class value. Первый
// найденный элемент child/grandchild/etc. у которого есть
// это значение класса CSS будет использован
// как манипулятор.
$options['revert'] // (V1.0) Если установленно true, то элемент будет возвращаться // на свою исходную позицию по окончанию перетаскивания.
$options['revert'] // (V1.5) Revert также может быть произвольно-вызванной, по окончанию // перетаскивания, функцией.
$options['constraint'] //Если установлено horizontal или vertical,перетаскивание // будет принудительно производится токо по горизонтали
//или по вертикали.
?>
Делает DOM элемент с ID $id доступным к бросанию (drop). Вот некоторые дополнительные вещи, которые вы можете определить используя $options:
<?$options
['accept'] // Устанавливает доступ строкам или масиву строк JavaScript, // которые описывают классы CSS. Доступность к броску
// будет приниматься только от доступных к перетаскиванию элементов
//содержащих один или больше из этих классов CSS.
$options['containment'] // Элементы доступные к броску будут принимать только // элементы доступные к перетаскиванию, которые содержат один из данных
// id элементов (или элемента). Может быть один элемент
// или масив элементов JS.
$options['overlap'] //Если установлено horizontal или vertical, доступные к бросанию // будут только реагировать на элементы доступые к перетаскиваниюif its
//если покрытие больше 50% в данном направлении.
?>
<?$options
['tag'] // Устанавливает вид тега (дочерних элементов // контейнера) который будет сделан сортируемым. Для UL и
// OL контрейнеров, это LI, вам нужно предоставить
// вид тега для других видов дочених тегов.
// По умолчанию 'li'.
$options['only'] //Дальнейшее ограничение выбора дочерних элементов // элементами с данным классом CSS
// (или, если вы предоставите масив строк, любым из
// классов).
$options['overlap'] // Либо vertical(по-умолчанию) или horizontal. // Для плавающих сортировок или горизонтальных списков, выбирете
// horizontal. Для вертикальных списков используйте vertical.
$options['constraint'] // Ограничивает передвижения элементов доступных к перетаскиванию, // 'vertical' или 'horizontal'.
$options['containment'] // Включает возможность перетаскивания и бросания между сортируемыми. // Беперт масив элементов или id-номеров элементов (из
// контейнера).
$options['handle'] // Заствялет созданные доступные к перетаскиванию элементы, использовать манипуляторы, // смотрите опцию handle в drag().
?>
Даты могут быть предоставлены во все функции как действительные строки времени-даты PHP или временные отметки Unix.
Возвращает временную отметку UNIX, данную как временную отметку UNIX или существующую строку даты strtotime().
Cache
Расширение класса Хелпера Cake
Скажем нам захотелось создать хелпер, который можно использовать для извлечения стилизованных ссылок CSS, которые нам нужны в приложении. Чтобы добавить свой код в существующую структуру хелпера Cake, нам понадобится создать новый класс в /app/views/helpers. Давайте назовем наш хелпер Link Helper. Тогда файл класса PHP будет выглядить так:
/app/views/helpers/link.php<?
class LinkHelper extends Helper{ function
makeEdit($title, $url) {
//Здесь идет код создания специально-отформатированной ссылки...
}}
?>
Вот несколько функций, которые включает в себя класс хелпера Cake, которые вам могут пригодиться:
Давайте используем output() чтобы отформатировать наш титул и ссылку и вернуть их в отображение.
/app/views/helpers/link.php (код добавлен)<?
class LinkHelper extends Helper{ function
makeEdit($title, $url) {
// Используем функцию извлечения хелпера чтобы вернуть // форматированные данные обратно в отображение:
return $this->output("<div class=\"editOuter\"><a href=\"$url\" class=\"edit\">$title</a></div>"); }
}
?>
/app/views/helpers/link.php (использование других хелперов)<?
class LinkHelper extends Helper{ var
$helpers = array('Html'); function
makeEdit($title, $url) {
// Используем HTML Хелпер для извлечения // форматированных данных:
$link = $this->Html->link($title, $url, array('class' => 'edit')); return
$this->output("<div class=\"editOuter\">$link</div>"); }
}
?>
<?class ThingsController{ var
$helpers = array('Html', 'Link');}
?>
Не забудьте включить HTML хелпер в масив если планируете его где-то использовать. Схема присвоения имен та же, что и у моделей.