Новости Joomla

Свои типы полей в 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 для атрибута addfieldprefixnamespace 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 #разработка

Обновлена информация в Плане развития Joomla

👩‍💻 Обновлена информация в Плане развития Joomla.Здесь собрана информация о датах релизов, описаны принципы версионирования, указаны ответственные за релизы, а так же даты окончания поддержки релизов. Опираясь на эту информацию вы можете планировать развитие ваших интернет-проектов.👩‍💻 Что нового?⛔️ Joomla 4.Дата окончания исправления ошибок безопасности в версии 4.x - 14 октября 2025г. ⚠️ После этой даты Joomla 4 прекратит получать какие-либо обновления, в том числе безопасности - вообще. Рекомендуем обновить ваши сайты до актуальной Joomla 5.✅ Joomla 5.- Дата окончания исправления ошибок в версии 5.x - 13 октября 2026г.- Дата окончания исправления ошибок безопасности в версии 5.x - 12 октября 2027 года.- Текущая актуальная (на момент написания заметки) версия - 5.3.1.- Опубликовано расписание выхода релизов Joomla 5.4. Стабильный релиз ожидается 14 октября 2025 года.✅ Joomla 6.- Дата окончания исправления ошибок в версии 6.x - 17 октября 2028г.- Дата окончания исправления ошибок безопасности в версии 6.x - 16 октября 2029г.- Опубликовано расписание выхода релизов Joomla 6.0. Стабильный релиз ожидается 14 октября 2025 года.- Для разработчиков уже доступна Joomla 6.0.0-alpha1.✅ Joomla! Framework.Обновлена информация о Joomla! Framework - полноценном PHP-фреймворке для разработки. Он в версиях 1.х и 2.х был самостоятельным параллельным проектом, однако начиная с версии Joomla 4.0 стал её основой. Добавлена информация о Joomla! Framework 3.x, который вышел 6 октября 2023 года. Его можно использовать в тех случаях, когда вам в проекте не нужна CMS Joomla целиком.Подробнее на сайте Joomla-сообщества Joomlaportal.ru#joomla #community

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla

JetBrains - один из мировых лидеров в разработке программного обеспечения для разработчиков. Её программные продукты - это IDE - профессиональные среды разработки, которые отличаются от простого блокнота/редактора с плагинами набором всевозможных инструментов для разработчиков, глубоким анализом кодовой базы, подсказками по ней и по языку программирования, отладкой ошибок и многим-многим другим. Одним из самых известных продуктов компании является IDE PHP Storm, который можно назвать отраслевым стандартом PHP-разработчика.

В статье How PhpStorm Helps Maintain PHP Open-Source Projects: Interviews and Real-World Examples в блоге компании описываются Open Source проекты, которым JetBrains оказывает поддержку (это могут быть бесплатные лицензии для разработчиков для некоммерческих проектов).

В список попали:

  • PHPUnit - фреймворк для unit-тестирования в PHP
  • Doctrine DBAL - библиотека для PHP, которая предоставляет лёгкий и гибкий слой для коммуникации с базой данных. Она поддерживает различные базы данных через единый и согласованный API.
  • CodeIgniter — популярный MVC-фреймворк для разработки на PHP
  • Joomla! - наша любимая CMS.

Эти названия (кроме "Joomla") чаще всего не слышат вебмастера и разработчики обычных сайтов и интернет-магазинов. Но эти названия хорошо знакомы PHP-разработчикам, которые создают сложные и высоконагруженные проекты и микросервисы. То, что Joomla оказалась в одном ряду с такими программными инструментами - делает ей честь.

🙏 За ссылку спасибо участнику нашего сообщества Ринату Кажетову (@rkazhet).

Подпишитесь на @joomlafeed

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

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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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
Просмотров: 833
Последний ответ 28.06.2021, 13:40:31
от zeus07
[РЕШЕНО] Дублирование при создании

Автор platonische

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

Автор platonische

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

Автор balancer

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

Автор platonische

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