Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Для CakePHP 2.x

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

$this->render('view')

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