IT-К@ФЕ. Welcome! :)
   
Добро пожаловать, Гость
Логин: Пароль: Запомнить меня


Разработка шаблонов под joomla. Продолжаем тему
(1 чел.) (1) гость
  • Страница:
  • 1

ТЕМА: Разработка шаблонов под joomla. Продолжаем тему

Разработка шаблонов под joomla. Продолжаем тему 1 год, 3 мес. назад #1002

  • anatole
  • Вне сайта
  • Junior Boarder
  • Постов: 27
  • Репутация: 1
Как скрыть позицию модуля, если в ней нет активных модулей?
<?php if($this->countModules('user1') : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


А если позиций несколько?
<?php if($this->countModules('user1 or user2 or user3') : ?>
<div id="users">
        <?php if($this->countModules('user1') : ?>
        <div id="user1">
                <jdoc:include type="modules" name="user1" style="xhtml" />
        </div>
        <?php endif ?>
        <?php if($this->countModules('user2') : ?>
        <div id="user2">
                <jdoc:include type="modules" name="user2" style="xhtml" />
        </div>
        <?php endif ?>
        <?php if($this->countModules('user3') : ?>
        <div id="user3">
                <jdoc:include type="modules" name="user3" style="xhtml" />
        </div>
        <?php endif ?>
</div>
<?php endif ?>

Как отобразить позицию только для авторизованного пользователя?
<?php
$user =& JFactory::getUser();
?>
<?php if(!$user->guest) : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>

А - только для гостя?
<?php
$user =& JFactory::getUser();
?>
<?php if($user->guest) : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>

А если нужно отобразить позицию для определённой группы, например для «Author»?
<?php
$user =& JFactory::getUser();
?>
<?php if($user->get('usertype') == 'Author') : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


А - для конкретного пользователя, например для пользователя с ником «qwerty»?
<?php
$user =& JFactory::getUser( 'qwerty' );
?>
<?php if($user->id) : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


Как вывести логин пользователя?
<?php
$user =& JFactory::getUser();
?>
<?php if($user->id) : ?>
<div id="user1">
        <?php echo $user->get('username') ?>
</div>
<?php endif ?>


Как отобразить позицию в определённом компоненте, например в компоненте «Контакты»?
<?php
$option = JRequest::getVar( 'option' );
?>
<?php  if($option == 'com_contact') : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


Как вывести позицию при определённом Itemid, например «35»?
<?php
$itemid = JRequest::getInt( 'Itemid' );
?>
<?php  if($itemid == '35') : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


Как показать позицию только на главной странице сайта?
<?php
$option = JRequest::getVar( 'option' );
$id = JRequest::getInt( 'id' );
?>
<?php  if($option == 'com_content' && !$id) : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>

Более универсальное решение (определяет пункт меню, у которого стоит метка «По умолчанию»):
<?php
$menu =& JSite::getMenu();
?>
<?php if ($menu->getActive() == $menu->getDefault()) : ?>
<div id="user1">
        <jdoc:include type="modules" name="user1" style="xhtml" />
</div>
<?php endif ?>


Следует заметить, что все используемые параметры типа:
$menu =& JSite::getMenu();
$user =& JFactory::getUser();
$option = JRequest::getVar( 'option' );
$itemid = JRequest::getInt( 'Itemid' );


нужно писать вначале index.php но не перед:
defined( '_JEXEC' ) or die( 'Restricted access' );


и только один раз, а вот данные этих параметров возможно использовать любое количество раз.

Теперь - о внутреннем оформлении модулей, имея ввиду HTML-код, генерирующий позиции модулей (пространство имён jdoc). По умолчанию Joomla 1.5 имеет 6 способов генерации кода. Способ генерации указывается в атрибуте «style», например:

<jdoc:include type="modules" name="top" style="none" />


Рассмотрим все 6 способов более подробно:

1) style=«rounded» — выводит модуль в четырёх вложенных div'ах, для создания закруглённых углов (на самом деле сейчас эта технология устарела, есть менее ресурсоёмкие способы):
<div class="module_menu">
  <div>
    <div>
      <div>
        <h3>Main Menu</h3>
        <ul class="menu">
          <li><!-- various menu items --></li>
        </ul>
      </div>
    </div>
  </div>
</div>


2) style=«table» — выводит модуль в таблице:

<table cellpadding="0" cellspacing="0" class="moduletable_menu">
  <tr>
    <th valign="top">Main Menu</th>
  </tr>
  <tr>
    <td>
      <ul class="menu">
        <li><!-- various menu items --></li>
      </ul>
    </td>
  </tr>
</table>


3) style=«horz» — выводит модуль горизонтально в ячейке окружающей таблицы:
<table cellspacing="1" cellpadding="0" border="0" width="100%">
  <tr>
    <td valign="top">
      <table cellpadding="0" cellspacing="0" class="moduletable_menu">
        <tr>
          <th valign="top">Main Menu</th>
        </tr>
        <tr>
          <td>
            <ul class="menu">
              <li><!-- various menu items --></li>
            </ul>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>



4) style=«xhtml» — выводит модуль в одном div-элементе:
<div class="moduletable_menu">
  <h3>Main Menu</h3>
  <ul class="menu">
    <li><!-- various menu items --></li>
  </ul>
</div>


5) style=«none» — выводит модуль без форматирования:
<ul class="menu">
  <li><!-- various menu items --></li>
