This shows you the differences between two versions of the page.
Next revision | Previous revision Last revision Both sides next revision | ||
ru:components-depending-on-the_page [2013/10/01 09:12] Arkady created |
ru:components-depending-on-the_page [2013/10/02 03:57] Oleg06 [Функция для вывода разных компонентов на разных страницах] |
||
---|---|---|---|
Line 17: | Line 17: | ||
===== Исключение компонента ===== | ===== Исключение компонента ===== | ||
- | If you would like to exclude a component from a page you could do that by replacing "**==**" with "**!=**" in the code above. | + | |
Для исключения компонента из определенной страницы или в зависимости от родителя поменяйте в приведенном выше коде **"=="** на **"!="**. | Для исключения компонента из определенной страницы или в зависимости от родителя поменяйте в приведенном выше коде **"=="** на **"!="**. | ||
Line 63: | Line 63: | ||
===Разные сайдбары на разных страницах=== | ===Разные сайдбары на разных страницах=== | ||
- | Оригинал статьи, по которому сделан перевод, можно почитать [[http://mvlcek.bplaced.net/how-to/sidebars/|здесь]]. | + | **Оригинал статьи, по которому сделан перевод, можно почитать [[http://mvlcek.bplaced.net/how-to/sidebars/|здесь]].** |
+ | Для вывода разных сайдбаров на разных страницах существует несколько способов. | ||
+ | Один из них – именование соответствующих компонентов таким образом, чтобы их имя содержало постоянную ссылку на страницу (slug), допустим, //sidebar-mypage//, и вызов соответствующего компонента в коду шаблона следующим образом: | ||
+ | <code><?php | ||
+ | if (return_component('sidebar-'.return_page_slug())) { | ||
+ | get_component('sidebar-'.return_page_slug()); | ||
+ | } else { | ||
+ | get_component('sidebar'); | ||
+ | } | ||
+ | ?></code> | ||
+ | Компонент с именем //sidebar// - наш сайдбар по умолчанию. Остальным компонентам присваиваются имена //sidebar-xxx//, где xxx - текстовый идентификатор страницы (slug), на которой предполагается замена сайдбара по умолчанию на предназначенный именно для этой страницы. | ||
+ | Другой способ – использование плагина [[http://getsimplecms.ru/plaginy-dlya-getsimple-cms/plagin-i18n-custom-fields/|I18N Custom Fields]]. Создайте пользовательское поле (custom field) c именем «//sidebar//» - лучше применить выпадающий список с именами компонентов-сайдбаров. Допустимо и простое текстовое поле, но это не очень удобно из-за возможной ошибки при вводе имени компонента. | ||
+ | |||
+ | После формирования списка просто включаем выбранный компонент в шаблон: | ||
+ | |||
+ | <code><?php get_component(return_custom_field('sidebar')); ?></code> | ||
+ | |||
+ | При желании можно предварительно проверить пользовательское поле с компонентом на существование: | ||
+ | |||
+ | <code><?php | ||
+ | if (return_custom_field('sidebar')) { | ||
+ | get_component(return_custom_field('sidebar')); | ||
+ | } else { | ||
+ | get_component('sidebar'); | ||
+ | } | ||
+ | ?></code> | ||
+ | |||
+ | Если сайдбары необходимо выводить постранично, то есть для каждой страницы – свой сайдбар, можно создать пользовательское поле WYSIWIG, соответствующим образом отредактировать его на каждой странице, и вставить в файл шаблона следующий код: | ||
+ | |||
+ | <code><?php get_custom_field('sidebar'); ?></code> | ||
+ | |||
+ | Тот же результат, но с проверкой пользовательского поля с компонентом на существование: | ||
+ | |||
+ | <code><?php | ||
+ | if (return_custom_field('sidebar')) { | ||
+ | get_custom_field('sidebar'); | ||
+ | } else { | ||
+ | get_component('sidebar'); | ||
+ | } | ||
+ | ?></code> | ||
+ | |||
+ | |||
+ | =====Каждой странице - свой компонент===== | ||
+ | |||
+ | **Вольный перевод одного из постов с англоязычного форума GetSimple** | ||
+ | |||
+ | //Исходный текст для перевода взят [[http://get-simple.info/forum/topic/214/function-per-page-components/|отсюда]] приблизительно в 2011 году.// | ||
+ | |||
+ | Как-то раз, верстая очередной сайт, я столкнулся с необходимостью замены подвалов на определенных страницах. Я попробовал поискать существующее решение на форуме.Так вот, в одном из постов **Chris Cagle** предложил следующий способ: | ||
+ | |||
+ | <code> | ||
+ | if ( return_page_slug() == 'about' ) { | ||
+ | get_component('about-component'); | ||
+ | } elseif ( return_page_slug() == 'index' ) { | ||
+ | get_component('homepage-component'); | ||
+ | } else { | ||
+ | get_component('generic-component'); | ||
+ | }</code> | ||
+ | |||
+ | Тем не менее, в конце концов придется лезть в шаблон и прописывать там каждый подвал или любой другой компонент всякий раз, когда он мне понадобится. Chris выдвинул интересное решение - размещение меток перед именем компонента. Вот если бы это можно было автоматизировать ... | ||
+ | |||
+ | Конечно же, можно! | ||
+ | |||
+ | Я написал собственную функцию //get_component()// и назвал ее //component_master()//. Текст функции вы найдете в конце поста. Если есть желание использовать эту функцию в шаблонах - добавьте ее в файл //functions.php//, который либо уже есть в теме, либо его надо создать самому. | ||
+ | |||
+ | Как это работает? | ||
+ | |||
+ | Если вы откроете файл // template.php// в стандартной теме //Cardinal//, то обнаружите следующее: | ||
+ | |||
+ | <code> | ||
+ | <div class="section"> | ||
+ | <?php get_component('sidebar'); ?> | ||
+ | </div> | ||
+ | </code> | ||
+ | |||
+ | Меняем эту строку на: | ||
+ | |||
+ | <code> | ||
+ | <div class="section"> | ||
+ | <?php component_master('sidebar'); ?> | ||
+ | </div> | ||
+ | </code> | ||
+ | |||
+ | Теперь посмотрите на ваш сайт в браузере - сайдбар на месте, с ним все хорошо. | ||
+ | |||
+ | Теперь поменяем сайдбар, скажем, на главной странице на другой. Нам не придется менять что-либо в файлах темы. Все, что мы делаем - добавляем в админке новый компонент. Допустим, наша главная страничка носит имя //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// с нуля, оберните мою функцию в тэги //<?php// и //?>// | ||
+ | |||
+ | <file>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)) . "<?php "); | ||
+ | return; | ||
+ | } elseif ($master.'-extra-'.$id == $component->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)):'') . "<?php "); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }</file> |