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

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

Сортировка записей по времени и дате создания одновременно

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

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

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


Метод тыка и мата помогает в кодинге


« : 09.04.2015, 00:50:10 »

Доброго времени суток уважаемые форумчане. Есть вопрос - нужен совет. Есть самописный компонент для Joomla. Компонент создает записи по типу заказов. Запись имеет статус по типу в работе, оплачен, и тд а так же параметры типа время и дата заказа. Время пишется в формате 03:14 а дата в формате 31-12-2015. Теперь вопрос - даже два :

1 нужно сделать сортировку по дате И времени. То есть есть сортировка по дате и есть сортировка по времени - нужно сделать что бы сортировка была и по времени и по дате одновременно по примеру

01-12-2015 03:45
01-12-2015 11:45
02-01-2016 09:25
и так далее

и второй вопрос - есть необходимость сделать смену статуса заказа по кнопке - с аналогией того как меняется статус статьи в списке материалов. То есть будет несколько кнопок по типу в работе оплачен и тд - при выборе нескольких заказов в списке и нажатии кнопки в работе - пакетно всем заказам присваивается статус в работе. Joomla 3.0 - подскажите с чего начать, куда глядеть и как сделать - первый раз столкнулся с таким заданием (
Записан
AlekVolsk
Профи
********

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

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



« Ответ #1 : 09.04.2015, 08:20:39 »

Как делал я: смотрел, как сделан com_content и делал по аналогии (это по второму вопросу).

По сортировке: а у вас что, дата и время в базе раздельно хранятся?
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #2 : 09.04.2015, 15:51:43 »

Да. мне необходимо было отдельно записать в ячейку дату и в отдельную ячейку время (не спрашивайте почему, там много раз менялась задача самого компонента Sad ). По этому я не могу сортировать по дате которая была бы в формате 01-12-2015 03:45 как по отдельной ячейке Бд (по аналогии к примеру с ид)
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #3 : 09.04.2015, 16:26:28 »

Да. мне необходимо было отдельно записать в ячейку дату и в отдельную ячейку время (не спрашивайте почему, там много раз менялась задача самого компонента Sad ). По этому я не могу сортировать по дате которая была бы в формате 01-12-2015 03:45 как по отдельной ячейке Бд (по аналогии к примеру с ид)
Зачем вам было писать в таком формате 01-12-2015 03:45 если надо было выбрать тип поля DATETIME и писать в него и дату и время! С ним можно любые манипуляции делать средствами SQL!
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #4 : 09.04.2015, 16:35:58 »

Дело в том что  компонент имеет форму  добавления заказа как с фронта так и с бека. С фронта по условию пользователь должен видеть 2 формы - дата и время. Соответственно 2 ячейки в бд.
Собственно гипотетически можно ведь выбрать сортировку в запросе по типу ORDER BY `date` , `time` ASC к примеру ?
Записан
AlekVolsk
Профи
********

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

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



« Ответ #5 : 09.04.2015, 18:50:16 »

С фронта по условию пользователь должен видеть 2 формы - дата и время. Соответственно 2 ячейки в бд.
Собственно гипотетически можно ведь выбрать сортировку в запросе по типу ORDER BY `date` , `time` ASC к примеру ?
Необязательно 2 поля в бд, можно было объединить значение перед записью в базу.
Гипотетически - да, должно сработать:
Код
ORDER BY `date` ASC, `time` ASC
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #6 : 09.04.2015, 21:31:38 »

Необязательно 2 поля в бд, можно было объединить значение перед записью в базу.
Гипотетически - да, должно сработать:
Код
ORDER BY `date` ASC, `time` ASC
честно говоря я думал об этом, но там есть еще функционал формирования отчета в пдф - админ выбирает компанию заказчика, диапозон дат от и до и формирует пдф - возможно тут даже помешало бы объеденение (имхо не проверял но всякое)

смотрите - вот что попробовал и вот что получилось :

в файле administrator/components/com_mycomponent/models/mycomponents.php (где на сколько я понимаю формируется запрос к БД для вывода результатов в список и фильрации дальнейших ) обозначил новую ячейку в массиве

 
Код
 public function __construct($config = array())
 {
   if (empty($config['filter_fields'])) {
     $config['filter_fields'] = array(
       'id', 'a.id',
       'order_id', 'a.order_id',
       'date', 'a.date',
       'time', 'a.time',
       'state', 'a.state',
       'company_name', 'a.company_name',        
       'date', 'a.date',  
       'time', 'a.time',      
       'company_adress', 'a.company_adress',
       'adress', 'a.adress'
     );
   }
 
   parent::__construct($config);
 }
далее в формировании переменной для сортировке прописал сл:
Код
    $orderCol  = $this->state->get('list.ordering');
   $orderDirn  = $this->state->get('list.direction');
   if ($orderCol == 'a.ordering' || $orderCol == 'category_title') {
 
         $orderCol = 'a.name '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
   }
 
   $query->order($db->escape($orderCol.' '.$orderDirn));
echo $query;
   return $query;
 
 }