</ul>


6) style=«outline» — выводит модуль с названием позиции модуля; словно также, когда к адресу сайта добавляется параметр «tp=1» для просмотра имеющихся позиций модулей в шаблоне:

<div class="mod-preview">
  <div class="mod-preview-info">left[outline]</div>
  <div class="mod-preview-wrapper">
    <ul class="menu">
      <li><!-- various menu items --></li>
    </ul>
  </div>
</div>


Несмотря на наличие 6 способов - на практике обычно используются только два: «xhtml» и «none». Бывают ситуации когда этого недостаточно для реализации какой-либо цели. Что делать? Разумеется, читать документацию и благодарить разработчиков Joomla, которые позаботились даже об этом и предоставили нам возможность создавать свои типы модулей (пользовательские модули). Чтобы определить пользовательский модуль - мы должны в каталоге с шаблоном создать каталог «html» и положить туда файл «modules.php». В этом файле необходимо определить функцию, называемую «modChrome_STYLE», где «STYLE» — это имя нашего пользовательского модуля. Эта функция будет принимать три аргумента: $module, &$params и &$attribs:

<?php
        defined('_JEXEC') or die('Restricted access');

        function modChrome_STYLE( $module, &$params, &$attribs ) 
        {
        /* chromed Module output goes here */
        }
?>


В рамках этой функции может быть использовано любое модульное свойство (в т.ч. и параметры, которые содержатся в таблице «jos_modules» вашей БД). Основными же. являются:

— $module->content — переменная выводит содержимое модуля;
— $module->showtitle — переменная возвращает значение 1, если в настройках модуля разрешено показывать заголовок модуля, иначе — 0;
— $module->title — переменная выводит заголовок модуля.

Рассмотрим небольшой пример, в котором показан способ проверки отображения заголовка модуля, а также вывод самого заголовка в случае положительного результата:

<?php
        if ($module->showtitle) 
        {
        echo '<h2>' .$module->title .'</h2>';
        }
?>


Параметры модуля можно использовать через объект $params. Например вывод суффикса класса модуля (по умолчанию это значение хранится в параметре «moduleclass_sfx») осуществляется следующим способом:

<div class="moduletable<?php echo $params->get( 'moduleclass_sfx' ); ?>">
        <!-- div contents -->
</div>


Теперь практика. Создадим пользовательский модуль, назовём его «custom» (это значит, что при использования его в шаблоне нужно будет написать style=«custom» в <jdoc:include />). Ну а толку да от такого модуля? Нужно сделать что-то интересное, чтобы почувствовать действительную необходимость пользовательских модулей! Сделаем первое слово в заголовке модуля красным цветом, а все остальные слова — цветом по умолчанию, описанному в стилях:

<?php
        defined('_JEXEC') or die('Restricted access');

        function modChrome_custom($module, &$params, &$attribs)
        { ?>
                <div class="moduletable<?php echo $params->get('moduleclass_sfx'); ?>">
                        <?php if ($module->showtitle) : ?>
                                <h3>
                                        <?php
                                                $title = $module->title;
                                                $title = split(' ', $title);
                                                $title[0] = '<span style="color:red">'.$title[0].'</span>';
                                                $title = implode(' ', $title);
                                                echo $title; 
                                        ?>
                                </h3>
                        <?php endif; ?>
                                <div>
                                        <?php echo $module->content; ?>
                                </div>
                </div>
        <?php }
?>


Как уже отмечалось выше, пользовательская функция принимает три аргумента. Для чего нужны два -см. выше, остался последний — &$attribs. Как уже стало понятно, разработчики не остановились на достигнутой гибкости и решили дать возможность использовать дополнительные параметры, которые хранятся в массиве $attribs. Рассмотрим пример:

