User Tools

Site Tools


ru:components-depending-on-the_page

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
ru:components-depending-on-the_page [2013/10/01 09:20]
Arkady [Функция для вывода разных компонентов на разных страницах]
ru:components-depending-on-the_page [2013/10/02 03:57]
Oleg06 [Функция для вывода разных компонентов на разных страницах]
Line 69: Line 69:
  
 <​code><?​php <​code><?​php
-  if (return_i18n_component('​sidebar-'​.return_page_slug())) { +  if (return_component('​sidebar-'​.return_page_slug())) { 
-    ​get_i18n_component('​sidebar-'​.return_page_slug());​+    ​get_component('​sidebar-'​.return_page_slug());​
   } else {   } else {
-    ​get_i18n_component('​sidebar'​);​+    ​get_component('​sidebar'​);​
   }   }
 ?></​code>​ ?></​code>​
Line 78: Line 78:
 Компонент с именем //sidebar// - наш сайдбар по умолчанию. Остальным компонентам присваиваются имена //​sidebar-xxx//,​ где xxx  - текстовый идентификатор страницы (slug), на которой предполагается замена сайдбара по умолчанию на предназначенный именно для этой страницы. Компонент с именем //sidebar// - наш сайдбар по умолчанию. Остальным компонентам присваиваются имена //​sidebar-xxx//,​ где xxx  - текстовый идентификатор страницы (slug), на которой предполагается замена сайдбара по умолчанию на предназначенный именно для этой страницы.
  
-Другой способ – использование пользовательского поля (custom field) c именем «//​sidebar//​» - лучше применить выпадающий список с именами компонентов-сайдбаров. Допустимо и простое текстовое поле, но это не очень удобно из-за возможной ошибки при вводе имени компонента.+Другой способ – использование плагина [[http://​getsimplecms.ru/​plaginy-dlya-getsimple-cms/​plagin-i18n-custom-fields/​|I18N Custom Fields]]. Создайте пользовательское поле (custom field) c именем «//​sidebar//​» - лучше применить выпадающий список с именами компонентов-сайдбаров. Допустимо и простое текстовое поле, но это не очень удобно из-за возможной ошибки при вводе имени компонента.
  
 После формирования списка просто включаем выбранный компонент в шаблон:​ После формирования списка просто включаем выбранный компонент в шаблон:​
  
-<​code><?​php ​get_i18n_component(return_custom_field('​sidebar'​));​ ?></​code>​+<​code><?​php ​get_component(return_custom_field('​sidebar'​));​ ?></​code>​
  
 При желании можно предварительно проверить пользовательское поле с компонентом на существование:​ При желании можно предварительно проверить пользовательское поле с компонентом на существование:​
Line 88: Line 88:
 <​code><?​php <​code><?​php
   if (return_custom_field('​sidebar'​)) {   if (return_custom_field('​sidebar'​)) {
-    ​get_i18n_component(return_custom_field('​sidebar'​));​+    ​get_component(return_custom_field('​sidebar'​));​
   } else {   } else {
-    ​get_i18n_component('​sidebar'​);​+    ​get_component('​sidebar'​);​
   }   }
 ?></​code>​ ?></​code>​
Line 104: Line 104:
     get_custom_field('​sidebar'​);​     get_custom_field('​sidebar'​);​
   } else {   } else {
-    ​get_i18n_component('​sidebar'​);​+    ​get_component('​sidebar'​);​
   }   }
 ?></​code>​ ?></​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>​
ru/components-depending-on-the_page.txt · Last modified: 2013/10/09 12:20 by Arkady