0 Пользователей и 1 Гость просматривают эту тему.
  • 9 Ответов
  • 302 Просмотров
*

infis

  • Новичок
  • 5
  • 0 / 0
Всем привет!

Делаю модуль, в котором фактически содержится база элементов для отображения. С элементами проблем нет, через multiple элементарно все делается. Да и сам модуль без проблем настраивается для отображения в сайдбаре и в статье по разному.

Возник вопрос, как убрать модуль из сайдбара, если одновременно он же отображается в статье? Внутри модуля ничего не выводить, если заголовок страницы такой-то - не вариант, так как при этом сам сайдбар все равно остается. Если убрать показ модуля на этой странице, то он и в статье перестает отображаться.

То есть задача такая. Так как данные фактически хранятся в настройках модуля, то создавать два разных модуля просто неудобно, чтобы не дублировать настройки. Создавать компонент для формирования данных, чтобы затем двумя разными модулями выводить в разных местах, можно, конечно, но рисовать целый компонент для такой простой задачи?... Может быть есть способ "доставать" параметры из другого модуля?

Попутно вопрос. Как лучше стиль из модуля подключать? Через addstylesheet?
*

a-vikalingvo

  • Осваиваюсь на форуме
  • 32
  • 2 / 0
Цитировать
Попутно вопрос. Как лучше стиль из модуля подключать? Через addstylesheet?
Да это правильно !! Вам же надо стили в <head  /> Закинуть !
Есть еще один вариант - грузить стили через JS - но это в том случае если модуль выводится не на первом развороте экрана - а скажем где то в footer - //
*

a-vikalingvo

  • Осваиваюсь на форуме
  • 32
  • 2 / 0
Цитировать
как убрать модуль из сайдбара,
Что касается этого вопроса - ну тут что то на подобии Class Singilton - вам нужен....
То есть - Нужно создать какой то класс в папке с  модулем .
Назовите его к примеру - Helper_modul_site.php
Где то с таким кодом 
Код: php
class Helper_modul_site
{
public $isLoad = false;
public static $instance;

/**
*
* @throws \Exception
* @since 3.9
*/
private function __construct ( $options = [] )
{
return $this;
}

/**
* @param   array  $options
*
* @return helper
* @throws \Exception
* @since 3.9
*/
public static function instance ( $options = [] )
{
if( self::$instance === null )
{
self::$instance = new self( $options );
}

return self::$instance;
}
                /**
                 *
* @param   bool  $isLoad
* @since 3.9
*/
public function setIsLoad ( $isLoad = true )
{
$this->isLoad = $isLoad;
}#END FN

}
Теперь вы можете использовать его так .
// Это в начале главного файла модуля
Код: php
JLoader::register( 'Helper_modul_site', JPATH_SITE . '/modules/[[[The directory of your module.]]]/Helper_modul_site.php' );
в том же файле
Ни и потом вызываем
Код: php

      $Helper_Helper_modul_site = Helper_modul_site::instance ();

Теперь проверяем
Код: php
if( $Helper_Helper_modul_site->isLoad  )
{
/* модуль уже грузился и просто выходим */
return ;
}
                        /* Устанавливает переменную в true */
$Helper_Helper_modul_site->setIsLoad();
/*  Все что далее - то иначе то есть при первой загрузки  .!  */

Ну в общем то как то так .... Конечно есть вариант и проще - но за то теперь у Вас есть еще и класс Helper в виде шаблона сингилтона ...  - то есть он загрузится один раз и будит это все помнить до самого рендинга страницы.

)) - Думаю что не напугал !! Удачи !!





« Последнее редактирование: 05.11.2019, 20:02:00 от a-vikalingvo »
*

infis

  • Новичок
  • 5
  • 0 / 0
Ну в общем то как то так .... Конечно есть вариант и проще - но за то теперь у Вас есть еще и класс Helper в виде шаблона сингилтона ...  - то есть он загрузится один раз и будит это все помнить до самого рендинга страницы. ))

Спасибо за ответ!


Увы, но модуль благополучно загружается дважды. То есть экземпляр класса создается каждый раз новый, а потому этот вариант не подходит. Более того, даже, если бы это было не так, то я пробовал ничего не отдавать - если модуль загружается с пустым контентом, то в шаблоне все равно под него формируется блок. А это автоматически сохраняет место сайдбара, даже если в него ничего не будет выведено. В шаблоне в зависимости от наличия модулей для позиции либо присутствует блок сайдбара, либо отсутствует.
*

a-vikalingvo

  • Осваиваюсь на форуме
  • 32
  • 2 / 0
Значит Вам нужно выше это все проводить !
Как вы подключаете модуль ?
Попробуйте через так .
Код: php
$module = JModuleHelper::getModule( 'mod_[[[MODUL-NAME]]]'  );
$html = JModuleHelper::renderModule($module);
echo $html ;
Ну и тут же можно а  глобальную переменную APP Что то кинуть
к примеру так
Код: php
$app = \JFactory::getApplication() ;
$app->input->set( 'load_my_modul' , true );
Потом где надо проверить получить и проверить
Код: php
 $app = \JFactory::getApplication() ;
