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

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Подскажите как правильно сделать ссылки и правильно ли я вообще (в джумловской идеологии) делаю следующее:

Написал компонент на базе примеров (что то типа галлереи).
пусть называется com_xxx
У него есть 2 views.
xxx - это как я понимаю default служит для отображения списка картинок со страницами.
one - показывает единичную картинку.
У каждого из них один по одному tmpl/default.php

сделал пункт меню со ссылкой на view=xxx

Теперь мне нужно делать различные ссылки чтобы листать страницы.
Делаю так:

узнаю какая страница и какой пункт меню:
$pagecurrent = JRequest::getVar('page', 0, '', 'int');
$menuitem = JRequest::getVar('Itemid', 1, '', 'int');

делаю ссылку например на следующую страницу
$link = JRoute::_("index.php?option=com_xxx&view=xxx&Itemid=".$menuitem."&page=".($pagecurrent+1));

Получается такая ссылка и вроде все работает:
index.php?option=com_xxx&view=xxx&Itemid=2&page=1

Что не нравиться:
- Понятно что так раз работает делать можно, но правильно ли? Может есть более изящные решения?

- Включаю SEO.
 
  ссылка получается такой в меню:
  gallery.html?view=xxx
 
  И такой на слудующую страницу у меня:
  gallery.html?view=xxx&page=1
 
  Как избавиться от view=xxx при включеном SEO.
  И без SEO Зачем при создании меню добавляется view=xxx если он и так исспользуется по умолчанию?
 
- На будущее можно ли избавиться и от page=1 если это будет параметр обозначающий не страницу, а разные галлереи.
  т.е. наверное можно завести пункты меню для каждого из них с каким-нибудь параметром и задать там уже имена. (gallery_oleg, gallery_dima).
  или есть какойто еще подход?

Спасибо.
*

shprota

  • Давно я тут
  • 770
  • 53 / 1
  • Тружусь, не покладая рук
Re: Как правильно делать ссылки?
« Ответ #1 : 23.03.2009, 22:55:30 »
Для разбивки на страницы и вывода ссылок лучше использовать класс JPagination

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

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Re: Как правильно делать ссылки?
« Ответ #2 : 24.03.2009, 10:20:32 »
спасибо большое. буду вникать.
*

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Re: Как правильно делать ссылки?
« Ответ #3 : 24.03.2009, 16:16:57 »
написал router.php вроде все работает (открываются нужные мне странички).

но я пользуюсь shadowbox
http://mjijackson.com/shadowbox/index.html
вот он перестал работать.
это набор js.

причем если вбить полную строчку
http://127.0.0.1/gallery.html?view=one&element=batman
то работает (экран темнеет и открывается картинка),
а если сокращенную
http://127.0.0.1/gallery/batman.html
то просто тупо переходит на картинку.

Посмотрел в Mozilla  - Error console
при сокращенной ссылке там появляется надпись:
uncaught exception: No Shadowbox language loaded

там где грузится язык в полученом html просто строчка
Shadowbox.loadLanguage('ru', 'components/com_xxx/javascript/shadowbox/lang');

а в самом скрипте:

    Shadowbox.loadLanguage = function(lang, dir){
        if(!(/\/$/.test(dir))) dir += '/';
        // Safari 2.0 fails using DOM, use document.write instead
        document.write('<scr' + 'ipt type="text/javascript" src="' + dir + 'shadowbox-' + lang + '.js"><\/script>');
    };

Подозреваю проблема не только в загрузке языка. просто чтото неправильно работает.

(обрабатывается и ссылка на js? )

В чем может быть проблема?

*

shprota

  • Давно я тут
  • 770
  • 53 / 1
  • Тружусь, не покладая рук
Re: Как правильно делать ссылки?
« Ответ #4 : 24.03.2009, 16:20:12 »
Сложно сказать, в чем там проблема. Но, как мне видится, вы не просто картинку открыть пытаетесь, а HTML страницу с картинкой. Проще дать ссылку сразу на файл картинки, я думаю.
*

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Re: Как правильно делать ссылки?
« Ответ #5 : 24.03.2009, 17:21:40 »
ссылка выглядит так
<a rel="shadowbox[MustangThumbs];options={counterType:'skip',continuous:true,animSequence:'sync'}" href="/gallery/batman/pic4.jpg"><img class="gallery" src="/gallery/batman/thumbnail4.gif" width="140" height="85" /></a>

Чтото наверное при инициализации неправильно происходит

Я к сожалению в js практически не разбираюсь. и тяжело понять куда смотреть. И подозреваю что скрипты сами не при чем.

Спасибо за участие :)
*

shprota

  • Давно я тут
  • 770
  • 53 / 1
  • Тружусь, не покладая рук
Re: Как правильно делать ссылки?
« Ответ #6 : 24.03.2009, 17:27:56 »
скрипты ни при чем. возможно, в раутере ошибка, и вызывается, например, не тот контроллер или не тот view, и в итоге не вызывается инициализация скрипта.
*

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Re: Как правильно делать ссылки?
« Ответ #7 : 24.03.2009, 17:36:23 »
т.е. при попытки загрузить скрипт например в этот момент
 document.write('<scr' + 'ipt type="text/javascript" src="' + dir + 'shadowbox-' + lang + '.js"><\/script>');
ему подменяется путь?

а если для эксперимента вынести папку с shadowbox из компонента? раутер все равно будет вызван. или тогда ссылка не будет обрабатываться?
*

shprota

  • Давно я тут
  • 770
  • 53 / 1
  • Тружусь, не покладая рук
Re: Как правильно делать ссылки?
« Ответ #8 : 24.03.2009, 17:45:21 »
А зачем скрипт так странно грузится?
Видимо, он грузится по относительному пути, а SEF ссылка направляет его не туда.
Проще всего - в компоненте написать
Код
JHTML::script('shadowbox.js', 'components/com_xxx/assets/shadowbox/');
JHTML::script('shadowbox-lang.js', 'components/com_xxx/assets/shadowbox/');
*

severum

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Re: Как правильно делать ссылки?
« Ответ #9 : 25.03.2009, 12:55:39 »
Спасибо.

я скрипты добаляю так
$doc =& JFactory::getDocument();
$doc->addScript( "..." );
$doc->addScriptDeclaration( "..." );
Это одно и тоже?
чтобы мне на будущее знать.

скрипты грузятся просто по инструкции подключения shadowbox

Проблему победил.
При включеном SEO меняется рабочий путь и скрипты которые пытаются подгрузить дальше уже не от туда грузятся
а вот так уже работает
Shadowbox.loadLanguage('ru', '/components/com_xxx/javascript/shadowbox/lang');

:)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как правильно прописать JRoute

Автор voland

Ответов: 9
Просмотров: 8069
Последний ответ 24.03.2012, 00:17:27
от chikvito
Как можно обработать все ссылки сайта в urlencode ?

Автор Виталик

Ответов: 0
Просмотров: 1655
Последний ответ 13.08.2010, 23:23:44
от Виталик
как правильно обращаться к базе данных

Автор salikoff

Ответов: 23
Просмотров: 6789
Последний ответ 29.06.2009, 14:07:16
от w00
Скрипт для генерации ссылки на случайную статью

Автор minuby

Ответов: 2
Просмотров: 2065
Последний ответ 16.02.2009, 14:46:02
от minuby