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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Хочу сохранять результаты чекнутых чекбоксов в таблицу совместимости(в модальном окне).
Вызываю плагином модальное окно, option=com_region&view=modal&layout=modal_table&&id=id_текущего_элемента
Шаблон начинается как всегда
Код
<form action="/joomlacms/administrator/index.php?option=com_region&amp;view=modal&amp;layout=modal_table&amp;tmpl=component" method="post" name="adminForm" id="adminForm">
Где мне обрабатывать клик по кнопке
Код
<button id="ready" onclick="if (document.adminForm.boxchecked.value==0){alert('Пожалуйста, выбирите хотя бы один регион из списка');}else{ Joomla.submitbutton('modal_table.checkin')};window.parent.SqueezeBox.close();"><? echo JText::_('COM_REGION_INSERT');?></button>
Я вот никак не могу догнать, неужели нужно в контроллере?
« Последнее редактирование: 07.12.2012, 12:30:04 от xchesh »
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #1 : 07.12.2012, 12:36:12 »
Неужели никто не знает как переопределить действия кнопки?
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: Ненавязчивая идея сохранения
« Ответ #2 : 07.12.2012, 13:28:52 »
Если нужно подобие AJAX то да нужно вызывать контроллер по нажатии чекбокса.
А действие переопределяется javascript
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #3 : 07.12.2012, 13:47:44 »
Если нужно подобие AJAX то да нужно вызывать контроллер по нажатии чекбокса.
А действие переопределяется javascript
найн, не то. Мне не нужно AJAX.
Думаю что нужно сделать полноценный дополнительный вид на основе страницы редактирования конкрентного итема.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #4 : 07.12.2012, 17:24:43 »
Наверное уточню свою задачу.
Нужен вид-модель-контроллер.
Который открывается по запросу index.php?option=com_region&view=modal&layout=modal_table&id=10
Если итем из таблицы #__news с id_news=10 существует, то загрузить его параметр id_region, если нет, то создать новый.
Таблица соответствий #__news имеет в структуре только 2 столбца id_news и id_region.
Кнопка "Сохранить" должна закрывать страницу index.php?option=com_region&view=modal&layout=modal_table&id=10 и сохранять результат в соответствующую строку в Бд.
Казалось бы просто, взять да сделать вид, аналогичный странице редактирования в компоненте, но блин, почему-то так просто это не работает)
М.б. уже пятницО и нужно выключить мозг?
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #5 : 10.12.2012, 11:55:19 »
Господа, не могу понять, нужно сделать таблицу соответствий. Но как сохранять значения туда, если id всегда отправляется как 0.
Создаю таблицу
Код
DROP TABLE IF EXISTS `#__news`;
 
CREATE TABLE `#__news` (
    `id` int(11) NOT NULL,
    `id_region` TEXT NOT NULL,
     PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Потом models/modal.php
Код
public function getTable($type = 'Modal', $prefix = 'ModalTable', $config = array()) 
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Method to get the record form.
*
* @param array $data Data for the form.
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
* @return mixed A JForm object on success, false on failure
* @since 2.5
*/
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm('com_region.modal', 'modal',
                        array('control' => 'jform', 'load_data' => $loadData));
if (empty($form))
{
return false;
}
return $form;
}


protected function loadFormData()
{
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState('com_region.edit.modal.data', array());
if (empty($data))
{
$data = $this->getItem();
}
return $data;
}

Тут и контроллер есть
Код
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla controllerform library
jimport('joomla.application.component.controllerform');
 
/**
 * modal Controller
 */
class RegionControllerModal extends JControllerForm
{
}

И tables/modal.php
Код
class ModalTableModal extends JTable
{
/**
* Constructor
*
* @param object Database connector object
*/
function __construct(&$db)
{
            parent::__construct('#__news', 'id', $db);
}
tmpl/edit.php
Код
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
$params = $this->form->getFieldsets('params');
?>
<form action="<?php echo JRoute::_('index.php?option=com_region&view=modal&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="region-form" class="form-validate">
 
<div class="width-100 fltlft">
<fieldset class="adminform">
<legend><?php echo JText::_( 'COM_REGION_REGION_DETAILS' ); ?></legend>
<ul class="adminformlist">
                            <li><?php echo $this->form->getLabel('id'); ?>
                            <?php echo $this->form->getInput('id'); ?></li>
                            <li><?php echo $this->form->getLabel('id_region'); ?>
                            <?php echo $this->form->getInput('id_region'); ?></li>
</ul>
</fieldset>
</div>
<!-- begin ACL definition-->
 
   <div class="clr"></div>
   <!-- end ACL definition-->
 