<?php
        defined('_JEXEC') or die('Restricted access');

        function modChrome_custom( $module, &$params, &$attribs ) {
                if (isset( $attribs['headerLevel'] )) 
                {
                        $headerLevel = $attribs['headerLevel'];
                } else {
                        $headerLevel = 3;
                }

                if (isset( $attribs['background'] )) 
                {
                        $background = $attribs['background'];
                } else {
                        $background = 'blue';
                }
                ?>
                <div class="moduletable<?php echo $params->get( 'moduleclass_sfx' ); ?>">
                        <?php
                        if ($module->showtitle) 
                        {
                                echo '<h' .$headerLevel .'>' .$module->title .'</h' .$headerLevel .'>';
                        }
                        ?>
                        <div class="<?php echo $background; ?>">
                                <?php echo $module->content; ?>
                        </div>
                </div>
                <?php
        }
?>


Затем необходимо установить значения в <jdoc:include />, если этого не сделать, будут использоваться значения по умолчанию: цвет синий, размер заголовка третий. Значения задаются таким образом:

1) <jdoc:include type=«modules» name=«user1» style=«custom» background=«green» /> — задаём значение цвета: background=«green»;
2) <jdoc:include type=«modules» name=«user1» style=«custom» headerLevel=«1» background=«yellow» /> — задаём значение размера заголовка и цвета: headerLevel=«1» и background=«yellow».


Следует помнить что всё здесь описанное - для шаблонов: некоторые вещи будут работать и в компонента и в модулях, но далеко не все.

Как вывести URL-адрес сайта?

<?php echo JURI::base() ?>


Как вывести название сайта?

<?php echo $mainframe->getCfg('sitename') ?>


Как вывести e-mail администратора?

<?php echo $mainframe->getCfg('mailfrom') ?>


Как вывести текущую дату?

<?php echo JHTML::Date( 'now', '%d | %m | %Y' ) ?> 


Форматирование даты можно подсмотреть в мануале.

Как вывести заголовок текущей страницы?

<?php 
$document =& JFactory::getDocument();
echo $document->title;
?>


Как в зависимости от времени суток отображать тот или иной шаблон?
Если шаблоны отличаются только стилями (css) то можно просто от времени суток подгружать тот или иной стиль, например так:

<link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/vekta/css/<?php echo (date("%H")>=7 && date("%H")<19) ? "day" : "night" ?>.css" type="text/css" />


Если шаблоны координатно разные то слить (подправить пути там где нужно) шаблоны в один каталог и переименовать файл index.php обеих шаблонов; например в index-day.php и index-night.php. Создать index.php и написать в нём:

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

if (date("%H") >= '7' && date("%H") < '18') {
        require 'index-day.php';
} else {
        require 'index-night.php';
}
?>


Как сделать свои страницы ошибок?
По умолчанию Joomla 1.5 использует специальные файл "/templates/system/error.php" для вывода ошибок с кодами статуса: 403, 404, 500. Если мы хотим изменить этот файл - необходимо скопировать его в каталог с нашим шаблоном, а также - скопировать файл стилей из "/templates/system/css/error.css" в каталог со стилями шаблона и в «error.php» подредактировать путь к новому файлу стилей. После этого можно править их как угодно. Всё это нужно для того, в частности, чтобы не возникало проблем при обновлении Joomla.

Теперь - пример. Например для кода ошибки 404 выведем соответствующее сообщение:

<?php if ($this->error->code = '404') { ?>
<div id="errorboxheader">Ошибка 404: Странница не найдена</div>
        <div id="errorboxbody">
                <p>К сожалению, странница, которую вы запрашивали, не найдена.</p>
        </div>
</div>
<?php } ?>


Для чего нужен файл «params.ini» в каталоге с шаблоном?

Этот файл служит для записи параметров шаблона, которые задаются в панели управления шаблоном, а описываются в файле «templateDetails.xml». Например сделаем возможность в параметрах шаблона задавать фон шаблона. В «templateDetails.xml» добавим секцию для параметров и сам параметр:

<params>
        <param name="backgroundVariation" type="list" default="blue" label="Background Variation" description="Background color variation to use">
                <option value="blue">Blue</option>
                <option value="red">Red</option>
                <option value="green">Green</option>
                <option value="orange">Orange</option>
                <option value="black">Black</option>
                <option value="white">White</option>
        </param>
</params>


Теперь в тег BODY шаблона добавим атрибут CLASS и получим:

<body class="color_<?php echo $this->params->get('colorVariation') ?>">


А в стилях шаблона опишем классы:

.color_blue {color:#3796cf;}
.color_red {color:#ff1d1d;}
.color_green {color:#438f29;}
.color_orange {color:#ff8712;}
.color_black {color:#000000;}
.color_white {color:#ffffff;}
Изменено: 1 год, 3 мес. назад от anatole.
  • Страница:
  • 1
Время создания страницы: 0.26 секунд