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

Next revision
Previous revision
ru:components-depending-on-the_page [2013/10/01 09:12]
Arkady created
ru:components-depending-on-the_page [2013/10/09 12:20] (current)
Arkady
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>​
 +    ​
 +====== Ссылки ======
  
 +На главную [[ru:​|Содержание]]
  
 +===== Страницы этой секции =====
  
 +=== Руководства,​ Советы ===
 +  *[[ru:​themes:​tutorial|Урок по созданию темы]]
 +  *[[ru:​security|Дополнительные меры безопасности]]
 +  *[[ru:​how_to:​accessibility|Горячие клавиши]]
 +  *[[ru:SEO for GetSimple|Оптимизация сайта на GetSimple для поисковых систем (SEO)]]
ru/components-depending-on-the_page.1380618756.txt.gz · Last modified: 2013/10/01 09:12 by Arkady