  <div>
<input type="hidden" name="task" value="modal.edit" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>
view.html.php
Код
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');
 
/**
 * Region View
 */
class RegionViewModal extends JView
{
/**
* display method of Hello view
* @return void
*/
public function display($tpl = null)
{
// get the Data
$form = $this->get('Form');
$item = $this->get('Item');
$script = $this->get('Script');
 
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Assign the Data
$this->form = $form;
$this->item = $item;
$this->script = $script;
// Set the toolbar
$this->addToolBar();
 
// Display the template
parent::display($tpl);
 
// Set the document
$this->setDocument();
}
 
/**
* Setting the toolbar
*/
protected function addToolBar()
{
JRequest::setVar('hidemainmenu', true);
$isNew = $this->item->id == 0;
JToolBarHelper::title($isNew ? JText::_('COM_REGION_MANAGER_REGION_NEW') : JText::_('COM_REGION_MANAGER_REGION_EDIT'), 'modal');
// Built the actions for new and existing records.
if ($isNew)
{
// For new records, check the create permission.
                        JToolBarHelper::apply('modal.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::cancel('modal.cancel', 'JTOOLBAR_CANCEL');
}
else
{
// We can save the new record
                        JToolBarHelper::apply('modal.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::cancel('modal.cancel', 'JTOOLBAR_CLOSE');
}
}
/**
* Method to set up the document properties
*
* @return void
*/
protected function setDocument()
{
$isNew = $this->item->id == 0;
$document = JFactory::getDocument();
$document->setTitle($isNew ? JText::_('COM_REGION_REGION_CREATING') : JText::_('COM_REGION_REGION_EDITING'));
}
}

Скажите, ведь все верно делаю, почему id сбрасывается на 0(при сохранении), вследствие чего, выбивается ошибка
Код
Сохранить не удалось из-за ошибки: ModalTableModal: :store failed
Duplicate entry '0' for key 'PRIMARY' SQL=INSERT INTO `jommlacms_news` (`id`,`id_region`) VALUES ('0','435345')
Второй день бьюсь.
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #6 : 10.12.2012, 12:11:35 »
Да, я могу сделать таблицу с id AI и дополнительно добавить колонку id_news. Но зачем мне лишний столбец?
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: Ненавязчивая идея сохранения
« Ответ #7 : 10.12.2012, 13:13:18 »
Столько кода привел, а где сам метод по сохранению в таблицу?
Да и почему id в таблице news не autoincrement я тоже не нашел объяснения
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: Ненавязчивая идея сохранения
« Ответ #8 : 10.12.2012, 13:47:38 »
ХМL формы покажите. Что у Вас там в поле $this->form->getInput('id'); ?
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #9 : 10.12.2012, 13:55:59 »
ХМL формы покажите. Что у Вас там в поле $this->form->getInput('id'); ?


Легко!)

Код
<?xml version="1.0" encoding="utf-8"?>
<form
addfieldpath="/administrator/components/com_xbaner/models/fields"
>
<fieldset name="details">
<field
                    name="id"
                    type="hidden"
/>
                <field
                    name="id_region"
                    label="COM_XBANER_REGION_LABEL"
                    description="COM_XBANER_REGION_DESC" 
                    type="multicheckbox"
                />
        </fieldset>
</form>
Кстати, если делать не hidden а text и вручную вводить, все равно одно и то же.
*

b2z

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

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #11 : 10.12.2012, 14:55:57 »
Хорошо, Вам в форму приходит заполненный Id?
нет. не приходит.
Зато если указать в файле tables/modal.php
Код
function __construct(&$db) 
{
            parent::__construct('#__news', 'id_region', $db);
}
То все сохраняется, ну кроме конечно же id_region, он все равно остается нулевой.

Вообще, меня уже бесить начинает Joomla, ради простых действий, приходится через жопу все делать. Вот задача проста до ужаса, вывести в модальном окне checkboxes со всеми филиалами и записать в таблицу соответствий id материала(который передается в всплывающий iframe параметром) и выбранные checkbox'ы по кнопке "Готово". При открытии этого материала повторно, показывать какие чекбоксы выбраны.
Бля, уже второй день мучаюсь с этим говном. Создать вид, модель для него, контроллер и вывести в модальное окно. ЗБС, задача сделана, но нихера не работает, а почему? Это не ясно.
Обращаюсь прямо по ссылке к товару, окей, открывает, пытаюсь сохранить - херас два, нет прав на прямую ссылку, нет вида modals. ОТКУДА Joomla взяла вид modals, если я его нигде не объявлял? Почему она пытается на действие кнопки Apply открыть это ребаный вид? Какого дьявола у меня нету прав на доступ к своей записи? Этот дибилизм напрягает, нужно срочно переходить на какой-нибудь фреймворк, Joomla бесит своими правилами. Не первый день разработчик все-таки. Накипело.
« Последнее редактирование: 10.12.2012, 15:35:08 от xchesh »
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #12 : 10.12.2012, 15:46:39 »
Ладно, погорячился :) Хоть Joomla и раздражительно выносит мозг, но все-таки это удобнее немного чем написать свое двигло.
Проблема возникала не поверите в чем, оказывается, что просто так, по прямой ссылке, зайти нельзя. Точнее зайти можно, но нельзя сохранить изменения и т.п. Чтобы обойти этот идиотизм, нужно ссылку выдавать вида index.php?option=com_region&task=modal.edit&id=YOU_ID, где modal - название вида, edit - это шаблон(layout). Мне вот в голову не пришло, что нужно в параметре task это передавать и через точку, пока не посмотрел на другой свой компонент. Мне не совсем понятна логика. Точнее вообще не понятна для чего это сделали.
Вопрос предыдущий существует. Это так, отвлечение.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Ненавязчивая идея сохранения
« Ответ #13 : 10.12.2012, 16:07:38 »
<form action="/joomlacms/administrator/index.php?option=com_region&amp;view=modal&amp;layout=modal_table&amp;tmpl=component" method="post" name="adminForm" id="adminForm"> можно смело поменять на
<form action="/index.php?tmpl=modal" method="post" name="adminForm" id="adminForm">
а в файле modal.php (вашего шаблона или шаблона system) обрабатывать. Мое видение
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #14 : 10.12.2012, 16:15:27 »
<form action="/joomlacms/administrator/index.php?option=com_region&amp;view=modal&amp;layout=modal_table&amp;tmpl=component" method="post" name="adminForm" id="adminForm"> можно смело поменять на
<form action="/index.php?tmpl=modal" method="post" name="adminForm" id="adminForm">
а в файле modal.php (вашего шаблона или шаблона system) обрабатывать. Мое видение
Немного не понимаю как это будет работать...

Мне интересно кое что ещё. Можно ли обработчик Apply сделать AJAX. Ну, чтобы без перезагрузки страницы(iframe).
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: Ненавязчивая идея сохранения
« Ответ #15 : 10.12.2012, 16:21:01 »
нет. не приходит.
Ну так, ищите проблему не тут. Ройте models/modal.php, а точнее loadFormData().
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #16 : 11.12.2012, 16:55:16 »
Ну так, ищите проблему не тут. Ройте models/modal.php, а точнее loadFormData().
Слишком много времени занимает поиск таких вот выходов, сделал по-другому, добавил AI к id и все. Теперь все работает. (всего 3 колонки id, id_news, id_region). Да, не лучший вариант(лишняя колонка) но вполне рабочий и не занимает много времени. Спасибо всем кто помогал.
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: Ненавязчивая идея сохранения
« Ответ #17 : 11.12.2012, 17:02:20 »
а id и id_news это разные значения?
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #18 : 11.12.2012, 17:10:22 »
а id и id_news это разные значения?
Ну конечно) id - AI, id_news - задаваемый парамерт
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: Ненавязчивая идея сохранения
« Ответ #19 : 11.12.2012, 17:17:53 »
Это я понял а функции они какие выполняют для чего news_id куда он указывает
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #20 : 12.12.2012, 09:12:00 »
Это я понял а функции они какие выполняют для чего news_id куда он указывает
id_news - это id материала, в котором вызывается это модальное окно.
id_region - это id региона, к которому относится данный материал.
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Re: Ненавязчивая идея сохранения
« Ответ #21 : 12.12.2012, 12:14:04 »
id_news - это id материала, в котором вызывается это модальное окно.
id_region - это id региона, к которому относится данный материал.
Действительно не нужен дополнительное поле с автоинкрементом. Мне кажется что здесь дело в особенности работы класса JTable и нужно переопределить метод storage()
*

xchesh

  • Захожу иногда
  • 277
  • 10 / 1
Re: Ненавязчивая идея сохранения
« Ответ #22 : 12.12.2012, 12:20:57 »
Действительно не нужен дополнительное поле с автоинкрементом. Мне кажется что здесь дело в особенности работы класса JTable и нужно переопределить метод storage()
Да, я тоже думаю что в JTable дело, но времени нету разбираться и переопределять его методы.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Перенос после сохранения данных пользователя

Автор selimoff

Ответов: 2
Просмотров: 2124
Последний ответ 15.01.2010, 00:01:28
от SmokerMan