ЗАПИСИ
ЯНВАРЬ 4, 2009

Как реализовать динамические мета тэги keywords и description для любой страницы.

Сейчас я пишу небольшой проектик на Cakephp 1.2 и у меня возник вопрос, как мне генерировать мета тэги для разных страниц свои, чтобы оптимизировать сайт под поисковые запросы. Я нашел несколько статей, описывающих как это сделать, и в итоге я поступил так:

1) Нужно сделать Helper класс, например, MetaHelper. И поместить в него следующий код:

<?php
	class MetaHelper extends AppHelper {
		var $keywords = 'TODO Default keywords';
		var $description = 'TODO Default description';

		function afterRender() {
			$view = ClassRegistry::getObject('view');
			$view->set('keywords_for_layout', $this->keywords);
			$view->set('description_for_layout', $this->description);
		}

		function setKeywords($s) {
			if (!empty($s)) {
				$this->keywords = $s;
			}
		}

		function setDescription($s) {
			if (!empty($s)) {
				$this->description = $s;
			}
		}
	}
?>

2) Добавить этот хелпер в AppController.

3) В layout’е в <head> прописать:

    <meta name="description" content="<? echo $description_for_layout ?>" />
    <meta name="keywords" content="<? echo $keywords_for_layout ?>" />

Итог: Все очень просто. На самом деле этот подход можно использовать для установки любых других значений layout’а не доступных напрямую из view’хи.

Вот и все.

#1 Январь 27, 2009 в 21:45

Если можно дополните статью примером использования…
Насколько я понял назначение данного хелпера в переносе значений из view в layout. Чтобы установить значение в контроллере их придется передать во view и потом через этот хелпер в layout.

#2 Январь 27, 2009 в 23:46

Йо!
Пример:

- В app/views/helpers/meta.php — MetaHelper, который оисан в статье.

- В app/app_controller.php
class AppController extends Controller {
var $helpers = array(‘Meta’, ‘Html’, ‘Form’, ‘Javascript’);
// blah blah blah

- В app/views/layouts/default.ctp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

<html xmlns="http://www.w3.org/1999/xhtml"&gt;
<head>
<title><?php echo $title_for_layout?></title>
<meta name="description" content="<? echo $description_for_layout ?>" />
<meta name="keywords" content="<? echo $keywords_for_layout ?>" />
<? echo $html->css(‘main.css’); ?>

<?php echo $scripts_for_layout ?>
</head>

- Для переопределения дефолтовых значений keywords & despription:
- в app/views/pages/show.ctp
<? $meta->setKeywords($page['Page']['keywords']) ?>
<? $meta->setDescription($page['Page']['description']) ?>
…Эти значения берутся из персистента, т.е. из инстанса модели, который я передаю на страницу.

- На остальных страницах, где не заданы явно keywords и description через MetaHelper, используются дефолтовые значения (из meta.php)

Вот :-)

#3 Май 7, 2009 в 15:57
seme4kin

$this->viewVars['keywords_for_layout'] = $page['Page']['keywords'];
$this->viewVars['description_for_layout'] = $page['Page']['description'];

м?

#4 Май 7, 2009 в 16:01

@seme4kin
не пробовал, но звучит хорошо и правдоподобно :-)