29 августа 2009

Хитрости в шаблонах Joomla 1.5. Часть 1: Про позиции модулей

Я начинаю цикл статей, в которых буду рассказывать об реализации интересных задач как тривиальный так и не очень в шаблонах для Joomla 1.5. Оформление статьи будет в виде FAQ'а: чтобы вам мало читать, а мне мало писать. Очень буду стараться переходить от простого к сложному.

Итак, приступим:

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


1.1) А если позиций несколько?
<?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 ?>


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


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


2.2) Хорошо, а если я хочу вывести позицию для определённой группы, например для «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 ?>


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


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


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


3.1) Ну а как вывести позицию при определённом 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 ?>


3.2) А как показать позицию только на банальной «Главной» сайта?
<?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' );

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

Пока что всё. По мере накопления знаний данная статья будет дополнятся.

Хитрости в шаблонах Joomla 1.5. Часть 2: Про оформление модулей
Хитрости в шаблонах Joomla 1.5. Часть 3: Всякого рода полезности
0

Комментарии:15

avatar
времени потестить не было так что если что пишите, будем вместе разбираться
avatar
  • Polosat
  • 04 сентября 2009, 01:09
  • 0
Напишите наглядную статью по превращению дизайна из фотошопа в нормальный шаблон джумла, очень было бы интересно увидеть практический пример и последовать самостоятельно. Пора бы с варезными шаблонами заканчивать =)
avatar
  • pedrosoft
  • 04 сентября 2009, 01:17
  • +1
боюсь если человек не знает html и css то статья никак не поможет. нужно начинать именно с html и css.

начать можно с этого, а потом перейти на это.
avatar
  • Full
  • 02 июня 2010, 11:48
  • 0
А как на одну позицию назначить несколько модулей?)
avatar
ну так в настройках модуля выберете нужную вам позицию
avatar
и куда втыкать этот код? в какие файлы и после каких строк?
avatar
В index.php вашего шаблона, в нужное вам место.
avatar
  • Flashton
  • 31 августа 2010, 11:03
  • 0
Здравствуйте. У меня возникла проблема с использованием countModules в Joomla 1.5.
Мой шаблон сделан на основе блочной вёрстки, css и html код ниже.
Для скрытия блоков использую следующий код:
<?php
if($this->countModules('left and right') == 0) $contentwidth = "100";
if($this->countModules('left and right') == 1) $contentwidth = "60";
if($this->countModules("left") == false && $this->countModules( "right" ) == true) $contentwidth = "80_r";
if($this->countModules("left") == true && $this->countModules( "right" ) == false) $contentwidth = "80_l";
?>

Код работает коряво в двух последних ситуациях, почему-то не отображаются границы указанные в css. Пожалуйста, помогите исправить.
HTML:

/**---- Это кусок кода отвечающий за ширину ----**/
<?php if($this->countModules('left')) : ?><div id="left_b">
 <jdoc:include type="modules" name="left" style="xhtml" />
</div>
<?php endif; ?>

<?php if($this->countModules('right')) : ?><div id="right_b">
 <jdoc:include type="modules" name="right" style="xhtml" />
</div>
<?php endif; ?>

<div id="content<?php echo $contentwidth; ?>">
 <jdoc:include type="component" style="xhtml" />
</div>
<div id="stop"></div>


CSS:

/**---- Это кусок кода отвечающий за ширину ----**/
#content60
{
    height:auto;
    margin-left:240px; /** **/
    margin-right:240px;
    padding:4px 8px 4px 8px;
    border-left:dashed 4px #EBEBEB;
    border-right:dashed 4px #EBEBEB;
}

#content80_l
{
    height:auto;
    margin-left:240px; /** **/
    margin-right:20px;
    padding:4px 8px 4px 8px;
    border-left:dashed 4px #EBEBEB;
    border-right:dashed 4px #EBEBEB;
}

#content80_r
{
    height:auto;
    margin-left:20px; /** **/
    margin-right:240px;
    padding:4px 8px 4px 8px;
    border-left:dashed 4px #EBEBEB;
    border-right:dashed 4px #EBEBEB;
}

#content100
{
    height:auto;
    margin-left:20px; /** **/
    margin-right:20px;
    padding:4px 8px 4px 8px;
    border-left:dashed 4px #EBEBEB;
    border-right:dashed 4px #EBEBEB;
}

С уважением, Антон
avatar
Не работает именно код или что-то неправильно в цсс? Код вроде в порядке.
avatar
  • Flashton
  • 31 августа 2010, 20:07
  • 0
Наверное код. Границы пропадают когда используются стили «content80_l» и «content80_r». При том, это явление, с пропаданием границ, возникает только на хостинге, на Денвере всё нормально.
В чём дело, понять не могу, вроде всё что могло глючить я уже пересмотрел.
С уважением, Антон
avatar
Использую компонент Jumi который выводит в статью любой код. Так вот, как сделать чтобы все что находиться в DIV-е Например текст
<div>Text!</div>
выводился только гостям или только автору?
avatar
так просто никак, нужно создавать дополнительный параметр в Jumi, так что либо за деньги либо ждать когда кто то это сделает :)
avatar
Кое как нашел решение этим extensions.joomla.org/extensions/access-a-security/content-restriction/6004
Еще такой вот вопрос, как скрыть позицию модуля от Автора и выше, что бы показывалось только гостям и зарегистрированным пользователям?
avatar
  • cheezer
  • 18 ноября 2012, 21:24
  • 0
Вопрос: как вывести модуль там где есть «Мета-тег Keywords»? Может кто знает?
avatar
  • se95
  • 27 марта 2014, 18:04
  • 0
На главной странице расположены анонсы самых свежих статей со сылкой «читать далее». Ну, то есть вводный текст статей.
А также на главной есть стандартный модуль, причем в его настройках я выбрал показывать только на главной странице. Проблема в том, что если на главной странице нажать на любую из ссылок «читать далее», то откроется полный текст статьи, а модуль останется. Хотя по идее он должен исчезнуть. То есть, Joomla продолжает считать, что юзер находится на главной странице.
Если же открыть этот материал обычным макаром — через меню — то модуль исчезает (как и положено).

Вопрос: как заставить Joomla при нажатии на ссылку «читать далее» убирать все модули, которые не должны публиковаться нигде, кроме главной страницы?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.