$load_result = $app->input->get( 'load_my_modul' , false );
if( $load_result )
{
echo 'Модуль уже загружали';
}else{
echo 'Модуль еще не загружали';
}#END IF

*

a-vikalingvo

  • Осваиваюсь на форуме
  • 32
  • 2 / 0
Цитировать
То есть экземпляр класса создается каждый раз новый
))) Да ну ! ? ))) Что то значит вы не дописали ! - Это не может создаваться дважды !

Вы случаем  это не забыли это  ? - Это нужно поставить после каждой загрузки модуля !!!
Код: php
/* Устанавливает переменную в true */
$Helper_Helper_modul_site->setIsLoad();
Но в общем то и не нужно делайте так Потом разберемся !! ) Удачи Вам !!
*

fbr

  • Завсегдатай
  • 1445
  • 164 / 7
Возник вопрос, как убрать модуль из сайдбара, если одновременно он же отображается в статье? Внутри модуля ничего не выводить, если заголовок страницы такой-то - не вариант, так как при этом сам сайдбар все равно остается. Если убрать показ модуля на этой странице, то он и в статье перестает отображаться...

Я так понял, вы выводите модуль в теле статьи

Можно попробовать так:

Создать для модуля в статье позицию, например "module-xxx". Создать ее в XML шаблона, в индексе шаблона не вставлять. Модуль публиковать в этой позиции
В материале вставлять кнопкой модуль в этой позиции {loadposition module-xxx}.

В сайдабре модуль, допустим, выводится в позиции "sidbar-spec-pos"

Проверку вывода модуля осуществлять так:
Код
if ( $this->countModules('sidbar-spec-pos') && !$this->countModules('module-xxx') ) {
// выводим в сайдбаре
}

Это просто пример
Код зависит от вашего шаблона
Идея - прописать условие вывода на уровне шаблона
*

infis

  • Новичок
  • 5
  • 0 / 0
Возможно, мы не поняли друг друга.

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

Решение, которое Вы предложили, может только убрать генерируемый контент, но место под него всё равно резервируется. Также, насколько я понимаю, объект, созданный в коде модуля, живет только до окончания выполнения кода модуля или до первого return. Затем этот объект уничтожается. Поэтому он дважды выполниться он может только в пределах одной позиции, например:

Код
	protected function _load($position, $style = 'none')
{
self::$modules[$position] = '';
$document = JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$modules  = JModuleHelper::getModules($position);
$params   = array('style' => $style);
ob_start();

foreach ($modules as $module)
{
echo $renderer->render($module, $params);
}

self::$modules[$position] = ob_get_clean();

return self::$modules[$position];
}

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

Есть ли какой-то способ возвращать true или false, определяющее необходимость вставки модуля куда-либо?
*

infis

  • Новичок
  • 5
  • 0 / 0
Идея - прописать условие вывода на уровне шаблона

Спасибо за идею! Это первое, что приходило в голову, но для меня это не подходит, так как я не хочу трогать шаблон вообще.


Похоже, самый правильный вариант будет - написать компонент и два модуля к нему. В компоненте создаем заполняем таблицу, а в модулях выводим её. Один модуль будет везде в сайдбаре, кроме конкретной страницы. А второй модуль будет для статьи на конкретной странице.


Возможно, то же самое можно будет реализовать не через компонент, а через плагин, если к параметрам этого плагина можно будет получить доступ из модулей. Но два отдельных модуля все равно придется делать.
*

infis

  • Новичок
  • 5
  • 0 / 0
В общем для себя решил сделать просто.

Будет два модуля. Один модуль будет содержать все данные для отображения и рендерить их в сайдбаре. Второй модуль будет вспомогательным вытаскивать из базы параметры первого модуля, отображается только в статье. В итоге настройки будут в одном месте без необходимости создавать компонент для создания, хранения и редактирования данных. И лишних запросов фактически не будет, кроме конкретной статьи.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Перенаправление после доступа к статье по индексу

Автор artemnaum

Ответов: 7
Просмотров: 220
Последний ответ 06.12.2019, 22:01:14
от draff
Модуль для опросов Advanced Poll не работает

Автор Escander

Ответов: 13
Просмотров: 112
Последний ответ 06.12.2019, 16:01:54
от AlexB
Как создать свой модуль, который будет выводить и стилизовать материалы?

Автор talion

Ответов: 8
Просмотров: 322
Последний ответ 30.11.2019, 06:00:07
от AlekVolsk
Как правильно вставить виджет в модуль?

Автор sakha.rap

Ответов: 3
Просмотров: 157
Последний ответ 29.11.2019, 15:41:37
от AlexB
Выделить пункт &quot;Главная&quot; если мы на главной

Автор kolhoz

Ответов: 4
Просмотров: 132
Последний ответ 26.11.2019, 16:28:00
от kolhoz