Ответ 1
Откроется ссылка и более конкретно Элементы - часть этой страницы руководства, должна рассказать вам все, что вы нужно знать
У меня есть приложение CakePHP, которое в какой-то момент покажет представление с медиапродуктами продукта (изображениями или видеороликами). Я хочу знать, есть ли возможность включить другое представление, которое угрожает видео или угрожает снимкам, в зависимости от флага, Я хочу использовать эти "малые виды" для нескольких других целей, поэтому он должен быть "как" компонент для торта для повторного использования.
То, что вы, ребята, предлагаете использовать в соглашениях Cake (и не используя команду raw include('')
)
Откроется ссылка и более конкретно Элементы - часть этой страницы руководства, должна рассказать вам все, что вы нужно знать
В интересах получения информации здесь, если кто-то наткнется на это, важно отметить, что решение зависит от версии 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()
также является опцией, но при выполнении без использования кеша он может сильно пострадать, поскольку он должен пройти все этапы, которые нормальное действие будет. В вашем контроллере (в этом примере контроллер сообщений).
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 - это способность продлить данное представление. Таким образом, хотя элементы отлично подходят для небольших бит кода многократного использования, расширение вида позволяет вам повторно использовать целые представления.
См. руководство для получения более подробной информации
Просто используйте:
<?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'); ?>
Идеальное повторное использование кода действий и представлений контроллера.
Элементы работают, если вы хотите, чтобы они имели доступ к тем же данным, к которым имеет доступ вызывающий вид.
Если вы хотите, чтобы встроенный просмотр имел доступ к собственному набору данных, вы можете использовать что-то вроде requestAction()
. Это позволяет встраивать полноценное представление, которое в противном случае было бы автономным.
Я хочу использовать эти "малые виды" для несколько других целей, поэтому он должен быть "как" компонент торта, для ресурсосбережения.
Это делается с помощью "Помощники", как описанный здесь. Но я не уверен, что ты действительно хочешь. Предложение Elements" кажется правильным. Это зависит от того, что вы пытаетесь выполнить. Мои два цента...
В CakePHP 3.x вы можете просто использовать:
$this->render('view')
Это отобразит представление из того же каталога, что и родительский.