======Вывод компонентов в зависимости от страницы ====== =====Как вывести компонент только на одной странице===== Если вам требуется показать компонент только на одной странице, это можно сделать с помощью следующего кода в файле шаблона **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)]]