Новости Joomla

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

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

Kumigy

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Доброго времени суток, Форумчане.
Подскажите пожалуйста как сделать так, что бы блок вывода контента был виден на всех страницах кроме главной?
« Последнее редактирование: 29.08.2013, 10:11:14 от b2z »
*

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Доброго времени суток, Форумчане.
Подскажите пожалуйста как сделать так, что бы блок вывода контента был виден на всех страницах кроме главной?
Примерно так:

Код
$menu = & JSite::getMenu();

<?php if ($menu->getActive()!= $menu->getDefault()) {?>
        <jdoc:include type="component" />
<?php } ?>
Мои расширения - http://eco-joom.com/ru/
*

Kumigy

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Примерно так:

Код
$menu = & JSite::getMenu();

<?php if ($menu->getActive()!= $menu->getDefault()) {?>
        <jdoc:include type="component" />
<?php } ?>

Извиняюсь за наглость, не мог бы ты объяснить, что есть что в этом кусочке. Хочется очень понимать что я делаю))) Я лишь только понял, что переменную меню сравниваем с дефолтовым меню и при успешном сравнении выводим контент.
*

Kumigy

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
<?php
$menu =& JSite::getMenu();
?>
<?php if ($menu->getActive()!= $menu->getDefault()) : ?>
<div id="content">
        <jdoc:include type="component" />
</div>
<?php endif ?>


вот так вот у меня заработало)

огромное спасибо
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Я лишь только понял, что переменную меню сравниваем с дефолтовым меню и при успешном сравнении выводим контент.
Так и есть ;) Чуток подправил код, для общего использования и добавил тему в J1.6 FAQ.

Код: php
<?php
$menu = JSite::getMenu();
if ($menu->getActive()!= $menu->getDefault()): ?>
        // здесь выводим все, что не хотим показать на главной
<?php endif; ?>
*

kozovod

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Добрый день.
А если наоборот, необходимо вывести контент только на главной странице, она же главная страница JoomShopping?
*

DaVinchy

  • Захожу иногда
  • 326
  • 42 / 3
А если наоборот, необходимо вывести контент только на главной странице, она же главная страница JoomShopping?
воскл. знак в коде уберите
*

Виталик

  • Завсегдатай
  • 1244
  • 130 / 0
Код: php
<?php
$menu = JSite::getMenu();
if ($menu->getActive()!= $menu->getDefault()): ?>
        // здесь выводим все, что не хотим показать на главной
<?php endif; ?>
а может лучше сравнивать только id: $menu->getActive()->id == $menu->getDefault()->id а не целые объекты?
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
а может лучше сравнивать только id: $menu->getActive()->id == $menu->getDefault()->id а не целые объекты?

Да так будет более правильнее. Исправил код:

Код: php
<?php $menu = JSite::getMenu();
if ($menu->getActive()->id != $menu->getDefault()->id): ?>
        // здесь выводим все, что не хотим показать на главной
<?php endif; ?>


Код: php
<?php $menu = JSite::getMenu();
if ($menu->getActive()->id == $menu->getDefault()->id): ?>
        // здесь выводим все, что хотим показать на главной
<?php endif; ?>
*

Kumigy

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Ребят, поясните пожалуйста,ну так для общего развития, чем второй вариант правильнее?
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
В первом варианте мы сравниваем целые объекты (меню), а во втром варианте только свойсто id объектов (меню).
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Не срабатывает, если например находимся мы на главной странице и на главной, есть поиск - Нажимаем искать и Itemid остаётся тот же что и на главной. Или вывод модуля последних материалов(mod_articles_latest). Itemid - остаётся тот же, в ссылке меняется только id - новости.
И вообще не пойму что это за Itemid, к которому идёт привязка вывода позиций(я так понял)
« Последнее редактирование: 21.06.2011, 19:09:27 от TerribleZ »
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Itemid - это уникальный Id пункта меню. Видимо у Вас не на все разделы созданы пункты меню, поэтому он остается один и тот же.
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Конечно не на все. Я ж не буду создавать пункт меню на поиск если он у меня выводится в виде модуля. И не буду ж создавать меню для каждой вновь созданной новости.
Решил проблему так:
Код
<?php if (JRequest::getVar('view', null) == 'featured'): ?>
// здесь выводим все, что хотим показать на главной
<?php endif; ?>
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
JRequest::getVar('view') == 'featured' - это проверка на страницу с избранными материалами. Если она у Вас главная, то все ок. Если же главаная другая страница, то этот код не сработает.
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Ещё проблема. Ставлю в настройке модуле "Привязка к пунктам меню" -> "Привязка модуля" -> "На всех страницах, кроме указанных" и выбираю не показывать когда пункт меню "Главная". Вроде всё ок.
НО! модуль также не отображается на тех страницах где нет никакой привязки к пунктам меню т.е. Itemid - не существует.
К примеру страница регистрации "site.ru/index.php?option=com_comprofiler&task=registers" или страница поиска "site.ru/index.php?searchword=слово&searchphrase=all&option=com_search".
Как решить эту проблему?
*

saturn

  • Осваиваюсь на форуме
  • 19
  • 0 / 0

<?php $menu = JSite::getMenu();
if ($menu->getActive()->id != $menu->getDefault()->id): ?>
        // здесь выводим все, что не хотим показать на главной
<?php endif; ?>


