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

BakeevDR

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Пишу свой компонент. делаю сортировку перетаскиванием. Нашел в интернете https://joomla.stackexchange.com/questions/14374/adding-drag-n-drop-ordering-in-component в котором описано как сделать. все сделал по нему, drag-n-drop заработал но при отработке saveOrderAjax возвращает ошибку

<br />
<b>Fatal error</b>:  Call to undefined method Fgbu_ReportModelDeployEgrn_Stages::saveorder() in <b>/srv/www/report/libraries/legacy/controller/admin.php</b> on line <b>390</b><br />

в контроллере (class JControllerAdmin ) ругается на строку $model = $this->getModel();

Часть кода с "libraries/legacy/controller/admin.php"
Код
	public function saveOrderAjax()
{
// Get the input
$pks = $this->input->post->get('cid', array(), 'array');
$order = $this->input->post->get('order', array(), 'array');

// Sanitize the input
$pks = ArrayHelper::toInteger($pks);
$order = ArrayHelper::toInteger($order);

// Get the model
$model = $this->getModel();

// Save the ordering
$return = $model->saveorder($pks, $order);

if ($return)
{
echo '1';
}

// Close the application
JFactory::getApplication()->close();
}


Код с моей компоненты (вывод списка)
контроллер
Код
class Fgbu_ReportControllerDeployEgrn_Stages extends JControllerAdmin
{
public function getModel($name = 'DeployEgrn_Stages', $prefix = 'Fgbu_ReportModel')
{
$model = parent::getModel($name, $prefix, array('ignore_request' => true));
return $model;
}
}

модель
Код
class Fgbu_ReportModelDeployEgrn_Stages extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields'])) {
$config['filter_fields'] = array(
'id', 'de_stage.id',
'name', 'de_stage.name',
'category', 'de_stage.name',

'ordering', 'de_stage.ordering',
'catid', 'de_stage.catid', 'category_title', 'category_id', 'cat.title'
);
}
parent::__construct($config);
}

public function getItems()
{
$items = parent::getItems();
if (!empty ($items)) {
/* $cat = 0;
$stage = 0;
$cattmp = '';
foreach ($items as $item) {
if ($cattmp != $item->catid) {
$cat ++;
$stage = 0;
$cattmp = $item->catid;
}
$item->sequence= $cat.'.'.++$stage;
} */
}
return $items;
}

protected function getListQuery()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select("de_stage.*")
->from('#__fgbureport_deployegrn_stage as de_stage ');

$query->select('cat.title as category')
->leftJoin('#__categories AS cat ON cat.id = de_stage.catid');

// Фильтр категории
$categoryId = $this->getState('filter.category_id');
if (is_numeric($categoryId))
{
$query->where($db->quoteName('de_stage.catid'). ' = ' . (int) $categoryId);
}

// Фильтр поиска
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true). '%'));
$query->where('(de_stage.name LIKE ' . $search . ' OR de_stage.action LIKE ' . $search . ' OR de_stage.result LIKE ' . $search . ')');
}

$orderCol  = $this->state->get('list.ordering', 'de_stage.ordering');
$orderDirn = $this->state->get('list.direction', 'DESC');

$query->order($db->escape($orderCol). ' ' . $db->escape($orderDirn));

return $query;
}

protected function populateState($ordering = 'de_stage.ordering', $direction = 'desc')
{
parent::populateState($ordering, $direction);
}

}

Вьюха
Код
class Fgbu_ReportViewDeployEgrn_Stages extends JViewLegacy
{
function display($tpl = null)
{
$this->items = $this->get('Items');
$this->pagination = $this->get('Pagination');
$this->state = $this->get('State');
$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');

if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode("\n", $errors));
return false;
}
$this->addToolBar();
$this->sidebar = JHtmlSidebar::render();
parent::display($tpl);
}

protected function addToolBar()
{
JToolBarHelper::title(JText::_('COM_FGBU_REPORT').': '.JText::_('COM_FGBU_REPORT_DEPLOYEGRN_STAGE'), 'Fgbu_Report');
JToolBarHelper::addNew('deployegrn_stage.add');
JToolBarHelper::editList('deployegrn_stage.edit');
JToolbarHelper::divider();
//JToolBarHelper::deleteList('', 'deployegrn_stages.delete');  //включить обязательную проверку перед удалением
$bar = JToolBar::getInstance('toolbar');
$bar->appendButton('Custom', '<a class="btn btn-small" href="index.php?option=com_fgbu_report"><span class="icon-tools"> </span>Панель управления</a>');
}
}

