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

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Что такое каноническая ссылка и об атрибуте rel="canonical".
Предлагаю решение для построения канонических ссылок(в комплекте com_content, com_contact, com_weblinks, плагин расширяем для других компонентов).
Плагин нужно тестировать, о багах и глюках, а также пожеланиях и прдлжениях прошу писать в этой теме.
Инструкция по подключению. Joomla 3.0
1. Скачиваете плагин.
2. Устанавливаете плагин.
3. Расширения менеджер плагинов - включаете плагин.
Плагин временно удален. В Joomla версии 3.1 на которой тестировал, неправильно работает роутер.
Можете убедится
ваш сайт/component/content/article.html?id=7 здесь 7 ид материала из админки
Код: php
$url = JURI::getInstance()->toString();
$uri = JURI::getInstance($url);
$query = JFactory::getApplication()->getRouter()->parse($uri);
var_dump($query );
выведет id='article' это ошибка должно быть в нашем случае  id='7'
Буду просматривать обновления поправят роутер перепишу плагин
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: Канонические ссылки для com_content
« Ответ #1 : 07.11.2012, 13:47:03 »
Круть! Я прям в шаблон запилил. Полезная наработка.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #2 : 07.11.2012, 13:54:08 »
А почему для категорий используется напрямую JRoute, а не ContentHelperRoute::getCategoryRoute. Или это сделано ради уточнения конкретного layout?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #3 : 07.11.2012, 14:13:35 »
Формирование ссылок взял по аналогии стандартного меню. Есть предложение по формировании ссылок для блога вставим.
В конце написания возникла мысль а может $uri->toString(array('fragment')) хватит на все это дело для других компонентов?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #4 : 07.11.2012, 15:34:22 »
Спасибо! Поправил. Архив перезалил. Каждый по строчке кода и может кому то пригодится ^-^
*

b2z

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

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #6 : 07.11.2012, 19:20:12 »
Плагин нужен однозначно! Причем особых технических препятствий для этого я не вижу - даже если в лоб делать и вырезать/вставлять ссылки на onAfterRender ;)
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #7 : 07.11.2012, 19:36:07 »
Плагин написать не сложно. Вот интересно было обсудить о расширяемости этого плагина, подключения новых компонентов для обработки и каких-то специфических требований к самим ссылкам. Может  у кого то пожелания будут
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #8 : 07.11.2012, 19:38:05 »
Так реализовать в плагине абстрактный класс-адаптер, вложить в него плагины для встроенных компонентов, а дальше пополнять тем, что пришлет народ (я надеюсь, что народ-то не останется в стороне). Но в любом случае плагин нужен, править руками код в наше время уже как-то даже неприлично

эм для каких именно специфических компонентов, можно пример?
ой, можно подумать мало таких :)
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #9 : 07.11.2012, 19:44:41 »
frisian неправильно понял или я не так выразился.  для начала развернуть для стандартных компонентов. я говорю о том, чтобы с легкостью можно было расширять, подключать обработку других компонентов. Пока писал smart написал про то, что я имею ввиду
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #10 : 07.11.2012, 20:02:05 »
(правда пока писал нашел один минус в этой идее.. если кто то что то в плагине ручками допишет то потеряет это при обнове плагина)
ничего подобного - можно сделать чтобы из папки adapters грузились адаптеры вида componentname.php, но перед этим  проверялось, а нет ли componentname.override.php, и если есть - использовать перегруженный. И овцы целы, и волки сыты и пастуху - вечная память.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #11 : 08.11.2012, 13:01:27 »
Написал первую версию плагина. Тестируйте. Принимаются пожелания и замечания
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #12 : 08.11.2012, 13:12:47 »
О, это уже интересно. Только форматирование кода все-таки приведи к используемому в Joomla? Сейчас читать просто невозможно... Да и лучше, когда точка выхода из метода одна, а не десяток return'ов по всему телу метода. И еще, а где объявлена переменная $option? И еще, если используется нестандартный порт (ну допустим 8088), работать будет?

