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

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
Всем кривет!
Связался тут с фреймворком, и понадобилось сделать условие на вывод модуля только в режиме статьи.
Это легко делает адвенсед модуле манагер, но тянет за собой фреймворк разработчика, самого разработчика, жену разработчика и детей разработчика.
Ну ладно, одного фреймворка мне более чем достаточно, чтобы засомневаться  ;D

В принципе, как удалить сам модуль я представляю, но увидел на странице ноунамбера инфу об удаление целой позиции, захотел так же делать.
Проблема в том, что это платный функционал, и пример реализации так просто не добыть.
Поэтому спрашиваю умных местных товарищей: на каком этапе можно добраться до позиции модуля?
Очень желателен пример кода, убивающего позицию, ибо ТС не хочет на старости лет лезть в дебри php  ;D
*

fbr

  • Завсегдатай
  • 1576
  • 180 / 7
Во входном файле, в самом начале, можно попробовать по условию подменить позицию на несуществующую ...

Код
defined( '_JEXEC' ) or die;
if (...) $module->position = "non-position";

не, не работает ...
что-то такое я делал, но забыл ((
« Последнее редактирование: 21.01.2020, 21:12:55 от fbr »
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
вообще, я думаю, что в идеале это должно быть системное событие, по которому можно в документе её грохнуть.
так было бы красивее, наверно, чем перебирать все модули.
тем более, что у НоНамбера пример был с использованием синтаксиса {remove-position abc}, так что логично предположить, что получается сырой документ с ещё не обработанными позициями и их вызов затирается.
хотя, может, и не так оно работает
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
отменить рендер модуля можно внутри
Код
public function onRenderModule(&$module)
{}

но это отвязывание модулей, а хочется добраться до самой позиции все же. иначе, имея пример с {remove-position abc} придется при каждом вызове модуля её искать по документу. это как-то ресурсозатратно слишком.
хотя, если её глобально куда-то засунуть, то уже на вариант похоже.
типа, прошли один раз по документу, собрали все найденные позиции на удаление, сунули в архив и в глобальную переменную поместили, после чего для каждого модуля проверяем вхождение его позиции в массив и отменяем рендер.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Тебе нужен системный плагин с примерно таким методом onBeforeRender
Код
	public function onBeforeRender()
{
$doc = JDocument::getInstance('html');
$doc->setBuffer('', ['type' => 'modules', 'name' => 'название_позиции', 'title' => 'заголовок' или null]);
$doc->setBuffer('', ['type' => 'module', 'name' => 'название_позиции', 'title' => 'заголовок' или null]);

return true;
}
Не будь паразитом, сделай что-нибудь самостоятельно!
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
работает, спасибо!  :D но - с оговоркой:
этот способ, как и мой, оставляет оболочку в виде section вокруг позиции.
т.е. если модуль в админке отключен, то и секция исчезает.
возможно, имеется способ ещё раньше грохнуть модуль, чтобы проверка на его наличие не проходила. т.е. изымать его до включения в документ.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
этот способ, как и мой, оставляет оболочку в виде section вокруг позиции.
т.е. если модуль в админке отключен, то и секция исчезает.
При рендеринге блок <jdoc/> просто полностью заменяется на соответствующий контент. Наличие section, скорее всего, зависит от шаблона - в protostar, например, нет никаких section.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13152
  • 1232 / 8
возможно, имеется способ ещё раньше грохнуть модуль, чтобы проверка на его наличие не проходила. т.е. изымать его до включения в документ.
Цитировать
public function onAfterCleanModuleList(&$modules) {
   $needReset = false;
   foreach ($modules as $key=>$module) {
      if (....) {
         unset($modules[$key]);
         $needReset = true;
      }
   }
   if ($needReset) {
      $modules = array_values($modules);
   }
}
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 731 / 7
  • Все начинается с Value
зачем делать работу и заем удалять
логичнее выводить (позицию, модуль) если это статья
иначе это напоминает (наверное все поняли, что имеется ввиду)
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
затем, что фреймворк )
и модуль надо вывести не в статье или рядом а в отдельной секции.
в своем шаблоне я бы так не изрвращался, естественно )
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
о, красавцы! я знал, что вы знали!  ;D
всем спасибо, код от dmitry_stas'а традиционно работает  ;D
а пример Septdir'а содержит допинфу, так что комба ).

