Разработка шаблонов под joomla. Продолжаем тему - IT-C@FE
×
Masterpro Nivo Slider (06 фев 2023)

Это форк Vinaora Nivo Slider, пришлось переименовать, в силу требования JED. Даже старую версию качать можно было только с варезных сайтов, нашпигованную троянами. Зачем оно такое, согласитесь.

Вопрос Разработка шаблонов под joomla. Продолжаем тему

Подробнее
12 года 9 мес. назад - 12 года 9 мес. назад #1 от anatole
Как скрыть позицию модуля, если в ней нет активных модулей?
<?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;}
Последнее редактирование: 12 года 9 мес. назад пользователем anatole.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
11 года 2 мес. назад - 11 года 2 мес. назад #2 от prividenie
Могу посоветовать отличный сайт, на котором вы можете разместить для продажи свои шаблоны joomla. Отличный сайт. Продавать свои работы очень просто и удабно.

Примечание модератора. Ссылка удалена.
Последнее редактирование: 11 года 2 мес. назад пользователем Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
11 года 2 мес. назад - 11 года 2 мес. назад #3 от Aleksej
prividenie, ставлю вас в известность о том, что ссылка в первом же сообщении только что зарегистрировавшегося пользователя по традиции приравнивается в Сети к спаму. Со всеми вытекающими отсюда печальными выводами... К слову - вся реклама на нашем сайте является делом сугубо коммерческим, обращайтесь.
Последнее редактирование: 11 года 2 мес. назад пользователем Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
11 года 1 мес. назад - 11 года 1 мес. назад #4 от prividenie
если тут есть фрилансеры, то у меня для вас хорошее предложение...

Примечание. Отредактировано модератором.
Последнее редактирование: 11 года 1 мес. назад пользователем Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подробнее
11 года 1 мес. назад #5 от Aleksej
Привидения, троллей и прочую нечисть у нас на форуме принято кропить святой водой.... в полном соответствии, так сказать, с традициями. Трах-тебедох-тебедох - и все тебе ок, никаких троллей. :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Работает на Kunena форум