p.s. Я бы все-таки эти адаптеры сделал бы классами, и инициализировал их извне данными. В конце концов в базовом можно получить все основные переменные (layout, view, document), а уже в наследниках вытягивать то, что требуется из текущей ссылки и строить каноническую ссылку.
« Последнее редактирование: 08.11.2012, 13:17:12 от smart »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #13 : 08.11.2012, 13:22:50 »
extract($app->getRouter()->parse($uri)); - Здесь берем option
Объявим перменную на всякий случай. Код приведем. Больше интересует удобство такого подхода (com_newcomponent.php). Чтобы добавить свой компонент нужно добавить файл с системным именем компонента.php в папку component  в котором определена переменная $can_url
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #14 : 08.11.2012, 13:27:54 »
extract($app->getRouter()->parse($uri)); - Здесь берем option
на мой взгляд не очень читабельно и удобно - т.е. визуально сказать нельзя, какие переменные в результате определены и какие у них значения. И еще, когда мы используем jrequest, у нас под рукой вся мощь фильтрации входных данных, а тут - после parse у нас просто ассоциативный массив, а что если в $option будет не название компонента, а допустим путь к файлу из каталога выше? или еще откуда-то? опасно...
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Re: Канонические ссылки для com_content
« Ответ #15 : 08.11.2012, 13:32:57 »
$option - согласен с Сергеем.

И читать трудно. Бей на приватные методы. Постарайся onBeforeCompileHead преврарить чисто в интерфейс, не грузи его кучой кода.

Насчет подхода - я, пока, не вижу других вариантов, так как файл тебе все равно будет нужен. Может быть действительно внутри файлов сделать классы, как Сергей предложил.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #16 : 08.11.2012, 13:39:46 »
Да пусть будет файл, кто против... но пусть этот файл будет классом... а не куском кода, который непонятно что и откуда берет
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #17 : 08.11.2012, 13:42:21 »
Но ведь мы и не знаем заранее как будет форматироваться query строка чужого компонента. Что там будет article или city к примеру. А таким образом мы получим все переменные. jrequest и новый Jinput здесь не помогут. Откуда я знаю наименования переменных чужих компонентов, чтобы их объявить. Понял вы хотите запрашивать только в option , а все остальное переложить на файл подключенный
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #18 : 08.11.2012, 15:06:37 »
Ну так вытащи в плагине только то, что нужно - option, проведи фильтрацию и подключай адаптер, а уже внутри адаптера, пусть каждый вытаскивает из массива те переменные, которые требуются. То что сейчас - и не безопасно и не предсказуемо. Ну вот представь, что в ссылке будет &doc=test или &app=comments, что произойдет после extract? Правильно - переменные $app и $doc получат значения 'test' и 'comments'. А что будет дальше, когда ты вызовешь $doc->language? Все упадет с ошибкой! А если в ссылке будет domain?

Не, все эти extract - зло, причем абсолютное зло.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #19 : 08.11.2012, 22:31:52 »
Написал версию 2. Если есть сбросьте ссылку на документацию по оформлению кода в Joomla.
Цитировать
в плагине абстрактный класс-адаптер, вложить в него плагины для встроенных компонентов
Не знаю, имеет ли смысл. Подключенный файл, задает(возвращает) нам сформированную ссылку для своего компонента. Писать его в виде класса?
*

b2z

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

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #21 : 16.11.2012, 19:46:11 »
Написал 3 версию. Подправил код и логику. Добавил  обработку com_contact, com_weblinks
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #22 : 16.11.2012, 19:53:14 »
А зачем в com_weblinks.php и com_contact.php строчка:
Код: php
if(!class_exists('ContentHelperRoute')) require_once (JPATH_SITE . '/components/com_content/helpers/route.php');

И зачем файл com_newcomponent.php, если в нем нет ни логики ни какой? Только людей будет смущать.

