User Tools

Site Tools


ru:components-depending-on-the_page

This is an old revision of the document!


Вывод компонентов в зависимости от страницы

Как вывести компонент только на одной странице

Если вам требуется показать компонент только на одной странице, это можно сделать с помощью следующего кода в файле шаблона template.php:

<?php if (return_page_slug()=='PAGE') get_component('COMPNAME'); ?>

Соответственно – ‘PAGE’ – постоянная ссылка на страницу (slug), ‘COMPNAME’ – имя вашего компонента.

Вывод компонента в зависимости от родителя страницы

Похожий метод работает для вывода определенного компонента на страницу в зависимости от ее родителя:

<?php if (get_parent(0)=='PAGE') get_component('COMPNAME'); ?>

Здесь ‘PAGE’ – постоянная ссылка на страницу-родитель (slug), ‘COMPNAME’ – имя вашего компонента.

Исключение компонента

Для исключения компонента из определенной страницы или в зависимости от родителя поменяйте в приведенном выше коде “==“ на ”!=“.

Функция для вывода разных компонентов на разных страницах

Контент компонентов может представлять из себя графику шапки сайта, код сайдбара, слоган или теглайн, в общем, что угодно. Если только одна страница на сайте отличается набором используемых компонентов, проще сделать для этой страницы отдельный шаблон. Но в случае, если необходим вывод разных компонентов на разных страницах, есть смысл применить метод с использованием пользовательской функции.

Для постраничного вывода компонентов необходимо создать в вашей теме файл functions.php, если его там еще нет, и добавить туда следующую функцию:

<?php
if (!function_exists('component_exists')) {
    function component_exists($id) {
        global $components;
        if (!$components) {
             if (file_exists(GSDATAOTHERPATH.'components.xml')) {
                $data = getXML(GSDATAOTHERPATH.'components.xml');
                $components = $data->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. Затем разместите в шаблоне следующий код:

<?php  if (component_exists('content-'.get_page_slug(false)))
	  {get_component('content-'.get_page_slug(false));}
     else {get_component('default');}	?>

Разные сайдбары на разных страницах

Оригинал статьи, по которому сделан перевод, можно почитать здесь.

Для вывода разных сайдбаров на разных страницах существует несколько способов. Один из них – именование соответствующих компонентов таким образом, чтобы их имя содержало постоянную ссылку на страницу (slug), допустим, sidebar-mypage, и вызов соответствующего компонента в коду шаблона следующим образом:

<?php
  if (return_i18n_component('sidebar-'.return_page_slug())) {
    get_i18n_component('sidebar-'.return_page_slug());
  } else {
    get_i18n_component('sidebar');
  }
?>

Компонент с именем sidebar - наш сайдбар по умолчанию. Остальным компонентам присваиваются имена sidebar-xxx, где xxx - текстовый идентификатор страницы (slug), на которой предполагается замена сайдбара по умолчанию на предназначенный именно для этой страницы.

Другой способ – использование пользовательского поля (custom field) c именем «sidebar» - лучше применить выпадающий список с именами компонентов-сайдбаров. Допустимо и простое текстовое поле, но это не очень удобно из-за возможной ошибки при вводе имени компонента.

После формирования списка просто включаем выбранный компонент в шаблон:

<?php get_i18n_component(return_custom_field('sidebar')); ?>

При желании можно предварительно проверить пользовательское поле с компонентом на существование:

<?php
  if (return_custom_field('sidebar')) {
    get_i18n_component(return_custom_field('sidebar'));
  } else {
    get_i18n_component('sidebar');
  }
?>

Если сайдбары необходимо выводить постранично, то есть для каждой страницы – свой сайдбар, можно создать пользовательское поле WYSIWIG, соответствующим образом отредактировать его на каждой странице, и вставить в файл шаблона следующий код:

<?php get_custom_field('sidebar'); ?>

Тот же результат, но с проверкой пользовательского поля с компонентом на существование:

<?php
  if (return_custom_field('sidebar')) {
    get_custom_field('sidebar');
  } else {
    get_i18n_component('sidebar');
  }
?>

Каждой странице - свой компонент

Вольный перевод одного из постов с англоязычного форума GetSimple

Исходный текст для перевода взят отсюда приблизительно в 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, то обнаружите следующее:

        <div class="section"> 
            <?php get_component('sidebar'); ?> 
        </div> 

Меняем эту строку на:

        <div class="section"> 
            <?php component_master('sidebar'); ?> 
        </div> 

Теперь посмотрите на ваш сайт в браузере - сайдбар на месте, с ним все хорошо.

Теперь поменяем сайдбар, скажем, на главной странице на другой. Нам не придется менять что-либо в файлах темы. Все, что мы делаем - добавляем в админке новый компонент. Допустим, наша главная страничка носит имя 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 и ?>

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 ");
                }
            }
        }
    }
ru/components-depending-on-the_page.1380620710.txt.gz · Last modified: 2013/10/01 09:45 by Arkady