Новости 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 Гость просматривают эту тему.
  • 15 Ответов
  • 1384 Просмотров
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Добрый день.
Есть статья. Текст в редакторе разделен кнопкой "Подробнее"
Как сделать чтобы незарегистрированные пользователи не смогли прочитать статью?
В настройках менеджера материалов "Показывать ссылки не авторизованным" стоит нет. В описании
пункта написано
Цитировать
Если установлено значение Да, то ссылки на просмотр полного текста материалов смогут видеть все пользователи, в том числе, не прошедшие авторизацию, но для просмотра полного текста система потребует ввести логин и пароль.
Я и да ставил и нет - все равно кнопка "Подробнее" открывает полный текст материала
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
потребуется переопределить макет материала и обернуть вывод полного текста материала в условие, проверяющее авторизацию пользователя

это внештатный функционал, только дописка по месту

"Показывать ссылки не авторизованным" - это про другое совсем, не связано с вашим вопросом
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@AlekVolsk
"Показывать ссылки не авторизованным" - это про другое совсем, не связано с вашим вопросом
ясно.

потребуется переопределить макет материала и обернуть вывод полного текста материала в условие, проверяющее авторизацию пользователя
А можно, для особо грамотных :), чуть подробнее?
Цитировать
обернуть вывод полного текста материала в условие
- по идее должно быть событие нажатия кнопки "Подробнее" ?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
@AlekVolsk  ясно.
А можно, для особо грамотных :), чуть подробнее? - по идее должно быть событие нажатия кнопки "Подробнее" ?
нет, "подробнее" - это просто ссылка на страницу материала из категории, не более. стандартный блоговый функционал

переопределение шаблона материала Joomla - легко гуглится
проверка авторизованности пользователя Joomla - легко гуглиться
вывод по условию - это уже надо составлять логику, что будет выводиться для неавторизованного пользователя (гостя) и писать соответствующий код

если вы не знаете PHP, то лучше наймите специалиста, ваша задача несложная и недорогая
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@AlekVolsk
Где-то на этапе формирования страницы должен быть код на проверку материала на наличие в нем тега
<hr id="system-readmore" />
Почему нельзя в этом месте сделать проверку на авторизованость пользователя и просто не показывать вообще кнопку "Продробнее"?
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Как бы разобрался.
@AlekVolsk  Все намного проще.
за формирование кнопки "Подробнее" отвечает layouts\joomla\content\readmore.php
вот что я наваял
Код
<?php $user = JFactory::getUser(); if ($user->guest == 1) :?>
<a class="btn" href="index.php?option=com_users&view=login" itemprop="url" aria-label="<?php echo JText::_('COM_CONTENT_REGISTER_TO_READ_MORE'); ?>
<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>">
<?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?>
<?php echo JText::_('Надо бы зайти'); ?>
</a>
<?php elseif (!$params->get('access-view')) : ?>

посмотрите, может надо что-то подправить? или выкинуть лишнее :)
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Да, спасибо за ответы - натолкнули на мысли
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Как закрыть тему что она решенная?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
layouts\joomla\content\readmore.php
надеюсь, вы его переопределили в основном шаблоне сайта? иначе при обновлении Joomla ваши правки затрутся

но в целом это надо делать в шаблоне материала, а не разделителя
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
надеюсь, вы его переопределили в основном шаблоне сайта?
Неа, не подумал об етом.
А в шаблоне сайта нету такого файлика.
шаблоне материала
- не подскажете где его искать?
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Дело в том что в шаблоне readmore  встречается только в classes.js
Код
var p = document.getElementsByTagName("p");
for (var i = 0; i < p.length; i++) {
    if (p[i].className === 'readmore') {
        p[i].className = 'btn';
    }
}
только я не понял что данная функция делает
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Точнее не во всех шаблонах описывается клас <p class="readmore">
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
А можно как-то автоматически вставить код в *.php  - сделать что-то типа плагина - Joomla обновилась и загнал свой код?
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
А в шаблоне сайта нету такого файлика
Нужно самому создать переопределение в шаблоне /templates/name_template/html/layouts\joomla\content\readmore.php
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Нужно самому создать переопределение в шаблоне /templates/name_template/html/layouts\joomla\content\readmore.php
@draff отлично помогло - просто скопировал файл с сохранением пути. Хорошо, а если в шаблоне есть определение класса readmore  но нет файла readmore.php  и я его закину - у чего будет больший приоритет ? или надо просто пробовать?
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
а если в шаблоне есть определение класса readmore  но нет файла readmore.php  и я его закину - у чего будет больший приоритет
Класс PHP ? Читайте ман про классы
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Убрать дубли статьи в Joomla 3

Автор Benderalfa

Ответов: 0
Просмотров: 623
Последний ответ 13.04.2022, 18:45:36
от Benderalfa
reCAPTCHA неверный ключ домена только у клиента

Автор max_max

Ответов: 2
Просмотров: 881
Последний ответ 13.10.2021, 18:53:56
от draff
Подтянуть картинки из поля "полного материала" в поле "вступительного"

Автор max_max

Ответов: 9
Просмотров: 1199
Последний ответ 01.10.2021, 12:58:04
от ShopES
;Устарело; рядом с названием статьи

Автор kudymkar

Ответов: 6
Просмотров: 933
Последний ответ 02.09.2021, 20:01:15
от kudymkar
Изменить background заголовка статьи

Автор alekckim

Ответов: 5
Просмотров: 870
Последний ответ 01.09.2021, 13:29:18
от alekckim