Новости Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

👩‍💻 SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla.Компонент - менеджер цифровых проектов для Joomla! CMS. Компонент обеспечивает создание каталога цифровых проектов и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей.👩‍💻 v.2.5.0. Что нового?Схемы структур данных для серверов обновлений. Теперь с SW JProjects вы может создавать сервер обновлений не только для расширений Joomla, но и свои собственные. Например, вам нужно, чтобы структура данных сервера обновлений была другая и формат должен быть, например, не XML, а JSON. Формирование структуры данных для сервера обновлений расширений Joomla вынесено в отдельный плагин. Вы можете создать свой собственный плагин и реализовать в нём нужную вам структуру данных, добавив или наоборот исключив отображаемые данные. Сервер обновлений в компоненте по-прежнему отображает информацию о списке проектов и их версиях, о конкретном проекте и его changelog.Можно выбрать схему данных сервера обновлений глобально для всего компонента, выбрать другую схему данных для категории проектов, а так же выбрать схему в каждом проекте.

Разработчикам в качестве образца можно посмотреть плагин схемы данных для Joomla в составе компонента или же плагин-образец JSON-схемы на GitHub.
Группа плагинов swjprojects. Для нужд компонента создана группа плагинов swjprojects. В частности, в этой группе находится плагин структуры данных Joomla расширений для сервера обновлений.Изменение языковых констант. Изменены некоторые языковые константы в панели администратора. Если вы делали переопределение констант - переопределите их снова.👩‍💻 Joomla 6. Внесены изменения для корректной установки и работы компонента на Joomla 6. Компонент успешно протестирован на Joomla 6-beta2.Минимальная версия Joomla - 5. Подняты минимальные системные требования: Joomla 5.0.0 и PHP 8.1.
- Страница расширения👉 Плагин-образец кастомной JSON-схемы данных для сервера обновлений на GitHub.- GitHub расширения- Документация на GitHub- Joomla Extensions Directory#joomla #расширения

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Задача: реализовать региональность материалов.
Предполагаемое решение:
Создаю кнопку, по нажатию на которую открывается модальное окно с выбором нужных регионов, после чего в текст вставляется {нейкий_идентефикатор}id_региона,id_региона,id_региона,id_региона,id_региона{нейкий_идентефикатор}
Действия далее. Плагин берет из кукисов id_региона и выводит нужные материалы.
Минусы: эм... быстродействие? даже не знаю какой минус данного решения. Затрудняет разработку модуля последних материалов региона.
Плюсы: не затрагивает com_content, можно спокойно обновляться.
Вопрос: насколько этот решение плохое либо хорошее? М.б. есть какие-нибудь мысли по реализации? М.б. есть в реализации какие-то стыковые моменты, с которыми придется столкнуться?

« Последнее редактирование: 29.11.2012, 11:21:30 от xchesh »
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Минусов не вижу. Реализация с кукисами мне пока не совсем понятна, но это ладно. Я лучше Вам дам исходник кнопки ;)
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Минусов не вижу. Реализация с кукисами мне пока не совсем понятна, но это ладно. Я лучше Вам дам исходник кнопки ;)
Минусы минусы минусы...
Спасибо за исходник, как раз за 5 минут до сообщения, нашел его самостоятельно в Joomla :)