@robert, имелось в виду, что фрейморки обычно проверяют наличие в позиции модуля и только тогда выводят секцию.
в первых вариантах модуль убивается уже после проверки, так что пустой блок из лайаута будет выводиться, что не гуд в данном случае, а в двух последних вариантах модули исчезают вместе с секцией под них.
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
в общем, в качестве быстрого решения, позволяющего выводить модуль только в режиме статьи или только в режиме блога
в поле с суффиксом класса модуля добавляем aOnly или cOnly , обособленные пробелами
в начало плагина добавляем
Код
use Joomla\Registry\Registry;

Код
		public function onAfterCleanModuleList(&$modules) { // отключатель модулей
$app = JFactory::getApplication();
$view   = $app->input->get('view'); // получили текущую вьющку
if ( $app->isClient('site')){
   $needReset = false;
   foreach ($modules as $key=>$module) {
  $params          = new Registry($module->params);
$alert=false;
$sfx = $params->get('moduleclass_sfx');     // получили строку суффикса модуля
$pos = strpos($sfx, ' aOnly'); // проверили в ней флаг 'только в режиме статьи'
if (!($pos === false) && ($view!='article')) $alert=true;  // если режим не совпал, выставляем флаг необходимости замены на текущем шаге в true
$pos = strpos($sfx, ' cOnly');  // такая же проверка на режим категории
if (!($pos === false) && ($view!='category')) $alert=true;
  if ($alert) {
unset($modules[$key]);
$needReset = true;
  }
   }
   if ($needReset) {
  $modules = array_values($modules);
   }
}
}

*

dmitry_stas

  • Легенда
  • 13152
  • 1232 / 8
зачем делать работу и заем удалять
так onAfterCleanModuleList вызывается же до вывода модулей, а не после. никакой работы модулей на этом этапе еще нет
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 731 / 7
  • Все начинается с Value
так onAfterCleanModuleList вызывается же до вывода модулей, а не после. никакой работы модулей на этом этапе еще нет
Ага в $modules он сам попал  ;D А вариантов то много
По вашему коду $view наверое после проверки site должно быть и про in_array забыли
И вообще сначала проверять $view  стоит, а уж затем по модулям проходится зачем делать ненужную работу в цикле каждую итерацию
Я про $view!='article' и $view!='category' достаточно один раз
Это  strpos($sfx, 'cOnly'); тоже подлежит правке  'МаcOnly' отработает
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Ага в $modules он сам попал  ;D А вариантов то много
По вашему коду $view наверое после проверки site должно быть и про in_array забыли
И вообще сначала проверять $view  стоит, а уж затем по модулям проходится зачем делать ненужную работу в цикле каждую итерацию
Я про $view!='article' и $view!='category' достаточно один раз
Это  strpos($sfx, 'cOnly'); тоже подлежит правке  'МаcOnly' отработает
Ну, код, который вы критикуете, не dmitry_stas, а effrit написал. Да, там есть лишнее, но он же не претендует на идеал - он просил помощи. Могли бы дать ему свой вариант.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13152
  • 1232 / 8
я честно говоря не очень понимаю о чем вы, про много вариантов. в $modules он попал прямехонько из базы, выборкой. если бы можно было вмешиваться в запрос, чтобы сразу выбрать нужное, то ок, но в выборку к сожалению вмешаться плагином нет возможности. поэтому тут то особо не разгуляешься. да и честно говоря время затраченное на перебор в цикле php, и время затраченное базой на доп условие в запросе, будет я думаю практически идентично. так то в общем случае безусловно вы правы, лучше бы сразу нужное, но конкретно в данном не думаю что за это стоит переживать. тем более что все равно возможностей других то не особо есть...
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 731 / 7
  • Все начинается с Value
