CakePHP View, включая другие виды

У меня есть приложение CakePHP, которое в какой-то момент покажет представление с медиапродуктами (изображениями или видеороликами), которые я хочу знать, есть ли способ включить другое представление, которое угрожает видео или угрожает снимкам в зависимости от флага. Я хочу использовать эти «малые виды» для нескольких других целей, поэтому он должен быть «как» компонент для торта, для повторного использования.

То, что вы, ребята, предлагаете использовать в соглашениях Cake (и не используя команду raw include('') )

Проверьте эту ссылку и, более конкретно, Элементы- части этой страницы руководства, должны рассказать вам все, что вам нужно знать

В интересах получения информации здесь, если кто-то наткнется на это, важно отметить, что решение зависит от версии CakePHP.

Для CakePHP 1.1

$this->renderElement('display', array('flag' => 'value'));

в вашем представлении, а затем в /app/views/elements/ вы можете создать файл с именем display.thtml , где $flag будет иметь значение того, что вы передаете ему.

Для CakePHP 1.2

$this->element('display', array('flag' => 'value'));

в вашем представлении, а затем в /app/views/elements/ вы можете сделать файл с именем display.ctp , где $flag будет иметь значение того, что вы передаете ему.


В обеих версиях элемент будет иметь доступ ко всем данным, к которым у представления есть доступ + любые значения, которые вы передаете ему. Кроме того, как requestAction() кто-то, requestAction() также является опцией, но при выполнении без использования кеша он может сильно пострадать, поскольку он должен пройти все этапы, которые будут выполняться обычным действием.

В вашем контроллере (в этом примере контроллер сообщений).

 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#extending-views

Просто используйте:

 <?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); // eg use this in your index.ctp for customization } 

Возможно, отрегулируйте действие индекса:

 function index($scope = array()) { // ... $this->set(items, $this->paginate($scope)); } 

Ваш архив.ctp будет:

 <?php include('/index.ctp'); ?> 

Идеальное повторное использование кода действий контроллера и представлений.

Элементы работают, если вы хотите, чтобы они имели доступ к тем же данным, к которым имеет доступ вызывающее представление.

Если вы хотите, чтобы встроенный просмотр имел доступ к собственному набору данных, вы можете использовать что-то вроде requestAction() . Это позволяет внедрить полноценное представление, которое в противном случае было бы автономным.

Я хочу использовать эти «малые виды» для нескольких других целей, поэтому он должен быть «как» компонент для торта, для повторного использования.

Это делается с помощью «Помощников», как описано здесь . Но я не уверен, что это действительно то, что вы хотите. Предложение « Элементов » тоже кажется правильным. Это зависит от того, что вы пытаетесь выполнить. Мои два цента…

В CakePHP 3.x вы можете просто использовать:

 $this->render('view') 

Это отобразит представление из того же каталога, что и родительский.