Подскажите, пожалуйста, куда нужно это вставить?
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Подскажите, пожалуйста, куда нужно это вставить?
как вариант:
www\templates\название_вашего_шаблона_сайта\index.php
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Ещё проблема. Ставлю в настройке модуле "Привязка к пунктам меню" -> "Привязка модуля" -> "На всех страницах, кроме указанных" и выбираю не показывать когда пункт меню "Главная". Вроде всё ок.
НО! модуль также не отображается на тех страницах где нет никакой привязки к пунктам меню т.е. Itemid - не существует.
К примеру страница регистрации "site.ru/index.php?option=com_comprofiler&task=registers" или страница поиска "site.ru/index.php?searchword=слово&searchphrase=all&option=com_search".
Как решить эту проблему?
Как вариант - создать меню (которое нигде не будет выводится), и в нем сделать пункты для index.php?option=com_comprofiler&task=registers и index.php?searchword=слово&searchphrase=all&option=com_search
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Как вариант - создать меню (которое нигде не будет выводится), и в нем сделать пункты для index.php?option=com_comprofiler&task=registers и index.php?searchword=слово&searchphrase=all&option=com_search

Это не есть решение проблемы, так как таких ссылок на сайте будет добавляться больше в зависимости от расширения возможностей(добавления новых компонентов) сайта. К примеру вот ещё сылки index.php?option=com_comprofiler&task=lostpassword (ввостановление пароля) или index.php?option=com_some_component&view=events(какой-то компонент).

Ваши предложения? Буду очень благодарен.
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
*

czp

  • Новичок
  • 6
  • 0 / 0
Извеняюсь что пишу в этой теме, но что бы новую не создавтаь решил в похожей, есле что могу новую, подскажите как сделать что бы:
1.Когда заходит админ на сайт он видел БЛОК1 и в нем спрятаную инфу
2.А когда заходит модератор или кто то ниже с рангом, то он видит БЛОК2 а БЛОК1 он не видит?
3.Ну и естественно обычные бзеры не видят БЛОК1 и БЛОК2
я так понял там PHP код с доступом, типа аккес ну там ненмого поглядел в коде Joomla но сам не знаю как сделать подскажите как написать код
*

DaVinchy

  • Захожу иногда
  • 326
  • 42 / 3
czp, здесь посмотрите
*

czp

  • Новичок
  • 6
  • 0 / 0
ну не фурычит вот так написал, пробовал вместо администратора писать ник всеровно не фурычит, может из за того что Joomla 1,6 а там бы мануал на 1,5?

Код
<?php
$user =& JFactory::getUser();
?>
<?php if($user-> Administrator) : ?>
<div class="tos">

</div>
<?php endif ?>

перепробовал все доступные там комбинации не робит, помогите ! :(
« Последнее редактирование: 09.07.2011, 00:04:46 от czp »
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
В 1.6+ группы можно переименовывать. Поэтому проверку лучше делать по ID группы. По умолчанию администратор находится в группе Super Users и ID этой группы 8. Проверить можно так:

Код: php
<?php
$user = JFactory::getUser();
if ( in_array( 8, $user->groups ) ) : ?>
Здесь выводим блок для Super Users.
<?php endif; ?>

Посмотреть ID групп можно в Менеджер пользователей -> Группы пользователей.
*

czp

  • Новичок
  • 6
  • 0 / 0
заработало,благодарю)) еше такой вопрос есле можно, есть что то типа jcoments на  1.6  а то тот модуль только с 1,5 робит а мне нужны, коменты подскажите есле не сложно
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
заработало,благодарю)) еше такой вопрос есле можно, есть что то типа jcoments на  1.6  а то тот модуль только с 1,5 робит а мне нужны, коменты подскажите есле не сложно
Читаем Правила форума! Одна тема = один вопрос!
*

TerribleZ

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
А что я могу предложить? Так работает Joomla...
Решил свою проблему. Вроде бы правильно.
Т.е. если нам нужно вывести модуль везде кроме выбранных страниц(параметр "Все, кроме выбранных"). Т.е. независимо существует ItemId или нет(есть привязка к меню или нет).
Нужно в файле \libraries\joomla\application\module\helper.php
Добавить строку после строчек 317-318, чтоб было так:
Код
$negHit = ($negId === (int) $module->menuid)
|| (!$negId && (int)$module->menuid < 0);
if (!$negId && $module->menuid <0) {$negHit = 0;}



« Последнее редактирование: 11.07.2011, 17:38:49 от TerribleZ »
*

nik_neman

  • Захожу иногда
  • 52
  • 2 / 0
Спасибо. То что искал.
« Последнее редактирование: 18.01.2012, 14:46:03 от nik_neman »
*

wfedin

  • Завсегдатай
  • 1273
  • 102 / 0
Нашёл решение от:
Код: php-brief
<?php if (JURI::current() == JURI::base()) : ?>
<jdoc:include type="modules" name="имя позици модуля ваше" />
<?php endif; ?>
На данный момент лучший вариант проверки на главную
вставлять в файл шаблона отвечающий за вывод модулей. Обычно index.php
В клубных шаблонах ищите в папке layouts обычно
Хотелось бы понять достоинства и возможные недостатки обоих подходов
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод материала в результатах поиска всего или до подробнее

Автор Drawmy

Ответов: 0
Просмотров: 1638
Последний ответ 02.02.2017, 16:41:38
от Drawmy
Отображение материала на главной

Автор timssky

Ответов: 13
Просмотров: 1895
Последний ответ 15.12.2016, 17:26:48
от timssky
Вывод информации на страницах материала после заголовка

Автор GuardianStation

Ответов: 5
Просмотров: 1765
Последний ответ 16.11.2016, 13:06:48
от effrit
Как редактировать код HTML на главной странице сайта?

Автор geroi1

Ответов: 45
Просмотров: 91969
Последний ответ 29.10.2016, 13:16:19
от savole
При добавлении к адресу главной страницы UTM метки отображается другая страница

Автор Xenoks

Ответов: 4
Просмотров: 1877
Последний ответ 28.10.2016, 16:37:22
от Xenoks