default
Код
<?php
defined('_JEXEC') or die('Restricted Access');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = $listOrder == 'de_stage.ordering';
if ($saveOrder)
{
$saveOrderingUrl = 'index.php?option=com_fgbu_report&task=deployegrn_stages.saveOrderAjax&tmpl=component';
JHtml::_('sortablelist.sortable', 'deployegrn_stages_list', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_fgbu_report&view=deployegrn_stages'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
<div id="j-sidebar-container" class="span2">
<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10">
<?php else : ?>
<div id="j-main-container">
<?php endif;?>
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => true,'totalResults' => count($this->items),))); ?>
<table class="table table-striped" id="deployegrn_stages_list">
<thead>
<tr>
<th width="1%" class="nowrap center hidden-phone">
<?php echo JHtml::_('searchtools.sort', '', 'de_stage.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
</th>
<th width="1%" class="center"><?php echo JHtml::_('grid.checkall'); ?></th>
<th><?php echo JHtml::_('searchtools.sort', 'Этап', 'category', $listDirn, $listOrder); ?></th>
<th><?php echo JHtml::_('searchtools.sort', 'Наименование', 'de_stage.name', $listDirn, $listOrder); ?></th>
<th>Воздействие ЦА</th>
<th>Ожидаемый результат</th>
</tr>
</thead>
<tbody>
<?php
foreach($this->items as $i => $item){
?>
<tr class="row<?php echo $i % 2; ?>">
<td class="order nowrap center hidden-phone">
<?php
$iconClass = '';
if (!$saveOrder)
{
$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
}
?>
<span class="sortable-handler<?php echo $iconClass ?>">
<span class="icon-menu" aria-hidden="true"></span>
</span>
<?php if ($saveOrder) : ?>
<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
<?php endif; ?>
</td>
<td class="center">
<?php echo JHtml::_('grid.id', $i, $item->id); ?>
</td>
<td><?php echo $item->category; ?></td>
<td><a href="<?php echo JRoute::_('index.php?option=com_fgbu_report&task=deployegrn_stage.edit&id='.$item->id);?>"><?php echo $item->name; ?></a></td>
<td><?php echo $item->action; ?></td>
<td><?php echo $item->result; ?></td>
</tr>
<?php } ?>
</tbody>
<tfoot>
<tr>
<td colspan="10"><?php echo $this->pagination->getListFooter(); ?></td>
</tr>
</tfoot>
</table>
<div>
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<?php echo JHtml::_('form.token'); ?>
</div>
</div>
</form>

Заранее спасибо за помощь
« Последнее редактирование: 21.11.2017, 13:25:04 от BakeevDR »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Зачем вы пишете метод  saveOrderAjax? как бы он уже есть в контроллере, наследуется от родителя, удалить!
А сортировка организуется с помощью одного контроллера и одной  модели из разных типов
Контроллер должен наследоваться от JControllerAdmin, в нем должен быть обязательно метод  getModel который связывается не с моделью списка которая наследуется от JModelList, а с моделью одиночной записи (или редактирования) которая наследуется от класса JModelAdmin, от модели JModelAdmin, там тоже унаследуется метод для сохранения сортировки
Поле для сортировки выводится типа так:
JHtml::_( 'searchtools.sort', '', 'ordering', $listDir, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2' )
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Зачем вы пишете метод  saveOrderAjax? как бы он уже есть в контроллере, наследуется от родителя, удалить!
Саш, твой конструктор его автоматом добавляет
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Саш, твой конструктор его автоматом добавляет
::) тсссс... это всё враки... 
ладно признаюсь добавляет, только код там стааааарый.. вот когда выкачу после нового года новый конструктор там не будет этой ереси )
*

BakeevDR

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
saveOrderAjax

saveOrderAjax я не пишу в контроллере
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Модель итема нужна =)
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

BakeevDR

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Модель итема нужна =)

Код
<?php
defined('_JEXEC') or die('Restricted access');

class Fgbu_ReportModelDeployEgrn_Stage extends JModelAdmin
{
public function getTable($type = 'deployegrn_stage', $prefix = 'fgbureportTable', $config = array()){
return JTable::getInstance($type, $prefix, $config);
}

public function getForm($data = array(), $loadData = true){
$form = $this->loadForm('', 'deployegrn_stage', array('control' => 'jform', 'load_data' => $loadData));
if (empty( $form )) {
return false;
}
return $form;
}

protected function loadFormData(){
$data = JFactory::getApplication()->getUserState('com_fgbu_report.edit.deployegrn_stage.data', array());
if (empty($data)){
$data = $this->getItem();
}
return $data;
}
protected function prepareTable($table)
{
$date = JFactory::getDate();
$user = JFactory::getUser();
if (empty($table->id)){
$table->created    = $date->toSql();
$table->created_by = $user->id;
if (empty($table->ordering))
{
$db = $this->getDbo();
$query = $db->getQuery(true)
->select('MAX(ordering)')
->from('#__fgbureport_deployegrn_stage');

$db->setQuery($query);
$max = $db->loadResult();

$table->ordering = $max + 1;
}
}
else{
$table->modified    = $date->toSql();
$table->modified_by = $user->id;
}
$table->version++;
}

}
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
в контроллере списка должно быть
public function getModel($name = 'DeployEgrn_Stage', $prefix = 'Fgbu_ReportModel') на на модель списка, а на модель одиночной записи!
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Вообще называть классы сам компонент view с _ не лучшая затея.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

BakeevDR

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
в контроллере списка должно быть
public function getModel($name = 'DeployEgrn_Stage', $prefix = 'Fgbu_ReportModel') на на модель списка, а на модель одиночной записи!


Спасибо БОЛЬШОЕ. ЗАРАБОТАЛА СОРТИРОВКА !
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Счётчик полей в админке модуля

Автор zeus07

Ответов: 9
Просмотров: 947
Последний ответ 28.06.2021, 13:40:31
от zeus07
[РЕШЕНО] Дублирование при создании

Автор platonische

Ответов: 7
Просмотров: 1249
Последний ответ 12.02.2021, 11:24:26
от platonische
[РЕШЕНО] onChange в админке на field modal

Автор platonische

Ответов: 1
Просмотров: 610
Последний ответ 30.01.2021, 16:40:45
от platonische
Обработка AJAX в компоненте Joomla!3

Автор balancer

Ответов: 33
Просмотров: 11757
Последний ответ 23.07.2020, 07:45:53
от Dolphin4ik_1
[РЕШЕНО] Сохранение значений полей добавленных динамически элементу

Автор platonische

Ответов: 30
Просмотров: 3349
Последний ответ 10.11.2019, 15:42:33
от platonische