CakePHP View, включая другие виды - PullRequest
12 голосов
/ 18 сентября 2008

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

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

Ответы [ 8 ]

18 голосов
/ 18 сентября 2008

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

9 голосов
/ 18 сентября 2008

Для получения информации здесь, на случай, если кто-то наткнется на это, важно отметить, что решение варьируется в зависимости от версии 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() также является опцией, но она может значительно снизить производительность, если выполняется без использования кэша, поскольку она должна пройти все шаги, которые выполняло бы обычное действие.
7 голосов
/ 28 сентября 2008

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

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 довольно дорого, поэтому вам стоит заняться кэшированием.

5 голосов
/ 23 июля 2013

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

<?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));
}

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

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

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

4 голосов
/ 19 сентября 2012

Для CakePHP 2.x

Новое в Cake 2.x - это возможность расширить данный вид. Таким образом, в то время как элементы отлично подходят для того, чтобы иметь маленькие кусочки повторно используемого кода, расширение представления позволяет вам повторно использовать целые представления.

См. Руководство для получения более подробной информации.

http://book.cakephp.org/2.0/en/views.html#extending-views

1 голос
/ 18 сентября 2008

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

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

0 голосов
/ 09 июля 2015

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

$this->render('view')

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

0 голосов
/ 25 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...