Так же взглянул на joomlagalery, они что-то наподобие реализовали. В итоге нужно: компонент, плагин добавления кнопки, плагин обработки контента.
Компонент у меня есть, осталось два плагина. Кнопку думаю по-быстрому наваяю. Но вот что-то обработка контента меня смущает. На какое событие вешать плагин? onContentPrepare? Допустим у меня есть тег в тексте {region}1,2,3,4,5{region} и значение региона у пользователя в кукисах(возьмем что он из 1-го региона). т.е. есть переменная $region-user = "1"; и $region-material="1,2,3,4,5"; А дальше я не знаю какая логика действий)))
Ладно, нужно изучить поподробнее плагины обработки контента.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Ну событие зависит от того, чего Вы хотите достичь. Если перед показом обработать, то onContentPrepare или onContentBeforeDisplay, если после, то onContentAfterDisplay.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Ну событие зависит от того, чего Вы хотите достичь. Если перед показом обработать, то onContentPrepare или onContentBeforeDisplay, если после, то onContentAfterDisplay.
Я хочу показывать либо не показывать материал на странице. Если параметр $region-user  есть в {region}1,2,3,4,5{region}, то показывать материал, если нету, то не показывать. Это наверное onContentBeforeDisplay? да?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Мне кажется, что тут лучше использовать onContentPrepare. Вот где вызываются эти события.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Мне кажется, что тут лучше использовать onContentPrepare. Вот где вызываются эти события.
Ага, согласен, лучше onContentPrepare использовать, т.к. это первое событие.
У меня задумка такая: общая страница коротких новостей с js фильтром по регионам. насколько это правильно и реализуемо - хз. Попробую сначала написать эти два плагина.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Мне кажется, что тут лучше использовать onContentPrepare. Вот где вызываются эти события.

Назрел ещё один вопрос. onContentPrepare это событие справедливо для всех видов вывода материалов? Для blog, article, arhive и т.п.?  В артикл, есть обработка события, но в остальных я вроде бы не нашел.
Я могу переопределить стандартную модель в com_content, например вида blog? Можно как-то расширить вид компонента(добавить свой, но с учетом обновлений, дабы не затирался, например как в шаблоне сайта добавляются шаблоны стандартных компонентов)?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
onContentPrepare - это только для материала. Все остальное - просто типы подачи списков материалов.

По поводу расширить - это уже сложнее. Вот тут интересный плагин, который переопределял прдеставление, модель и шаблон.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
onContentPrepare - это только для материала. Все остальное - просто типы подачи списков материалов.

По поводу расширить - это уже сложнее. Вот тут интересный плагин, который переопределял прдеставление, модель и шаблон.
Установлю плагин и оценю.
А вообще, стандартными методами никак?
Задача: есть плагин добавляющий в текст определенный тег с содержимым. Нужно вывести только те записи, в тексте которых содержится передаваемый в строке параметр. В модели я то знаю как это сделать, но как её расширить...
*

b2z

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Стандартными никак...
Что-то я не понимаю как с этим плагином работать и что он делает....

Кроме того, что выдает ошибку.

Подскажите, как бы Вы реализовали данную задачу?
« Последнее редактирование: 06.12.2012, 10:27:39 от xchesh »
*

b2z

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Не знаю, как бы реализовал. Надо думать...

По-моему здесь два варианта, либо переписывать компонент новостей, либо каким-то образом расширить модель com_content.
Второй вариант предпочтительнее, но я не понимаю как это возможно.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
А что мешает вместо стандартного com_content использовать для вывода модуль?
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
А что мешает вместо стандартного com_content использовать для вывода модуль?
Модуль? Хм... думал над этим, а какой тип пункта меню присвоить для news?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Делаете блог категории, ставите нули в настройках макета блога и получите пустой вывод категории без материалов. Вместо этого выводите модуль, который привязан к этому пункту меню.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Делаете блог категории, ставите нули в настройках макета блога и получите пустой вывод категории без материалов. Вместо этого выводите модуль, который привязан к этому пункту меню.
Спасибо, это как вариант. Думаю что на нем остановлюсь, т.к. чего-то другого придумать не могу. Кстати, приведу код плагина кнопки.
Код
<?php
/**
 * @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

/**
 * Editor Image buton
 *
 * @package Joomla.Plugin
 * @subpackage Editors-xtd.image
 * @since 1.5
 */