и еще, если уж задаем значение по умолчанию при получении значения option, то уж давайте сразу добавим проверку, что оно не пустое.

Хм, значение $this->domain лучше установить в конструкторе, это гарантирует, что оно будет на момент вызова add_link.
*

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Re: Канонические ссылки для Joomla 3
« Ответ #23 : 16.11.2012, 20:28:55 »
Не вдаваясь в подробности, задам вопрос - не будет ли это очередным тормозом в и так не быстром движке? Плагин использует дополнительные запросы?
Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #24 : 16.11.2012, 21:43:41 »
Поправил. И еще несколько ошибок.
Шмайсер не тормозит плагин. Чего он должен тормозить. Гляньте код. Конструктивная критика приветсвуется
*

Demour

  • Осваиваюсь на форуме
  • 47
  • 0 / 0
Re: Канонические ссылки для Joomla 3
« Ответ #25 : 18.11.2012, 08:04:50 »
Отличный плагин, спасибо!
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #26 : 19.11.2012, 12:08:57 »
@Poznakomlus: кстати, вот если бы ты меня послушал и реализовал адаптеры для различных расширений в виде некоего класса, то можно было бы сделать полный изюм - закэшировать вызов метода адаптера, возвращающий ссылку, и свести нагрузку, создаваемую плагином, фактически к нулю. Ведь я думаю не секрет, что каждый вызов getArticleRoute это один запрос к БД, а если на странице таких ссылок 50, то это будет 50 лишних запросов (по крайней мере если сайт мультиязычный - точно).
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #27 : 19.11.2012, 12:15:21 »
Да, вопрос  по коду:

Код: php
private function add_link($url)
{
$doc = JFactory::getDocument();

unset($doc->_links[array_search(array('relation' => 'canonical', 'relType' => 'rel', 'attribs' => array()), $doc->_links)]);

$url = $this->domain.JRoute::_($url);

if($this->current_url != $url)
{
$url = explode('?', $url);
$doc->addHeadLink($url[0], 'canonical');
}
}

А точно unset должен быть до проверки неравенства  $this->current_url и $url? Т.е. получается, что если ссылки равны, плагин вырезает canonical ссылку?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #28 : 19.11.2012, 13:08:10 »
Цитировать
реализовал адаптеры для различных расширений в виде некоего класса, то можно было бы сделать полный изюм
это входит в планы, кроме этого со временем планируется управление подключением расширениями, их обновлениями и т. д.
Цитировать
А точно unset должен быть до проверки неравенства  $this->current_url и $url? Т.е. получается, что если ссылки равны, плагин вырезает canonical ссылку?
Если это ссылка оригинального материала, которая мы считаем главной страницей этого материала, то тега canonical на странице быть не должно
*

Langoliers

  • Давно я тут
  • 621
  • 67 / 2
  • Если б Я изучал людей, то был бы паразитологом
Re: Канонические ссылки для Joomla 3
« Ответ #29 : 21.11.2012, 07:40:02 »
А почему бы не предложить исправление родного SEF плагина, который Неправильно добавляет этот тег?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Joomla 3 не пускает в админку (просто перезагружается страница) (гуглил, нашёл решение, не помогло)

Автор lifelover2b

Ответов: 11
Просмотров: 3736
Последний ответ 05.06.2025, 04:48:29
от andrey222
По поводу сессий Joomla 3

Автор azm1n

Ответов: 0
Просмотров: 498
Последний ответ 25.05.2025, 09:26:17
от azm1n
Стоит ли ставить плагин rel="canonical" на Joomla 3

Автор azm1n

Ответов: 2
Просмотров: 663
Последний ответ 09.05.2025, 12:39:18
от azm1n
Вывести поля профиля Joomla

Автор romagromov

Ответов: 11
Просмотров: 1717
Последний ответ 28.04.2025, 10:25:44
от sivers
Максимальная версия PHP для Joomla 3

Автор Dram

Ответов: 8
Просмотров: 2083
Последний ответ 27.03.2025, 10:40:29
от wishlight