Есть ли в CakePHP что-то похожее на партиалы Symfony? - PullRequest
1 голос
/ 21 апреля 2011

Если вы хотите повторно использовать код в представлениях, Symfony имеет два основных механизма: партиалы и слоты.Партиалы хороши тем, что вы можете определить глобальные партиалы (вы можете использовать их в любом модуле) и партиалы модуля (они доступны только в определенном модуле).

Однако в CakePHP у вас есть только обычные шаблоны и элементы,последнее доступно в каждом представлении, независимо от того, в какой модели / контроллере вы находитесь.

Имеет ли CakePHP что-то похожее на партиал Symfony?Было бы хорошо, например, избегать дублирования кода форм для модели.У вас может быть два шаблона (добавление и редактирование), которые «включают» общую форму.

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Почему бы не создать представление (module_partial.ctp) внутри директории вида конкретного контроллера. Это сохранит код, специфичный для контроллера, к которому вы хотите, чтобы он относился. Допустим, у вас есть контроллер книг. Вы хотите добавить специальную форму BooksController к некоторым представлениям ваших книг.

Создание представления в каталоге views/books/ с именем: search_partial.ctp

search_partial.ctp будет содержать нужный код HTML.

Тогда, в любом случае, просто позвоните:

<?php echo $this->render('search_partial'); ?>

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

ВСЕ глобальные переменные перейдут в представления / элементы.

0 голосов
/ 21 апреля 2011

Вы можете поместить элементы в плагины.

Вы можете сделать что-то вроде $ this-> element ('кое-что'); в макете и иметь элемент в плагине и / или в главной папке просмотра приложений, например, ...

App/plugins/a_plugin/views/elements/something.ctp //only called when a controller from 'a_plugin' is called.

App/views/elements/something.ctp // called if the current plugin does not have 'something.ctp' in the elements folder

Чтобы не дублировать представления, такие как добавить / редактировать, посмотрите на это https://github.com/infinitas/infinitas/blob/beta/app_controller.php#L389

...