class plgButtonRegionbut extends JPlugin
{
/**
* Constructor
*
* @access      protected
* @param       object  $subject The object to observe
* @param       array   $config  An array that holds the plugin configuration
* @since       1.5
*/
public function __construct(& $subject, $config)
{
parent::__construct($subject, $config);
$this->loadLanguage();
}

/**
* Display the button
*
* @return array A two element array of (imageName, textToInsert)
*/
        public function onDisplay($name)
{
$app = JFactory::getApplication();//эти строки мне не понятны, зачем они вообще здесь нужны

$doc = JFactory::getDocument();//эти строки мне не понятны, зачем они вообще здесь нужны
$template = $app->getTemplate();//эти строки мне не понятны, зачем они вообще здесь нужны
// вызываем javascript, который возвращает контент
$link = 'index.php?option=com_region&amp;view=modal&amp;layout=modal&amp;tmpl=component&amp;e_name='.$name;

JHtml::_('behavior.modal');

$button = new JObject;
$button->set('modal', true);
$button->set('link', $link);
$button->set('text', JText::_('PLG_REGIONBUT_BUTTON_IMAGE'));
$button->set('name', 'pagebreak');
$button->set('options', "{handler: 'iframe', size: {x: 650, y: 400}}");

return $button;
}
}

XML файл
Код
<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="editors-xtd">
<name>plg_editors-xtd_regionbut</name>
<author>xchesh</author>
<creationDate>Nov 2012</creationDate>
<copyright>Copyright (C) 2005 - 2012 Open Source Matters. All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail>xchesh@mail.ru</authorEmail>
<authorUrl>www.xchesh.ru</authorUrl>
<version>2.5.1</version>
<description>PLG_REGIONBUT_DESCRIPTION</description>
<files>
<filename plugin="regionbut">regionbut.php</filename>
<filename>index.html</filename>
                <folder>language</folder>
        </files>
        <languages>
                <language tag="en-GB">language/en-GB/en-GB.plg_editors-xtd_regionbut.ini</language>
                <language tag="en-GB">language/en-GB/en-GB.plg_editors-xtd_regionbut.sys.ini</language>
                <language tag="ru-RU">language/ru-RU/ru-RU.plg_editors-xtd_regionbut.ini</language>
                <language tag="ru-RU">language/ru-RU/ru-RU.plg_editors-xtd_regionbut.sys.ini</language>
        </languages>
</extension>

Вид modal компонента com_region приводить не буду, только самую важную часть
view.html.php
Код
	function display($tpl = null) 
{
// Get data from the model
$items = $this->get('Items');
                $region = $this->get('ThisItem');
                if ($this->getLayout() == 'modal') {
// TODO: This is really dogy - should change this one day.
$eName = JRequest::getVar('e_name');
$eName = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName );
$this->assignRef('eName', $eName);
}
 
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Assign data to the view
$this->items = $items;
                $this->region = $region;
 
// Display the template
parent::display($tpl);
// Set the document
$this->setDocument();
                return;
}
tmpl/modal.php
Код
$this->eName;
$script  = 'function insertRegion() {'."\n\t";
// Get the pagebreak title
$script .= 'all = [];'."\n\t";
$script .= '$(".checkbox input").each(function(indx, element){'."\n\t\t";
$script .= 'if($(element).is(\':checked\')){'."\n\t\t";
$script .= 'all.push($(element).attr(\'value\'));'."\n\t\t";
// Get the pagebreak toc alias -- not inserting for now
// don't know which attribute to use...
$script .= '}});'."\n\t";
$script .= 'var tag = "{ohmygod}"+all+"{/ohmygod}";'."\n\t";
$script .= 'window.parent.jInsertEditorText(tag, \''.$this->eName.'\');'."\n\t";
$script .= 'window.parent.SqueezeBox.close();'."\n\t";
$script .= 'return false;'."\n";
$script .= '}'."\n";

JFactory::getDocument()->addScriptDeclaration($script);

Самое важное в создании такой кнопки, выбрать редактор и передать его в js. У меня именно с этим возникли вопросы.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Цитировать
эти строки мне не понятны, зачем они вообще здесь нужны
Убрать :) Они точно там не нужны.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Делаете блог категории, ставите нули в настройках макета блога и получите пустой вывод категории без материалов. Вместо этого выводите модуль, который привязан к этому пункту меню.
Вот тут к Вам вопрос, отлично, модуль то я сделаю, а что с JPagination? Как прикрутить к своему модулю?
*

