CakePHP 2 обращается к переменной, определенной в представлении

Как в cakephp-1.2, так и в cakephp-1.3 Я использовал следующее фрагмент кода в элементе с именем head, вызываемом из макета blog:

$this->preMetaValues = array(
    'title' => __('SiteTitle', true).' '.$title_for_layout,
    'desc' => Configure::read('siteTitle').', '.Configure::read('siteSlogan'),
    'keywords' => Configure::read('keywords'),
    'type' => 'article',
    'site_name' => __('SiteTitle', true),
    'imageURL' => $html->url('/img/logo.png', true)
);
if(!isset($this->metaValues)){
  $this->metaValues = $this->preMetaValues;
}
else{
  $this->metaValues = array_merge($this->preMetaValues, $this->metaValues);
}

<?php echo $html->meta('description',$this->metaValues['desc']); ?>
<?php echo $html->meta('keywords', $this->metaValues['keywords']);?>

Я использовал приведенный выше код для определения или изменения значений мета-тегов из любого файла представления. preMetaValues считается значением по умолчанию. Если в представлении определен какой-либо metaValues, этот код изменит его и сделает metaValues готовым к использованию.

Теперь с cakephp- 2.4 описанный код генерирует следующую ошибку:

Не удалось найти вспомогательный класс metaValuesHelper.

Ошибка: Произошла внутренняя ошибка.

Действительно, я не знаю, почему CakePHP считает эту переменную вспомогательной? и как я могу решить эту проблему?


person SaidbakR    schedule 18.09.2013    source источник


Ответы (3)


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

$this->set('title_for_layout', 'Your title');

А затем в представлении распечатайте его с помощью:

<title><?php echo $title_for_layout?></title>

У вас есть пример этого в документации: http://book.cakephp.org/2.0/en/views.html#layouts

Просто относитесь к ним как к любой другой переменной.

person Alvaro    schedule 18.09.2013
comment
Я не думаю, что это вариант! Я имел в виду саму идею. Почему он считает это Помощником? и как я могу преодолеть это в представлении? - person SaidbakR; 18.09.2013
comment
Почему не вариант? Почему бы вам просто не установить переменную из контроллера? - person Alvaro; 18.09.2013
comment
Потому что я не хочу заботиться об этом в каждом действии контроллера. Другими словами, значения по умолчанию, определенные в preMetaValues, будут напечатаны независимо от того, учитывается ли я metaValues или нет. Если следовать тому, что вам предлагается, это может привести к ошибке неопределенной переменной, если она не определена в каждом действии контроллера с использованием этого макета! - person SaidbakR; 18.09.2013
comment
Тогда у вас есть два варианта. Удалите $this-> и относитесь к ним как к обычным переменным php внутри вашего представления/макета. ($preMetaValues, ...) или установите их в onBeforeFilter вашего AppController.php. - person Alvaro; 18.09.2013
comment
Кроме того, логика, которую я использую, разделит логику программирования и задачи SEO. Другими словами, SEO-специалист может заботиться только о представлении как о дизайнере. - person SaidbakR; 18.09.2013
comment
Тогда попробуйте мой последний ответ, относитесь к ним как к обычным переменным, удалите $this-> - person Alvaro; 18.09.2013
comment
Есть проблема: в CakePHP 2.4 кажется, что он обрабатывает макет перед обработкой представления, поэтому, когда я устанавливаю $metaValues ​​в представлении, оно не распознается как определенное! - person SaidbakR; 12.10.2013
comment
Можете ли вы опубликовать ссылку на эту проблему? Кажется очень странным иметь такую ​​большую ошибку в версии CakePHP. - person Alvaro; 14.10.2013

Почему вы используете объект $this? Разве вы не можете использовать простое решение, подобное этому:

$preMetaValues = array(
    'title' => __('SiteTitle', true).' '.$title_for_layout,
    'desc' => Configure::read('siteTitle').', '.Configure::read('siteSlogan'),
    'keywords' => Configure::read('keywords'),
    'type' => 'article',
    'site_name' => __('SiteTitle', true),
    'imageURL' => $html->url('/img/logo.png', true)
);
if(!isset($metaValues)){
  $metaValues = $preMetaValues;
}
else{
  $metaValues = array_merge($preMetaValues, $metaValues);
}

<?php echo $html->meta('description',$metaValues['desc']); ?>
<?php echo $html->meta('keywords', $metaValues['keywords']);?>
person Mindaugas Norvilas    schedule 18.09.2013

Наконец я нашел решение. Это просто о том, как установить переменную для макета из представления. Кажется, что в более ранних версиях cakephp представление было обрабатывается до макета, а сейчас находится в cakephp-2.4 макет обрабатывается первым, поэтому любое переопределение любой переменной, определенной в макете из представления, не будет успешным.

Следовательно, решение будет зависеть от метода set объект представления примерно так:

//in some view such as index.ctp
    $this->set('metaValues', array(
                                   'title', 'The title string...',
                                   'desc' => 'The description string...'
                                   )
              );

Также, как отметил в своем ответе Альваро, мне нужно получить доступ к этой переменной без $this, то есть как к локальным переменным.

Этот ответ основан на: Передать переменную из представления в макет в CakePHP - или куда еще поместить эту логику?

person SaidbakR    schedule 11.10.2013