если бы можно было вмешиваться в запрос
никто вам не мешает сделать свой запрос по событию onPrepareModuleList
Код
$modules = null;

$app->triggerEvent('onPrepareModuleList', array(&$modules));

// If the onPrepareModuleList event returns an array of modules, then ignore the default module list creation
if (!is_array($modules))
{
$modules = static::getModuleList();
}
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
никто вам не мешает сделать свой запрос по событию onPrepareModuleList
Не вижу практической выгоды в этом: вы добавите свои where в запрос, но сам запрос-то никуда не денется. IMHO, дискуссия уже приобрела софистический характер.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 731 / 7
  • Все начинается с Value
robert научитесь пользовтся переводчиком если не знаете английский
если по событию onPrepareModuleList плагин вернет в $modules массив
static::getModuleList(); выполнятся не будет
вы добавите свои where в запрос, но сам запрос-то никуда не денется. IMHO, дискуссия уже приобрела софистический характер.
вы о чем? где вы видите дискусию?
effrit написал, что у него связаны руки из-за фреймворка шаблона
dmitry_stas привел решение и ему за это плюс, что он уделил время в решении, и да оно не идеально и он сам увидел это
вы же не разбираясь "софистический характер"
это в какой среде такими словами бросаются?
*

effrit

  • Легенда
  • 10089
  • 1111 / 13
  • effrit.com
Fedor Vlasenko, спасибо за замечание, про вхождение подстроки я как-то на радостях и не подумал  ;D
хотя там регистр используется, так что шанс ложного срабатывания все равно стремится к нулю.

замечание по оптимизации производительности лично для меня практического смысла не имеет, т.к. я банально не понимаю, что с ним делать  ;D
но, может кто допишет до состояния копипасты.

в любом случае, думается, что взятый на вооружение вариант всяко предпочтительнее стельбы из крейсера АдвеседМодулМанагера по моим воробьям, так что я свой ответ получил ).
и вообще, давайте жить дружно, а то вы сейчас подеретесь а мне потом и спросить не у кого будет (такой вот я корыстный пацифист  ;D)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
robert научитесь пользовтся переводчиком если не знаете английский
если по событию onPrepareModuleList плагин вернет в $modules массив
static::getModuleList(); выполнятся не будет
^-^
Плагин вернет массив  $modules без какого-либо запроса, правильно ли я вас понимаю?
"софистический характер"
это в какой среде такими словами бросаются?
Ок, погорячился, забудем про "софистический характер" ^-^.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13152
  • 1232 / 8
никто вам не мешает сделать свой запрос по событию onPrepareModuleList
ох я бы так не делал, брать на себя полностью логику формирования запроса. сильная зависимость имхо от плагина получается. рискуем нарваться на ситуацию, когда разработчики Joomla добавят какое то условие в запрос, или типа такого, а в плагине это не будет учтено, и все перестанет работать. нужно будет следить с каждым обновлением Joomla, не поменялся ли этот момент в ядре
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Пример создания модуля с прикреплением файлов

Автор Zelyonkin

Ответов: 7
Просмотров: 314
Последний ответ 02.08.2021, 17:04:15
от Zelyonkin
Отображение модуля меню на странице материала

Автор kunsaid

Ответов: 9
Просмотров: 353
Последний ответ 21.07.2021, 10:50:29
от kunsaid
[Решено] Модули шаблона Helix 3

Автор Egoritch

Ответов: 3
Просмотров: 272
Последний ответ 27.05.2021, 13:26:52
от Egoritch
[РЕШЕНО]Скрыть пункт меню на мобильных устройствах

Автор lexxbry

Ответов: 13
Просмотров: 2557
Последний ответ 22.05.2021, 16:20:11
от PrimitiveFish
[Решено] CSS-класс заголовка модуля

Автор schel4ok

Ответов: 36
Просмотров: 15063
Последний ответ 06.04.2021, 23:35:20
от Wak