b2z

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Хмм, в теории это возможно. Я на J1.5 такое пробовал провернуть.
Сейчас именно так я пробую провернуть на j2.5
JPagination сильно менялся при переходе с 1.5 на 2.5?
*

b2z

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Да вроде не очень сильно. Должно сработать.
попробую - отпишусь, мало ли)))
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Да вроде не очень сильно. Должно сработать.
Хм...
Код
Fatal error: Using $this when not in object context
Он точно работал под 1.5?
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Да, точно.
Я уже придумал другой способ :) Сейчас протестирую и отвечу.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Смотрите. В файле mod_name_module.php добавляем:
Код
jimport('joomla.html.pagination');
$limitstart = JRequest::getVar('limitstart', 0, '', 'int');//параметр какая страница
$total = 200;//это общее кол-во записей, его можно получать динамически, просто я для тестирования ввел 200
$limit = 20;//количество записей на странице(по-другому сдвиг)
$pagination = new JPagination($total, $limitstart, $limit);//создаем новый объект пагинации
$news_array = mod_newsHelper::getList($limitstart,$limit);//вызываем наш метод getList из файла helper с двумя параметрами $limitstart и $total
Вот собственно теперь самое простое.
в helper.php немного изменяем getList вот на такой:
Код
function getList($limitstart,$total)
{
           //тут весь код получения из бд записей
            $db->setQuery($query,$limitstart,$total);//а вот и используем сдвиг и максимальное кол-во
            $array = $db->loadObjectList();//Loading results into an array
            return $array;
        }
Все работает на ура.

Не забываем в шаблоне добавить
Код
<?php echo $pagination->getListFooter(); ?>
« Последнее редактирование: 13.12.2012, 16:09:20 от xchesh »
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Кстати, в итоге модуль выводится не только на странице всех новостей, но и на странице конкретной новости. Как быть? Как убрать? Роутер для модуля писать?

P.S.: ещё совсем не веселая новость. Нужно писать роутер для модуля этого. Хотя если формировать вручную ссылку, то все норм, проблем не будет.(href="'/news/'.$item->id.'-'.$item->alials.'"')


P.S.: Ладно, работает пагинация, но не совсем как надо. Из 69 записей выводит 53, на второй странице 33, на третьей странице 13. Что-то не так сделал?)

P.S.S.: А не, все верно, просто вместо $total нужно передавать $limit.
« Последнее редактирование: 13.12.2012, 16:09:02 от xchesh »
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Кстати, в итоге модуль выводится не только на странице всех новостей, но и на странице конкретной новости. Как быть? Как убрать? Роутер для модуля писать?
Зачем? Привяжите модуль к нужному пункту меню.

P.S.: ещё совсем не веселая новость. Нужно писать роутер для модуля этого. Хотя если формировать вручную ссылку, то все норм, проблем не будет.(href="'/news/'.$item->id.'-'.$item->alials.'"')
Да, про SEF я забыл. Не знаю, удастся ли Вам роутер для модуля сделать... Что-то не уверен.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не отображает link CSS style

Автор leo78

Ответов: 0
Просмотров: 1174
Последний ответ 15.07.2015, 16:37:06
от leo78
Вариант пагинатора

Автор AlekVolsk

Ответов: 5
Просмотров: 1294
Последний ответ 03.02.2015, 01:00:30
от ELLE
Странности при установке компонента

Автор Александр216

Ответов: 3
Просмотров: 1423
Последний ответ 16.07.2014, 12:38:39
от Aleks.Denezh
Странности в работе sql-запроса

Автор Александр216

Ответов: 7
Просмотров: 1592
Последний ответ 27.06.2014, 22:03:19
от Aleks.Denezh
Прошу помощи с RS monials

Автор Unloved

Ответов: 0
Просмотров: 1616
Последний ответ 06.06.2014, 04:12:25
от Unloved