Форум русской поддержки Joomla!® CMS
09.12.2016, 05:59:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

[Решено] Порядок данных в таблице и сортировка по нему

 (Прочитано 703 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« : 25.03.2015, 15:18:13 »

Самописный компонент. В таблице в базе имеется поле `ordering` int not null для ручного указания порядка вывода данных, которое по умолчанию при добавлении новой записи имеет значение 0.
В админке в списке поле выводится как на скрине:


Вывожу так:
Код
<?php
$saveOrder = $listOrder == 'ordering';
if ($saveOrder) {
 $saveOrderingUrl = 'index.php?option=com_teaching_staff&view=listitems.saveOrderAjax&tmpl=component';
 JHtml::_('sortablelist.sortable', 'articleList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>

       <td class="order nowrap center hidden-phone">
       <?php
         if ($canChange) {
           $disableClassName = '';
           $disabledLabel = '';
           if (!$saveOrder) {
             $disabledLabel = JText::_('JORDERINGDISABLED');
             $disableClassName = 'inactive tip-top';
           }
         ?>

           <span class="sortable-handler <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>" rel="tooltip"><i class="icon-menu"></i></span>
           <input type="text" style="display:none;" name="order[]" size="5" value="<?php echo $item->
ordering; ?>" class="width-20 text-area-order" />
         <?php } else { ?>
           <span class="sortable-handler inactive"><i class="icon-menu"></i></span>
         <?php } ?>
       </td>

В контроллере:
Код
  public function saveOrderAjax() {
   $pks = $this->input->post->get('cid', array(), 'array');
   $order = $this->input->post->get('order', array(), 'array');
   JArrayHelper::toInteger($pks);
   JArrayHelper::toInteger($order);
   $model = $this->getModel();
   $return = $model->saveorder($pks, $order);
   if ($return) echo '1';
   JFactory::getApplication()->close();
 }

Есс-но, если я перетаскиваю строки вверх/вниз, то значение поля в записях не меняется.

Я так понял, вся реализация должна быть в модели, в функции saveorder(), но ее пример нашел только в com_users/models/levels.php, из которого ничего толком не понял.

Как правильно реализовать подобный функционал, чтобы потом во фронте иметь возможность выводить данные с сортировкой по данному полю?
« Последнее редактирование: 25.03.2015, 19:51:56 от b2z » Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #1 : 25.03.2015, 16:59:37 »

UPD По какому то порядку они же выводятся в админке, может ошибка как раз в том, что по умолчанию там 0?
Может при добавлении записи сделать подсчет всех добавленных записей в этой таблице, затем делать к подсчету +1, и уже добавлять к только что созданной записи.

Таким образом сортировка заготовлена, потом на окончание события "перетаскивания", повесить функцию сохранения в бд.
Ну это уже все ручками своими..)

А по идее, это вроде же встроенная фишка Joomla, перетаскивание и сохранение, инклюдится откуда то, и если Неправильно работает, возможно ошибся где то при создании компонента.

Показать текстовый блок
« Последнее редактирование: 25.03.2015, 17:50:59 от shurakana » Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #2 : 25.03.2015, 17:55:53 »

В консоли руганутся на это:
$saveOrderingUrl = 'index.php?option=com_teaching_staff&view=listitems.saveOrderAjax&tmpl=component';
выдал: представление не найдено,
исправил так:
$saveOrderingUrl = 'index.php?option=com_teaching_staff&view=listitems&tmpl=component';
ошибка исчезла, что дальше делать - хз
выставил значения ordering в базе, один х не работает
« Последнее редактирование: 25.03.2015, 18:00:08 от AlekVolsk » Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #3 : 25.03.2015, 18:18:47 »

Может в твоем компоненте отсутствует saveOrderAjax? т.к. по названию это вроде то что нужно..

А еще, скрипт js должен параметры сортировки принимать и передавать, если вообще сам писал компонент, то может id или class не те выставил или еще ченить в том же духе, она автоматом же должна работать, т.е. перетащил -> js скрипт собрал данные -> отправил в обработчик -> сохранилось в бд.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #4 : 25.03.2015, 18:34:31 »

saveOrderAjax описан в JControllerAdmin, там тоже вызывается $this->getModel()->saveorder($pks, $order); которая нигде не описана.
Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #5 : 25.03.2015, 18:50:23 »

Попробуй вот здесь создать компонент, и сравни в чем отчличия http://inet-reklama.com/sozdanie-komponenta
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #6 : 25.03.2015, 19:15:58 »

Вышепреведенный код именно оттуда
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #7 : 25.03.2015, 19:26:51 »

UPD По какому то порядку они же выводятся в админке, может ошибка как раз в том, что по умолчанию там 0?
Может при добавлении записи сделать подсчет всех добавленных записей в этой таблице, затем делать к подсчету +1, и уже добавлять к только что созданной записи.
Именно. Например у меня в модели:

Код
/**
* Prepare and sanitise the table prior to saving
*
* @param   object  $table  The table object
*
* @return  void
*
* @since  1.0
*/

protected function prepareTable($table)
{
$date = JFactory::getDate();
 
$table->generateAlias();
 
if (empty($table->id))
{
// Set the values
$table->created_time = $date->toSql();
 
// Set ordering to the last item if not set
if (empty($table->ordering))
{
$db = $this->getDbo();
$query = $db->getQuery(true)
->select('MAX(ordering)')
->from($db->quoteName('#__competition_competitions'));
$db->setQuery($query);
$max = $db->loadResult();
 
$table->ordering = $max + 1;
}
}
}

В контроллере ничего дополнительно делать не надо.

В макете:


Код
if ($saveOrder)
{
$saveOrderingUrl = 'index.php?option=com_competition&task=competitions.saveOrderAjax&tmpl=component';
JHtml::_('sortablelist.sortable', 'competitionsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}

Соответственно должна быть таблица с id=competitionsList

Код
<table class="table table-striped" id="competitionsList">

У тебя это articleList. Поменяй в базе вручную ordering и должно заработать.
« Последнее редактирование: 25.03.2015, 19:32:13 от b2z » Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #8 : 25.03.2015, 19:38:08 »

Сейчас значения не нулевые, все равно не работает.
AJAX возвращает 404 Представление не найдено [name, type, prefix]: listitems.saveOrderAjax, HTML, teaching_staffView (с маленькой буквы - это нормально? где мог ошибиться?)
id в url соответствует id в table
saveOrderAjax из своего контроллера убрал
« Последнее редактирование: 25.03.2015, 19:41:28 от AlekVolsk » Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #9 : 25.03.2015, 19:41:13 »

&view=listitems.saveOrderAjax

&task=listitems.saveOrderAjax
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #10 : 25.03.2015, 19:45:18 »

Все, работает.
Кляну в сотый раз свою невнимательность ))
Спасибо! drink Azn
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #11 : 25.03.2015, 19:51:45 »

ура Azn
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet