======Вывод компонентов в зависимости от страницы ======
=====Как вывести компонент только на одной странице=====
Если вам требуется показать компонент только на одной странице, это можно сделать с помощью следующего кода в файле шаблона **template.php**:
Соответственно – **‘PAGE’** – постоянная ссылка на страницу (slug), **‘COMPNAME’** – имя вашего компонента.
===== Вывод компонента в зависимости от родителя страницы =====
Похожий метод работает для вывода определенного компонента на страницу в зависимости от ее родителя:
Здесь **‘PAGE’** – постоянная ссылка на страницу-родитель (slug), **‘COMPNAME’** – имя вашего компонента.
===== Исключение компонента =====
Для исключения компонента из определенной страницы или в зависимости от родителя поменяйте в приведенном выше коде **"=="** на **"!="**.
=====Функция для вывода разных компонентов на разных страницах=====
Контент компонентов может представлять из себя графику шапки сайта, код сайдбара, слоган или теглайн, в общем, что угодно. Если только одна страница на сайте отличается набором используемых компонентов, проще сделать для этой страницы отдельный шаблон. Но в случае, если необходим вывод разных компонентов на разных страницах, есть смысл применить метод с использованием пользовательской функции.
Для постраничного вывода компонентов необходимо создать в вашей теме файл **functions.php**, если его там еще нет, и добавить туда следующую функцию:
item;
} else {
$components = array();
}
}
$exists = FALSE;
if (count($components) > 0) {
foreach ($components as $component) {
if ($id == $component->slug) {
$exists = TRUE;
break;
}
}
}
return $exists;
}
}
?>
Создайте компонент, который будет использоваться по умолчанию. Дайте ему имя, допустим, //default//. Создайте компоненты для других страниц. Имя компонента должно включать в себя постоянную ссылку (slug) той страницы, на которой их предполагается вызывать, допустим: //content-about//, //content-contact//. Затем разместите в шаблоне следующий код:
===Разные сайдбары на разных страницах===
**Оригинал статьи, по которому сделан перевод, можно почитать [[http://mvlcek.bplaced.net/how-to/sidebars/|здесь]].**
Для вывода разных сайдбаров на разных страницах существует несколько способов.
Один из них – именование соответствующих компонентов таким образом, чтобы их имя содержало постоянную ссылку на страницу (slug), допустим, //sidebar-mypage//, и вызов соответствующего компонента в коду шаблона следующим образом:
Компонент с именем //sidebar// - наш сайдбар по умолчанию. Остальным компонентам присваиваются имена //sidebar-xxx//, где xxx - текстовый идентификатор страницы (slug), на которой предполагается замена сайдбара по умолчанию на предназначенный именно для этой страницы.
Другой способ – использование плагина [[http://getsimplecms.ru/plaginy-dlya-getsimple-cms/plagin-i18n-custom-fields/|I18N Custom Fields]]. Создайте пользовательское поле (custom field) c именем «//sidebar//» - лучше применить выпадающий список с именами компонентов-сайдбаров. Допустимо и простое текстовое поле, но это не очень удобно из-за возможной ошибки при вводе имени компонента.
После формирования списка просто включаем выбранный компонент в шаблон:
При желании можно предварительно проверить пользовательское поле с компонентом на существование:
Если сайдбары необходимо выводить постранично, то есть для каждой страницы – свой сайдбар, можно создать пользовательское поле WYSIWIG, соответствующим образом отредактировать его на каждой странице, и вставить в файл шаблона следующий код:
Тот же результат, но с проверкой пользовательского поля с компонентом на существование:
=====Каждой странице - свой компонент=====
**Вольный перевод одного из постов с англоязычного форума GetSimple**
//Исходный текст для перевода взят [[http://get-simple.info/forum/topic/214/function-per-page-components/|отсюда]] приблизительно в 2011 году.//
Как-то раз, верстая очередной сайт, я столкнулся с необходимостью замены подвалов на определенных страницах. Я попробовал поискать существующее решение на форуме.Так вот, в одном из постов **Chris Cagle** предложил следующий способ:
if ( return_page_slug() == 'about' ) {
get_component('about-component');
} elseif ( return_page_slug() == 'index' ) {
get_component('homepage-component');
} else {
get_component('generic-component');
}
Тем не менее, в конце концов придется лезть в шаблон и прописывать там каждый подвал или любой другой компонент всякий раз, когда он мне понадобится. Chris выдвинул интересное решение - размещение меток перед именем компонента. Вот если бы это можно было автоматизировать ...
Конечно же, можно!
Я написал собственную функцию //get_component()// и назвал ее //component_master()//. Текст функции вы найдете в конце поста. Если есть желание использовать эту функцию в шаблонах - добавьте ее в файл //functions.php//, который либо уже есть в теме, либо его надо создать самому.
Как это работает?
Если вы откроете файл // template.php// в стандартной теме //Cardinal//, то обнаружите следующее:
Меняем эту строку на:
Теперь посмотрите на ваш сайт в браузере - сайдбар на месте, с ним все хорошо.
Теперь поменяем сайдбар, скажем, на главной странице на другой. Нам не придется менять что-либо в файлах темы. Все, что мы делаем - добавляем в админке новый компонент. Допустим, наша главная страничка носит имя //index//. Обзываем наш новый компонент //index-sidebar//, и на страничке //index// теперь будет появляться именно он. Что касается других страниц - на них будет по-прежнему отображаться компонент //sidebar// по умолчанию!
Мы просто добавляем имя желаемой страницы через дефис перед именем компонента по умолчанию, и он будет выведен на запрошенную страницу вместо стандартного.
Если мы не определили специфический компонент для какой-либо страницы, на экран будет выведен тот компонент, имя которого передается в функцию //component_master()//.
В нашем случае на всех страницах, которые не будут иметь своего специфического сайдбара, будет выведен компонент //sidebar// по умолчанию.
А что делать, если хочется не заменить сайдбар на свой, а просто что-нибудь добавить?
Представьте, мне эта мысль тоже пришла в голову, и я предлагаю следующее решение.
Если вы хотите, чтобы компонент по умолчанию отображался на всех страницах, а на определенных страницах к нему надо что-нибудь добавить - создайте компонент с именем, складывающимся по следующему принципу: //имя_страницы-extra-компонент//. То есть, если мы хотим добавить что-то к стандартному сайдбару только на странице //index// - мы называем добавляемый компонент //index-extra-sidebar//, и он добавится к сайдбару по умолчанию только на странице //index//. Но если нами уже создан компонент замены, допустим, //index-sidebar//, то наш дополнительный компонент //index-extra-sidebar// будет проигнорирован.
В случае, если вас не устраивает такое поведение экстра-компонента - нужно слегка изменить //template.php// Добавим-ка в вызов функции //component_master()// дополнительный параметр //component_master('sidebar',true)//. Теперь функция будет добавлять содержимое экстра-компонента к компоненту замены.
Вот эта функция – **component_master()**. Я выкладываю ее как есть. Возможно, я буду ее править, если она станет несовместимой с системой после выхода новых версий или кто-нибудь предложит интересную идею, но не обещаю. Если у вас случайно при применении этой функции слетит вся информация с винта, я тут тоже не при чем.
Если вы создавали файл //functions.php// с нуля, оберните мою функцию в тэги ////
function component_master($id,$first=false) {
if (file_exists('data/other/components.xml')) {
$master = return_page_slug();
$extra = false;
$standard = false;
$thisfile = file_get_contents("data/other/components.xml");
$data = simplexml_load_string($thisfile, NULL, LIBXML_NOCDATA);
$components = $data->item;
if (count($components) != 0) {
foreach ($components as $component) {
if ($master.'-'.$id == $component->slug) {
eval("?>" . stripslashes(htmlspecialchars_decode($component->value, ENT_QUOTES)) . "slug) {
$extra = $component->value;
} elseif ($id == $component->slug) {
$standard = $component->value;
}
}
if ($standard) {
eval("?>" . ($extra&&$first?stripslashes(htmlspecialchars_decode($extra,ENT_QUOTES)):'') . stripslashes(htmlspecialchars_decode($standard, ENT_QUOTES)) . ($extra&&!$first?stripslashes(htmlspecialchars_decode($extra, ENT_QUOTES)):'') . "
====== Ссылки ======
На главную [[ru:|Содержание]]
===== Страницы этой секции =====
=== Руководства, Советы ===
*[[ru:themes:tutorial|Урок по созданию темы]]
*[[ru:security|Дополнительные меры безопасности]]
*[[ru:how_to:accessibility|Горячие клавиши]]
*[[ru:SEO for GetSimple|Оптимизация сайта на GetSimple для поисковых систем (SEO)]]