Новости Joomla

Совет по Joomla: $db->getQuery(true) стал устаревшим

Совет по Joomla: $db->getQuery(true) стал устаревшим

👩‍💻 Совет по Joomla: $db->getQuery(true) стал устаревшим.Раньше при создании запросов в базу данных мы всегда получали объект запроса с помощью метода

getQuery(). Если передавался параметр
$new =
true, то получали новый запрос. Если без - последний.

use Joomla\CMS\Factory;$db = Factory::getContainer()->get('DatabaseDriver');$query = $db->getQuery(new: true);// и строим запрос
Под капот Joomla 4 вошёл Joomla Framework (PHP фреймворк а-ля Laravel, Yii и т.д.), а для Joomla 5 он обновился - версия 3.4.1 вышла 6 октября 2023г. В методе фреймворка есть примечание о том, что параметр
$new, который передавался в метод
getQuery() помечен как устаревший и будет удалён в версии фреймворка 4.0.
The parameter $new is deprecated and will be removed in 4.0, use %s::createQuery() instead.В Joomla 4 версия Joomla Framework была 2.x., в Joomla 5 - 3.x. Поэтому есть предположение, что с выходом Joomla 6 обновится и версия фреймворка - станет 4.0. Поэтому для получения объекта для новых запросов следует использовать метод
createQuery(). Он уже представлен в ядре и широко используется. При этом метод
getQuery() останется, но, скорее всего, будет выполнять функцию только геттера - получения текущего запроса.
@joomlafeed#joomla #php #разработка

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

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

Автор platonische

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

Автор platonische

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

Автор balancer

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

Автор platonische

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