Как сделать динамически изменяемые вставки в meta поля — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 2.9.5''' == Задача == Необходимо сделать, чтобы в title, description и keywords прису…»)
 
 
(не показано 14 промежуточных версий этого же участника)
Строка 7: Строка 7:
 
== Решение ==  
 
== Решение ==  
  
В первую очередь, Вам нужно будет создать кастом, который будет возвращать ту или иную информацию, например в зависимости от текущего домена, и создать системную страницу с нужными полями, где будет хранится эта информация.
+
В первую очередь, Вам нужно будет создать кастом, который будет возвращать значения полей, и создать системную страницу с нужными полями, где будет хранится эта информация.
 
Созданный макрос можно будет вставить прямо в поле title и он отработает нормально, но для полей description и keywords такое решение не подойдет. Нужно будет написать кастомные макросы, которые находить какую-либо метку в этом поле, заменять её на содержимое поля системной страницы, а потом уже выводить.
 
Созданный макрос можно будет вставить прямо в поле title и он отработает нормально, но для полей description и keywords такое решение не подойдет. Нужно будет написать кастомные макросы, которые находить какую-либо метку в этом поле, заменять её на содержимое поля системной страницы, а потом уже выводить.
  
 
Для применения примеров скопируйте код в файл /classes/modules/custom.php.
 
Для применения примеров скопируйте код в файл /classes/modules/custom.php.
  
== Пример макроса, выводящего ту или иную информацию, в зависимости от домена ==
+
== Примеры ==
[[category:Вопросы установки настройки и переноса]]
+
 
 +
Сначала создадим тип данных, дочерний "страницы контента" и добавим в него новую группу полей и поля (все идентификаторы необходимо ввести на как на скриншоте):
 +
 
 +
[[Файл:Meta_settings.png]]
 +
 
 +
Потом создадим страницу этого типа данных с псевдостатическим адресом "meta_settings" и заполним поля страницы значениями:
 +
 
 +
[[Файл:Meta_page.png]]
 +
 
 +
А теперь скопируем следующий код в файл /classes/modules/custom.php:
 +
 
 +
<source lang="php">
 +
public function getMeta($field){
 +
 +
$hierarchy = umiHierarchy::getInstance();
 +
$page_id = $hierarchy->getIdByPath('/meta_settings/',true);
 +
$page = $hierarchy->getElement($page_id,true, true);
 +
 +
switch ($field) {
 +
case 'title':
 +
return $page->getValue('title_settings');
 +
case 'description':
 +
return $page->getValue('keywords_settings');
 +
case 'keywords':
 +
return $page->getValue('description_settings');
 +
default:
 +
return 'bad field name';
 +
}
 +
}
 +
</source>
 +
 
 +
Макрос вызывается как %custom getMeta()%, в нем 1 параметр, который принимает название мета тега, вставку для которого необходимо вывести.
 +
 
 +
Для title его можно применить прямо вот так:
 +
 
 +
[[Файл:Title.png]]
 +
 
 +
А в исходном коде страницы появится:
 +
 
 +
<source lang="html4strict">
 +
<title>UMI</title>
 +
</source>
 +
 
 +
А для description и keywords придется написать два кастомных макроса:
 +
 
 +
<source lang="php">
 +
                public function getDescr($descr){
 +
return str_replace('%mark%', custom::getMeta('description'), $descr);
 +
}
 +
 +
public function getKeyw($keyw){
 +
return str_replace('%mark%', custom::getMeta('keywords'), $keyw);
 +
}
 +
</source>
 +
 
 +
Оба макроса работают очень просто - ищут в поступившей строке марку и меняют её на результат созданного макроса %custom getMeta()%.
 +
 
 +
Вызываются они как, %custom getDescr()% и %custom getKeyw()%. Принимают они в себя значения полей description и keywords, соответственно. Получить их в tpl можно с помощью системных макросов %keywords% и %description%, а в xslt их можно взять из резалта.
 +
 
 +
Пример заполнения полей:
 +
 
 +
[[Файл:Descr.png]] и [[Файл:Keywords.png]]
 +
 
 +
И, как несложно догадаться, если сделаем следующие вызовы в шаблоне(tpl):
 +
 
 +
<source lang="html4strict">
 +
<meta name="description" content="%custom getDescr(%description%)%"/>
 +
<meta name="keywords" content="%custom getKeyw(%keywords%)%"/>
 +
</source>
 +
 
 +
То в исходном коде страницы получим:
 +
 
 +
<source lang="html4strict">
 +
<meta name="keywords" content="UMI.CMS">
 +
<meta name="description" content="UMI.CMS">
 +
</source>
 +
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль SEO]]

Текущая версия на 16:07, 14 февраля 2014

Актуально для версии 2.9.5

Задача

Необходимо сделать, чтобы в title, description и keywords присутствовали некоторое слово, которое можно сразу везде поменять. Например, у Вас мультисайтовость и каждый сайт создан для отдельного города, и Вы хотите, чтобы в этих поля присутствовало его название.

Решение

В первую очередь, Вам нужно будет создать кастом, который будет возвращать значения полей, и создать системную страницу с нужными полями, где будет хранится эта информация. Созданный макрос можно будет вставить прямо в поле title и он отработает нормально, но для полей description и keywords такое решение не подойдет. Нужно будет написать кастомные макросы, которые находить какую-либо метку в этом поле, заменять её на содержимое поля системной страницы, а потом уже выводить.

Для применения примеров скопируйте код в файл /classes/modules/custom.php.

Примеры

Сначала создадим тип данных, дочерний "страницы контента" и добавим в него новую группу полей и поля (все идентификаторы необходимо ввести на как на скриншоте):

Meta settings.png

Потом создадим страницу этого типа данных с псевдостатическим адресом "meta_settings" и заполним поля страницы значениями:

Meta page.png

А теперь скопируем следующий код в файл /classes/modules/custom.php:

public function getMeta($field){
		
			$hierarchy = umiHierarchy::getInstance(); 
			$page_id = $hierarchy->getIdByPath('/meta_settings/',true); 
			$page = $hierarchy->getElement($page_id,true, true); 
			
			switch ($field) {
				case 'title':
					return $page->getValue('title_settings');
				case 'description':
					return $page->getValue('keywords_settings');
				case 'keywords':
					return $page->getValue('description_settings');
				default:
					return 'bad field name';
			}
		}

Макрос вызывается как %custom getMeta()%, в нем 1 параметр, который принимает название мета тега, вставку для которого необходимо вывести.

Для title его можно применить прямо вот так:

Title.png

А в исходном коде страницы появится:

<title>UMI</title>

А для description и keywords придется написать два кастомных макроса:

                public function getDescr($descr){
			return str_replace('%mark%', custom::getMeta('description'), $descr);
		}
		
		public function getKeyw($keyw){
			return str_replace('%mark%', custom::getMeta('keywords'), $keyw);
		}

Оба макроса работают очень просто - ищут в поступившей строке марку и меняют её на результат созданного макроса %custom getMeta()%.

Вызываются они как, %custom getDescr()% и %custom getKeyw()%. Принимают они в себя значения полей description и keywords, соответственно. Получить их в tpl можно с помощью системных макросов %keywords% и %description%, а в xslt их можно взять из резалта.

Пример заполнения полей:

Descr.png и Keywords.png

И, как несложно догадаться, если сделаем следующие вызовы в шаблоне(tpl):

<meta name="description" content="%custom getDescr(%description%)%"/>
<meta name="keywords" content="%custom getKeyw(%keywords%)%"/>

То в исходном коде страницы получим:

<meta name="keywords" content="UMI.CMS">
<meta name="description" content="UMI.CMS">