CakePHP, где я могу поместить этот код для повторного использования? - PullRequest
1 голос
/ 18 августа 2011

У меня есть модель с именем PageMetaData , которая содержит заголовок и описание .Это должно быть привязано к любой другой модели и использоваться в качестве тега заголовка и мета-описания для страницы.

Итак, у меня есть модель под названием Brand.У бренда есть поле с именем page_meta_data_id, а у бренда принадлежитT * PageMetaData

. Теперь в представлении для бренда я могу запустить этот код:

if(!empty($data['PageMetaData']['title']))
{
    $this->set('title_for_layout', $data['PageMetaData']['title']);
}
else if(!empty($data['Brand']['name']))
{
    $this->set('title_for_layout', $data['Brand']['name']);
}
if(!empty($data['PageMetaData']['description']))
{
    echo $this->Html->meta('description', $data['PageMetaData']['description'],array('inline'=>false));
}
else if(!empty($data['Brand']['description']))
{
    echo $this->Html->meta('description', $data['Brand']['description'],array('inline'=>false));
}

И если PageMetaData связанак текущему бренду и имеет значение для заголовка, он установит это в качестве заголовка страницы, в противном случае, если у бренда есть поле с именем name, оно нам это даст.То же самое для описания.

Проблема в том, что мне не нужно дублировать этот код в каждом представлении для каждой модели, использующей PageMetaData.

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

Я не могу поместить его в «Поведение» или «Помощник», потому что вы не можете установить заголовок с того или другого.Я не могу поместить его в компонент, потому что он не может получить доступ к данным, найденным в модели.

Где-нибудь я могу поместить этот код для повторного использования?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Вы можете использовать элементы для этого.взгляните на ссылку поваренной книги:

http://book.cakephp.org/view/1081/Elements

0 голосов
/ 18 августа 2011

Поместите метод в ваш AppModel. Я предполагаю, что метод принимает id для возврата соответствующих данных.

Поместите другой метод в метод beforeRender вашего AppController. Передайте id этому методу; который в свою очередь вызовет метод в AppModel; настройка title_for_layout, meta_description и keywords.

Вам также не следует выводить эти значения, а передавать их в представление и выводить их там (или в макете).

AppController и AppModels распространяются на все приложения; поэтому любой контроллер / модель может получить доступ к методам.

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

...