У меня есть приложение CakePHP, которое в какой-то момент покажет представление с медиафайлами продукта (изображениями или видео). Я хочу знать, есть ли способ включить другое представление, которое угрожает видео или изображениям, в зависимости от флага. Я хочу использовать эти «маленькие представления» для нескольких других целей, поэтому он должен быть «похожим» на компонент торта для повторного использования.
Что вы, ребята, предлагаете использовать в соглашениях Cake (а не использовать необработанную команду include(''))
@FernandoBarrocal: это обновленная ссылка для версии 2.X book.cakephp.org/2.0/en/views.html#elements
Есть ли способ включить несколько макетов в основной макет, аналогично в WordPress есть функция get_template_part()






В интересах получения информации здесь на случай, если кто-то наткнется на это, важно отметить, что решение зависит от версии CakePHP.
$this->renderElement('display', array('flag' => 'value'));
на ваш взгляд, а затем в /app/views/elements/ вы можете создать файл с именем display.thtml, где $flag будет иметь значение того, что вы ему передаете.
$this->element('display', array('flag' => 'value'));
на ваш взгляд, а затем в /app/views/elements/ вы можете создать файл с именем display.ctp, где $flag будет иметь значение того, что вы ему передаете.
requestAction() is also an option, but it can take a heavy toll in performance if done without using cache, since it has to go through all the steps a normal action would.
Элементы работают, если вы хотите, чтобы они имели доступ к тем же данным, к которым имеет доступ вызывающее представление.
Если вы хотите, чтобы ваше встроенное представление имело доступ к собственному набору данных, вы можете использовать что-то вроде requestAction(). Это позволяет встроить полноценное представление, которое в противном случае было бы автономным.
I want to use those "small views" to several other purposes, so It should be "like" a cake component, for reutilization.
Это делается с помощью «Помощников», например описано здесь. Но я не уверен, что вы действительно этого хотите. Предложение "Элементы" тоже кажется правильным. Это сильно зависит от того, чего вы пытаетесь достичь. Мои два цента...
В вашем контроллере (в этом примере контроллер сообщений).
function something() {
return $this->Post->find('all');
}
В каталоге элементов (app / views / element) создайте файл с именем posts.ctp.
В posts.ctp:
$posts = $this->requestAction('posts/something');
foreach($posts as $post):
echo $post['Post']['title'];
endforeach;
Тогда, на ваш взгляд:
<?php echo $this->element('posts'); ?>
Это в основном взято из книги CakePHP здесь: Создание многоразовых элементов с помощью requestAction
Я считаю, что использование requestAction довольно дорого, поэтому вы захотите изучить кеширование.
Для CakePHP 2.x
Новым в Cake 2.x является возможность расширять заданный вид. Таким образом, хотя элементы отлично подходят для небольших кусочков кода, который можно использовать повторно, расширение представления позволяет повторно использовать представления целиком.
См. Руководство для получения дополнительной / лучшей информации
http://book.cakephp.org/2.0/en/views.html#exnding-views
Также работает для 3.x. Спасибо!
Просто используйте:
<?php include('/<other_view>.ctp'); ?>
в .ctp ваше действие заканчивается.
Например, построить заархивированную функцию
function archived() {
// do some stuff
// you can even hook the index() function
$myscope = array("archived = 1");
$this->index($myscope);
// coming back, so the archived view will be launched
$this->set("is_archived", true); // e.g. use this in your index.ctp for customization
}
Возможно, отрегулируйте действие индекса:
function index($scope = array()) {
// ...
$this->set(items, $this->paginate($scope));
}
Ваш archive.ctp будет:
<?php include('/index.ctp'); ?>
Идеальное повторное использование кода действий и представлений контроллера.
Лучший ответ на данный момент - элементы не имеют доступа к данным контроллера. Используя include, дочернее представление будет иметь доступ ко всем - и это совсем не плохая практика.
ты мой герой
В CakePHP 3.x вы можете просто использовать:
$this->render('view')
Это отобразит представление из того же каталога, что и родительское представление.
Просмотрите эту [ссылку] (book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/…) и, в частности, часть Элементы этой справочной страницы, которая расскажет вам все, что вам нужно знать