set() метод – это основной способ передачи данных из контроллера в отображение. После вызова функции set() указанная переменная будет доступна в отображении.
<?php
//Сначала вы передаете данные из контроллера:$this->set('color', 'розовую');//Затем, в отображении вы можете использовать данные:?>Вы выбрали <?php echo $color; ?> сахарную глазурь для кекса.
Функция set() также может принимать массив в качестве первого параметра. Часто это может быть быстрым способом для передачи большого количества информации в отображение.
Индексы массива будут преобразованы при передаче в отображение ('underscored_key' станет 'underscoredKey', и т.д.):
<?php
$data
= array(
'color' => 'розовый',
'type' => 'сахар',
'base_price' => 23.95);//сделаем $color, $type, and $basePrice //доступными в отображении:
$this->set($data); ?>
Функция render() автоматически вызывается в конце каждого запрошенного действия контроллера. Этот метод выполняет вывод отображения (используя данные, которые вы передали с помощью функции set()), размещает отображение внутри макета и выводит его для пользователя.
Файл отображения по умолчанию, используемый функцией render(), определен соглашением. Если запрошено действие search() контроллера RecipesController, то файл отображения в /app/views/recipes/search.ctp будет визуализирован.
<?phpclass RecipesController extends AppController {...
function
search() {
// Рендерит отображение /views/recipes/search.ctp
$this->render(); }
...
}
?>
CakePHP будет автоматически вызывать render после каждого действия (пока не установите $this->autoRender = false). Вы можете использовать это для назначения альтернативного файла отображения, присвоив в контроллере переменной $action нужное имя действия.
Если $action начинается с '/', значит предполагается файл отображения из каталога /app/views. Это позволяет напрямую рендерить элементы, что очень полезно при ajax вызовах.
// Рендерит элемент в /views/elements/ajaxreturn.ctp$this->render('/elements/ajaxreturn');
Вы так же можете определить другой файл отображения, используя третий параметр $file. Когда используете $file, не забывайте употреблять глобальные константы CakePHP (например, VIEWS).
Параметр $layout позволяет определить макет в который будет рендериться отображение.
Метод, который вы будете использовать чаще всего – это redirect(). Эта функция берет первый параметр в виде родственного CakePHP URL.
Когда пользователь успешно выполнил заказ, вы возможно пожелаете перенаправить его в окно с информацией о получении продукции.
<?phpfunction placeOrder() {
//Логика завершения заказа представлена здесь
if($success) {
$this->redirect(array('controller' => 'orders', 'action' => 'thanks')); } else {
$this->redirect(array('controller' => 'orders', 'action' => 'confirm')); }
}
?>
Второй параметр redirect() позволяет вам определить HTTP статус-код, сопровождающий перенаправление. Возможно, вы захотите использовать 301 (удален навсегда) или 303 (смотри другое), в зависимости от вида перенаправления.
Метод будет выполнять exit() после перенаправления, пока вы не передаете третьим параметром false.
Подобно redirect(), функция flash() используется для направления пользователя на новую страницу после выполнения операции. Отличие flash() в том, что он показывает сообщение перед отправлением пользователя по другому URL.
Первый параметр должен содержать сообщение, которое требуется вывести. Второй параметр – CakePHP-родственный URL. CakePHP выведет $message на $pause секунд перед перенаправлением пользователя.
Для внутристраничных flash-сообщений смотрите SessionComponent setFlash() функцию.
CakePHP контроллеры снабжены колбеками (callback – обратный вызов). Вы можете использовать их для вставки некоторого кода, который будет выполняться перед или после выполнения действия контроллера.
Эта функция выполняется перед каждым действием контроллера. Это удобное место для проверки активной сессии или прав пользователя.
Вызывается после выполнения логики действия, но перед вызовом отображения. Этот колбек не так часто используется, но может понадобиться, если вы вызываете вручную рендеринг до завершения действия.
Вызывается после каждого действия контроллера.
Вызывается после выполнения действия и отображения.
CakePHP также поддерживает колбеки, относящиеся к скаффолдингу.
$method – имя вызванного метода, например index, edit, и т.д.
$method – имя вызванного метода, или edit, или update.
$method – имя вызванного метода, или edit, или update.
$method – имя вызванного метода, например index, edit, и т.д.
Этот метод загружает модели, требуемые контроллером. Этот процесс и так выполняется CakePHP, но метод удобен, когда идет обращение к контроллеру извне. Например, вам понадобится CakePHP в скрипте, выполняемом из командной строки или в другом варианте внешнего использования. В этом случае constructClasses() будет кстати.
Возвращает URL реферера для текущего запроса.
Используется для сообщения браузеру пользователя не кэшировать результаты текущего запроса. Это отличается от кэширования отображения, об этом будет рассказано далее.
Используйте этот метод для того, чтобы получить отправленные модели данные (из HtmlHelper-совместимых инпутов) и использовать их в качестве условия для функции find.. Метод postConditions позволяет быстро создать поисковую логику. Например, пользователь-администратор хочет получать из заказов информацию, чтобы знать какой товар надо отгружать. Вы можете использовать FormHelper и HtmlHelper, чтобы быстро создать форму для модели Order. Далее действие контроллера может использовать данные из формы в качестве условия поиска:
<?phpfunction index() {
$o = $this->Order->findAll($this->postConditions($this->data));
$this->set('orders', $o);}
?>
Если $this->data['Order']['destination'] равно Old Towne Bakery, postConditions преобразует это условие в массив, подходящий для использования в Model->findAll(). В данном случае, array("Order.destination" => Old Towne Bakery).
Если вы хотите использовать другой SQL-оператор, то передавайте его вторым параметром.
<?php/*содержимое $this->data
array(
'Order' => array(
'num_items' => '4',
'referrer' => 'Ye Olde'
)
)
*/
//Давайте получим заказы, в которых минимум 4 позиции и содержащие 'Ye Olde'
$o = $this->Order->findAll($this->postConditions(
$this->data, array(
'>=', 'LIKE')));
?>
Операторы нужно передавать в порядке, соответствующем, размещению элементов в массиве $this->data. Поскольку num_items – первый элемент, то оператор '>=' относится к нему.
Третий параметр позволяет сообщить CakePHP какой логический SQL оператор следует использовать между условиями поиска. Для этого используйте строки 'AND', 'OR' и 'XOR'.
В завершение, если последний параметр установлен в true, и $op параметр является массивом, то поля, не включенные в $op, не будут включены в возвращаемое условие.
Этот метод используется для постраничной разбивки данных, выбранных вашей моделью. Вы можете установить количество страниц, условия выборки для модели и другое. Читайте далее в руководстве детали использования метода paginate.
Эта функция вызывает действие контроллера из любого места и возвращает данные после выполнения этого действия. $url CakePHP-родственный URL (/controllername/actionname/params). Дополнительные данные для получающего действия передавайте через массив $options.
Вы можете использовать requestAction() для получения полностью выполненного отображения, передав 'return' в $options: requestAction($url, array('return'));
Использование requestAction без кэширования приводит к низкой производительности. Этот метод редко подходит для использования в модели или контроллере.
requestAction лучше всего использовать в связке с кэшированными элементами – как способ выборки данных для элемента перед отображением. Давайте рассмотрим пример вставки элемента latest comments в макет. Во-первых, мы должны создать функцию контроллера, которая вернет данные.
<?php// controllers/comments_controller.phpclass CommentsController extends AppController { function
latest() { return
$this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10)); }
}
?>
Если мы сейчас создадим простой элемент для вызова функции:
<?php// views/elements/latest_comments.ctp$comments = $this->requestAction('/comments/latest');foreach(
$comments as $comment) { echo
$comment['Comment']['title'];}
?>
Мы теперь можем разместить этот элемент где угодно для вывода данных:
<? echo $this->element('latest_comments'); ?>
Таким образом, когда бы элемент не вызывался, будет сделан запрос контроллеру получить данные. Однако, согласно предупреждению, лучше использовать кэширование, для предотвращения излишней нагрузки. Модифицируем вызов элемента таким образом:
<? echo $this->element('latest_comments', array('cache'=>'+1 hour')); ?>
В дополнение, requestAction теперь принимает массив в стиле cake-url:
<? echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured'), array('return')); ?>
Это позволит requestAction делать вызов в обход Router::url, что увеличит скорость выполнения. Url массивы, это тоже самое, что использует HtmlHelper::link с одной разницей. Если вы используете параметр с именем в вашем url, то requestAction url массив должен завернуть названный параметр в индекс 'named'. Поэтому requestAction соединяет названный параметр таким образом Controller::params.
<? echo $this->requestAction('/articles/featured/limit:3'); ?>
В виде массива requestAction получится следующее:
<? echo $this->requestAction(array('controller' => 'articles', 'action' => 'featured', 'named' => array('limit' => 3))); ?>
В отличие от других мест, где url-массивы аналогичны url-строкам, requestAction обрабатывает их по разному.
Когда используете url-массив в связке с requestAction() вы должны определить все параметры которые вам могут понадобиться в запрашиваемом действии. Включая параметры типа $this->data и $this->params['form'].