Вопрос

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

То, что вы, ребята, предлагаете использовать, чтобы быть в соглашениях Cake (а не использовать необработанный 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() Это также вариант, но он может сильно повлиять на производительность, если выполняется без использования кеша, поскольку ему придется пройти все этапы, которые выполняет обычное действие.

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

function something() {
    return $this->Post->find('all');
}

В каталоге элементов (app/views/element) создайте файл Posts.ctp.

В post.ctp:

$posts = $this->requestAction('posts/something'); 
foreach($posts as $post): 
    echo $post['Post']['title']; 
endforeach; 

Тогда, на ваш взгляд:

<?php echo $this->element('posts'); ?>

В основном это взято из книги CakePHP здесь:Создание повторно используемых элементов с помощью requestAction

Я считаю, что использование requestAction довольно затратно, поэтому вам стоит заняться кешированием.

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

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

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

Для CakePHP 2.x

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

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

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

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

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

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

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

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

$this->render('view')

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top