на сколько я понимаю строка
Код
 $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
по идее и должна быть тем самым условием 
Код
ORDER BY `date` ASC, `time` ASC

но  echo $query; пишет SELECT * FROM `zdj5e_zakaz` AS a ORDER BY a.date asc
и при этом результат, который отфильтровывается, есесн сортируется только по дате.

натолкните - что не так делаю  -ведь по идее должно сработать
Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #7 : 09.04.2015, 22:45:43 »

omg, вы PHP то вообще знаете? Что вы вобще написали такое, вы хоть понимаете?

ведь по идее должно сработать

нет, не должно сработать.
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #8 : 09.04.2015, 23:40:22 »

omg, вы PHP то вообще знаете? Что вы вобще написали такое, вы хоть понимаете?

не так хорошо как хотелось бы по этому и сижу здесь и на других форумах. Знаете - подскажите, не знаете или не хотите - не засоряйте тему . Спс за понимание
Записан
zomby6888
Живу я здесь
******

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

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


« Ответ #9 : 10.04.2015, 01:18:05 »

А что тут подсказывать то. Совершенно непонятно что вы вообще делаете. Вот это выражение:
Код
     $orderCol = 'a.name '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
 
то же самое что:
Код
 $orderCol = true;
 

я уже не говорю о том что вы в это условие( if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { ... )  не попадаете даже судя по вашему выводу. Почему оно у вас вообще такое?

вот это строка:
Код
$orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
 

Это вообще что? К примеру $orderDirn у вас будет иметь значение ASC. вы получите строку.
Код
$orderCol = 'a.date ASC, a.orderingaa.time ASC, a.ordering'
 

Ну и вообще непонятно зачем вы добавили (аж два раза) два разных фильтра, если сортировка у вас по нескольким полям сразу.

P.S. Прочитайте хотя бы про операторы PHP прежде чем компоненты разрабатывать.
« Последнее редактирование: 10.04.2015, 01:25:24 от zomby6888 » Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #10 : 10.04.2015, 01:27:24 »

Дело в том что компонент я создавал по туториалу - и, стыдно признаться но соглашусь с вами, половину кода я до сих пор не могу сам разобрать по причине того что относительно не давно начала разбирать джумлвские фишки.

на счет
Код
 $orderCol = 'a.name '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
данное выражение  имела ранее немного другой вид и формировало, на сколько я понял, условие сортировки

первоначальный и рабочий вариант:

Код
 $orderCol = 'a.name '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.date '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';


на счет условия ( if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { ... ) - сам не могу понять логику но этот bullshit работает, черт возьми Azn

дело в том что строка

Код
$orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
сформирует запрос по типу

Код
$orderCol = a.date  BY  ASC  a.time  BY ASC'
что в принципе и должно работать, но будь я не ладен не пашет  Lips Sealed
Записан
capricorn
Живу я здесь
******

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

Сообщений: 1420


« Ответ #11 : 10.04.2015, 01:59:51 »

Цитировать
сформирует запрос по типу

Код

$orderCol = a.date  BY  ASC  a.time  BY ASC'

что в принципе и должно работать, но будь я не ладен не пашет  Lips Sealed

в мускуле вы явно не "шар".
Цитировать

половину кода я до сих пор не могу сам разобрать по причине того что относительно не давно начала разбирать джумлвские фишки.

Вы женщина или мужчина?
« Последнее редактирование: 10.04.2015, 02:04:03 от capricorn » Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #12 : 10.04.2015, 02:01:19 »

каюсь - пробелы в знаниях работы с мускулом есть и весьма велики .
Записан
AlekVolsk
Профи
********

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

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



« Ответ #13 : 10.04.2015, 02:04:58 »

Покажите всю функцию формирования запроса
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #14 : 10.04.2015, 02:06:26 »

Код
<?php
/*Модель через неё идут запросы в базу, соответственно модель работает на запись и вытаскивание данных,
*/

 
// Запрет к прямому доступу. Если кто то попытается обратиться к файлу напрямую, Joomla выдаст пустую страницу.
defined('_JEXEC') or die;
 
/**
* Класс модели
*/

class MycomponentsModelMycomponents extends JModelList
{
//Конструктор
//Дополнительный ассоциативный массив параметров конфигурации.
 public function __construct($config = array())
 {
   if (empty($config['filter_fields'])) {
     $config['filter_fields'] = array(
       'id', 'a.id',
       'order_id', 'a.order_id',
       'date', 'a.date',
       'time', 'a.time',
       'state', 'a.state',
       'company_name', 'a.company_name',        
       'date', 'a.date',  
       'time', 'a.time',      
       'company_adress', 'a.company_adress',
       'adress', 'a.adress'
     );
   }
 
   parent::__construct($config);
 }
 
//Метод для автоматического заполнения model state
//Примечание. Вызов GetState в этом методе приведет к рекурсии.
 
 
 protected function populateState($ordering = null, $direction = null)
 {
   $app = JFactory::getApplication('administrator');
 
 
   // Загрузите состояние фильтра.
   $search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
   $this->setState('filter.search', $search);
 
   $published = $this->getUserStateFromRequest($this->context.'.filter.state', 'filter_state', '', 'string');
   $this->setState('filter.state', $published);
 
   // Загрузка параметров
   $params = JComponentHelper::getParams('com_mycomponents');
   $this->setState('params', $params);
 
   // Список информации о состоянии
   parent::populateState('a.id', 'asc');
 }
 
 
//Родные фильтры Joomla с помощью них создаётся поиск и фильтрация опубликованных и неопубликованных данных
   protected function getStoreId($id = '')
 {
   $id .= ':' . $this->getState('filter.search');
   $id .= ':' . $this->getState('filter.state');
   return parent::getStoreId($id);
 }  
 
 
 /**
  * Метод для создания запросов SQL для загрузки данных списка.
  *
  * Возвращение строк запроса из бд.
  */

 
 protected function getListQuery()
 {
   // Создайте новый объект запроса.
   $db    = $this->getDbo();
   $query  = $db->getQuery(true);
   $user  = JFactory::getUser();
 
   // Выбираем нужные поля из таблицы
   $query->select(
   $this->getState('list.select','*'));
 
   $query->from($db->quoteName('zdj5e_zakaz').' AS a');
 
//Фильтры поиска        
   $search = $this->getState('filter.search');
   if (!empty($search)) {
     if (stripos($search, 'id:') === 0) {
       $query->where('a.id = '.(int) substr($search, 3));
     } else {
       $search = $db->Quote('%'.$db->escape($search, true).'%');
       $query->where('(a.company_name LIKE '.$search.')
         OR (a.name LIKE '
.$search.')OR (a.order_id LIKE '.$search.')');
     }
   }    
 
 
// Фильтр по состоянию публикации
   $published = $this->getState('filter.status');
   if (is_numeric($published)) {
     $query->where('a.status = '.(int) $published);
   } elseif ($published === '') {
     $query->where('(a.status IN (0, 1))');
   }
 
 
   // сортировка
   $orderCol  = $this->state->get('list.ordering');
   $orderDirn  = $this->state->get('list.direction');
   if ($orderCol == 'a.ordering' || $orderCol == 'category_title') {
 
         $orderCol = 'a.name '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'
     ||  $orderCol = 'a.state '.$orderDirn.', a.ordering';
   }
 
   $query->order($db->escape($orderCol.' '.$orderDirn));
   echo $query;
   return $query;
 
 }
 
 
 
 
 
}
Записан
AlekVolsk
Профи
********

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

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



« Ответ #15 : 10.04.2015, 02:08:16 »

вместо echo $query; укажите print_r($query->__toString()); и покажите результат вывода
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #16 : 10.04.2015, 02:09:59 »

вот такое написало

Код
SELECT * FROM `zdj5e_zakaz` AS a ORDER BY a.date ASC
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #17 : 10.04.2015, 02:13:51 »

вот хоть убейте но не могу понять - но ведь благодаря вот этой строке

Код
$orderCol = 'a.date '.$orderDirn.', a.ordering'

мы имеем в запросе к БД вот это

a.date asc

логично что если мы пропишем

Код
'a.date '.$orderDirn.', a.ordering' . 'a.time '.$orderDirn.', a.ordering'

то должно быть и время в запросе - но его нет /
Записан
AlekVolsk
Профи
********

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

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



« Ответ #18 : 10.04.2015, 02:15:40 »

Все правильно, потому что $query->order($db->escape($orderCol.' '.$orderDirn)); - через list.ordering передается только одно поле, и только его одного вы передаете в $query->order.
Вам необходимо проверять:
Код
if ($orderCol == 'a.date') {
$query->order($db->escape('a.date '.$orderDirn.', a.time '.$orderDirn));
} else {
 $query->order($db->escape($orderCol.' '.$orderDirn));
}
Записан
AlekVolsk
Профи
********

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

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



« Ответ #19 : 10.04.2015, 02:17:37 »

Посмотрите, что у вас на выходе в print_r($db->escape($orderCol.' '.$orderDirn)); и сами все поймете
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #20 : 10.04.2015, 02:19:30 »

Посмотрите, что у вас на выходе в print_r($db->escape($orderCol.' '.$orderDirn)); и сами все поймете
Спасибо - кажется понял - буду разбираться далее Azn
Записан
AlekVolsk
Профи
********

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

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



« Ответ #21 : 10.04.2015, 02:22:07 »

И да: на уровне новичка (да и не только новичка) использование print_r() или var_dump() - лучшее средство отладки, сразу наглядно покажет, что где может быть не так.
Записан
capricorn
Живу я здесь
******

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

Сообщений: 1420


« Ответ #22 : 10.04.2015, 02:22:27 »

я человек темный. но думаю можно использовать var_dump (), чтобы посмотреть содержимое переменных работы с БД. С этим содержимым можно идти в мускул, который и скажет, что не так. Можно, наверное, сразу получить ответ из php, но я по-темному обычно так делаю.

« Последнее редактирование: 10.04.2015, 02:26:29 от capricorn » Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #23 : 10.04.2015, 02:23:37 »

я ранее var_dump(); использовал - просто echo осталось с момента последней правки (не помню почему я это сделал, нет моему поступку прощения Azn ) и так вот и лежит Azn
Записан
AlekVolsk
Профи
********

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

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



« Ответ #24 : 10.04.2015, 02:26:53 »

echo в модели не работает, вместо этого используется print_r() для простого вывода данных. var_dump() показывает не только данные, но и их размер и некоторые полезные доп.атрибуты, а также в более красивом виде показывает массивы.
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #25 : 10.04.2015, 02:28:30 »

честно говоря никогда не задумывался об полезной или хоть какой-то разницы между var_dump(); и print_r(); Azn но спс - буду знать )
Записан
AlekVolsk
Профи
********

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

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



« Ответ #26 : 10.04.2015, 02:29:31 »

Цитировать
Метод тыка и мата помогает в кодинге
Метод мата часто аннулирует понимание того, что пришло методом тыка Wink
Удачи =)
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #27 : 10.04.2015, 02:30:33 »

возможно - но прозрение приходит порой как раз после хорешенького такого матерного тыка в код Azn
Записан
capricorn
Живу я здесь
******

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

Сообщений: 1420


« Ответ #28 : 10.04.2015, 02:40:12 »

выполните ваш SQL запрос, с заведомо нормальными данными, напрямую в мускуле.
Записан
voron121
Осваиваюсь на форуме
***

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

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


Метод тыка и мата помогает в кодинге


« Ответ #29 : 10.04.2015, 02:40:53 »

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

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