Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
CakePHP: Manual/Developing/Controllers/Methods ...

Методы контроллера



set

set(string $var, mixed $value)

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

render(string $action, string $layout, string $file)

Функция render() автоматически вызывается в конце каждого запрошенного действия контроллера. Этот метод выполняет вывод отображения (используя данные, которые вы передали с помощью функции set()), размещает отображение внутри макета и выводит его для пользователя.


Файл отображения по умолчанию, используемый функцией render(), определен соглашением. Если запрошено действие search() контроллера RecipesController, то файл отображения в /app/views/recipes/search.ctp будет визуализирован.


<?php
class 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

redirect(string $url, integer $status, boolean $exit)

Метод, который вы будете использовать чаще всего – это redirect(). Эта функция берет первый параметр в виде родственного CakePHP URL.
Когда пользователь успешно выполнил заказ, вы возможно пожелаете перенаправить его в окно с информацией о получении продукции.


<?php
function placeOrder() {

    
//Логика завершения заказа представлена здесь

    
if($success) {
        
$this->redirect(array('controller' => 'orders''action' => 'thanks'));
    } else {
        
$this->redirect(array('controller' => 'orders''action' => 'confirm'));
    }  
}
?>


Второй параметр redirect() позволяет вам определить HTTP статус-код, сопровождающий перенаправление. Возможно, вы захотите использовать 301 (удален навсегда) или 303 (смотри другое), в зависимости от вида перенаправления.


Метод будет выполнять exit() после перенаправления, пока вы не передаете третьим параметром false.


flash

flash(string $message, string $url, integer $pause)

Подобно redirect(), функция flash() используется для направления пользователя на новую страницу после выполнения операции. Отличие flash() в том, что он показывает сообщение перед отправлением пользователя по другому URL.


Первый параметр должен содержать сообщение, которое требуется вывести. Второй параметр – CakePHP-родственный URL. CakePHP выведет $message на $pause секунд перед перенаправлением пользователя.


Для внутристраничных flash-сообщений смотрите SessionComponent setFlash() функцию.


Callbacks


CakePHP контроллеры снабжены колбеками (callback – обратный вызов). Вы можете использовать их для вставки некоторого кода, который будет выполняться перед или после выполнения действия контроллера.


beforeFilter()

Эта функция выполняется перед каждым действием контроллера. Это удобное место для проверки активной сессии или прав пользователя.


beforeRender()

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


afterFilter()

Вызывается после каждого действия контроллера.


afterRender()

Вызывается после выполнения действия и отображения.


CakePHP также поддерживает колбеки, относящиеся к скаффолдингу.


_beforeScaffold($method)

$method – имя вызванного метода, например index, edit, и т.д.


_afterScaffoldSave($method)

$method – имя вызванного метода, или edit, или update.


_afterScaffoldSaveError($method)

$method – имя вызванного метода, или edit, или update.


_scaffoldError($method)

$method – имя вызванного метода, например index, edit, и т.д.



Другие полезные методы

constructClasses


Этот метод загружает модели, требуемые контроллером. Этот процесс и так выполняется CakePHP, но метод удобен, когда идет обращение к контроллеру извне. Например, вам понадобится CakePHP в скрипте, выполняемом из командной строки или в другом варианте внешнего использования. В этом случае constructClasses() будет кстати.

referer


Возвращает URL реферера для текущего запроса.

disableCache


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

postConditions


postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

Используйте этот метод для того, чтобы получить отправленные модели данные (из HtmlHelper-совместимых инпутов) и использовать их в качестве условия для функции find.. Метод postConditions позволяет быстро создать поисковую логику. Например, пользователь-администратор хочет получать из заказов информацию, чтобы знать какой товар надо отгружать. Вы можете использовать FormHelper и HtmlHelper, чтобы быстро создать форму для модели Order. Далее действие контроллера может использовать данные из формы в качестве условия поиска:


<?php
function 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


Этот метод используется для постраничной разбивки данных, выбранных вашей моделью. Вы можете установить количество страниц, условия выборки для модели и другое. Читайте далее в руководстве детали использования метода paginate.


requestAction


requestAction(string $url, array $options)

Эта функция вызывает действие контроллера из любого места и возвращает данные после выполнения этого действия. $url CakePHP-родственный URL (/controllername/actionname/params). Дополнительные данные для получающего действия передавайте через массив $options.


Вы можете использовать requestAction() для получения полностью выполненного отображения, передав 'return' в $options: requestAction($url, array('return'));


Использование requestAction без кэширования приводит к низкой производительности. Этот метод редко подходит для использования в модели или контроллере.


requestAction лучше всего использовать в связке с кэшированными элементами – как способ выборки данных для элемента перед отображением. Давайте рассмотрим пример вставки элемента “latest comments” в макет. Во-первых, мы должны создать функцию контроллера, которая вернет данные.


<?php
// controllers/comments_controller.php
class 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'].


<< Переменный контроллера | Компоненты >>


 
Комментарии
конечно это облегчает представление, но как работу над кодом замедляет( Блин не люблю ООП, рабские языки. Но надо учить, что делать.
ip-84-133.dnepro.net (2011-12-06 18:10:20)
OOP – нормальный стиль, просто некоторые разработчики чрезмерно увлекаются «самореализацией», вместо построения адекватной архитектуры и удобного интерфейса.
46.211.219.152 (2012-01-24 12:15:11)
Добавить комментарий:

Файлы [Скрыть файлы/форму]