Новости Joomla

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых храниться весь "нестандарт".

В этой статье описаны все триггеры, которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

Подходы, описанные в статье, полезны в тех случаях, когда вы работаете с данными в com_fields - механизме создания и редактирования пользовательских полей ядра Joomla и при использовании FieldsHelper. Многие сторонние компоненты не используют эту возможность, поэтому данная статья будет полезна лишь частично.

Читать статью на Хабре.

@joomlafeed

🏆 Открыто голосование за Joomla в премии CMS Critic People’s Choice Awards 2025

🏆 Открыто голосование за Joomla в  премии CMS Critic People’s Choice Awards 2025

🗓 Голосование продлится до 27 февраля 2026 года.

👩‍💻 Проголосовать! 👩‍💻

Номинации, в которых можно проголосовать за Joomla:
⭐️ Best Free CMS
⭐️ Best Open Source CMS
⭐️ Best Enterprise CMS

Также в номинации Best e-Commerce Solution участвуют компоненты интернет-магазинов для Joomla:
⭐️ HikaShop
⭐️ Virtuemart

В номинации Best Website Builder оказались:
⭐️ YooTheme
⭐️ SP Page Builder

Что такое CMS Critic Awards?
С 2012 года премия CMS Critic Awards занимает особое место в сообществе систем управления контентом (CMS). Это единственный в своем роде сайт, который составляет рейтинг системы управления контентом и связанных с ними решений на рынке — от малого до крупного и подчеркивает их инновации и услуги.

Каждый год награда CMS Critic Awards присуждается одному победителю в различных отраслевых категориях, таких как: «Лучшая облачная CMS», «Лучший DXP», «Лучшая Headless CMS и других. Затем результаты оглашаются через СМИ вместе с выбором редакции CMS Critic.
В этом году премия вернулась к своим традициям и только TOP-5 движков по количеству номинаций попали в 2-й этап - голосование.

@joomlafeed

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

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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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
Просмотров: 2179
Последний ответ 15.01.2010, 00:01:28
от SmokerMan