Перейти к содержимому


Группировка по месяцу

группировка фильтр месяц

Сообщений в теме: 9

#1 Аlex Jet

    Активный участник

  • Пользователи
  • PipPipPip
  • 38 сообщений
  • Пол:Мужчина
  • Город:Уфа

Отправлено 06 Май 2017 - 14:07

Сделал группировку записей в таблице по месяцу с годом, для этого добавил поле Период, значение которого вычисляется по дате

$data1 = strtotime($line['Дата выполнения']);  //Получаем дату из поля "Дата выполнения"
$months = array( 1 => 'Январь' , 'Февраль' , 'Март' , 'Апрель' , 'Май' , 'Июнь' , 'Июль' , 'Август' , 'Сентябрь' , 'Октябрь' , 'Ноябрь' , 'Декабрь' );
$line['Период'] = date($months[date( 'n',$data1 )] . ' Y',$data1 );  //Выводим месяц и год в поле "Период"

В итоге поле Период принимает значения Апрель 2017, Май 2017 и т.д.

При выведении в таблице стоит сортировка по полю Дата, но изначально все записи группируются по полю Период, и выводятся в алфавитном порядке. Сначала выводятся записи Апреля, потом Декабря, а потом Мая и тд. Внутри каждой группы записи сортируются как надо, по дате.

Можно ли сделать, чтобы сортировка самих групп была по дате, а не по названию месяца? Менять названия месяцев на цифры не хочется, так как будет выглядеть некрасиво.
Белый сервис - сервисный центр, работающий на одной из лучших CRM.

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Май 2017 - 14:53

Боюсь что нет, это системная установка. Приоритет сортировки всегда у группируемого поля, иначе в общем случае это могло бы сломать бы группировку. У вас все таки частный случай.

Попробуйте такой вариант: создайте справочник периодов, где они будут добавлены в нужном порядке, а поле Период сделайте полем связи. Тогда по идее сортировка должна пройти как надо. Понятно что реализация несколько усложнится, но зато не нужно будет цифры добавлять.

Или еще в голову пришло: включаете html режим в поле и добавляете скрытую через css цифру впереди имени периода.

#3 Аlex Jet

    Активный участник

  • Пользователи
  • PipPipPip
  • 38 сообщений
  • Пол:Мужчина
  • Город:Уфа

Отправлено 07 Май 2017 - 12:40

Изменил поле Период вручную, получилось следующее:
<p style="display: none;">01</p>Май 2017
При таком написании код работает, в таблице отображается только месяц и год, цифры не отображаются.

По этому же принципу переписал вычисление:
$data1 = strtotime($line['Дата выполнения']);  //Получаем дату из поля Дата выполнения
$months = array( 1 =>
'<p style="display: none;">01</p>Январь' ,
'<p style="display: none;">00</p>Февраль' ,
'<p style="display: none;">03</p>Март' ,
'<p style="display: none;">04</p>Апрель' ,
'<p style="display: none;">05</p>Май' ,
'<p style="display: none;">06</p>Июнь' ,
'<p style="display: none;">07</p>Июль' ,
'<p style="display: none;">08</p>Август' ,
'<p style="display: none;">09</p>Сентябрь' ,
'<p style="display: none;">10</p>Октябрь' ,
'<p style="display: none;">11</p>Ноябрь' ,
'<p style="display: none;">12</p>Декабрь' );
$line['Период'] = date($months[date( 'n',$data1 )] . ' Y',$data1 );  //Выводим месяц и год в поле Период

В итоге поле Период принимает значение:
<p 003116SaturdayEtc/GMT-3="030000pSaturdayam16: 12201612Etc/GMT-3;">12</p>Декабрь 2016

В таблице отображается цифра и месяц - 05 Май 2017
Белый сервис - сервисный центр, работающий на одной из лучших CRM.

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 08 Май 2017 - 17:19

Очень странно, визуально ваш код выглядит верным. Не представляю даже что могло его испортить.

#5 Tony999

    Активный участник

  • Пользователи
  • PipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 11 Май 2017 - 15:28

Мой Вам совет: "покрасьте" цифры (которые для сортировки) белым, и будет Вам праздник! :)
У меня именно так и сделано.
Умные сайты на заказ
https://info.crm-master.info

#6 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 12 Май 2017 - 12:22

Я в таких случаях делаю таблицу месяцев с ID от 1 до 12 и использую ORDER BY `Год`,`Месяц` где Год - поле числовое, а месяц - ссылочное

#7 vx@ice07.ru

    Участник

  • Пользователи
  • PipPip
  • 23 сообщений

Отправлено 20 Апрель 2018 - 13:19

Просмотр сообщенияАlex Jet (07 Май 2017 - 12:40) писал:

Изменил поле Период вручную, получилось следующее:
<p style="display: none;">01</p>Май 2017
При таком написании код работает, в таблице отображается только месяц и год, цифры не отображаются.

По этому же принципу переписал вычисление:
$data1 = strtotime($line['Дата выполнения']);  //Получаем дату из поля Дата выполнения
$months = array( 1 =>
'<p style="display: none;">01</p>Январь' ,
'<p style="display: none;">00</p>Февраль' ,
'<p style="display: none;">03</p>Март' ,
'<p style="display: none;">04</p>Апрель' ,
'<p style="display: none;">05</p>Май' ,
'<p style="display: none;">06</p>Июнь' ,
'<p style="display: none;">07</p>Июль' ,
'<p style="display: none;">08</p>Август' ,
'<p style="display: none;">09</p>Сентябрь' ,
'<p style="display: none;">10</p>Октябрь' ,
'<p style="display: none;">11</p>Ноябрь' ,
'<p style="display: none;">12</p>Декабрь' );
$line['Период'] = date($months[date( 'n',$data1 )] . ' Y',$data1 );  //Выводим месяц и год в поле Период

В итоге поле Период принимает значение:
<p 003116SaturdayEtc/GMT-3="030000pSaturdayam16: 12201612Etc/GMT-3;">12</p>Декабрь 2016

В таблице отображается цифра и месяц - 05 Май 2017

не верная компоновка строки
вот верная:
$line['Период'] = $months[date( 'n',$data1)].date(' Y',$data1 );

#8 alex_yakovlev

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений
  • Пол:Мужчина

Отправлено 23 Май 2018 - 16:29

Добрый день! Та же задача. Удалось получить в итоге нужный результат?
С предложенной последней компоновкой тоже не работает.

#9 Александр Jet

    Активный участник

  • Пользователи
  • PipPipPip
  • 41 сообщений

Отправлено 24 Май 2018 - 16:46

Просмотр сообщенияalex_yakovlev (23 Май 2018 - 16:29) писал:

Добрый день! Та же задача. Удалось получить в итоге нужный результат?
С предложенной последней компоновкой тоже не работает.

Вот код, который работает сейчас у меня:

//Получаем дату из поля Дата выполнения
$data1 = strtotime($line['Дата выполнения']);
//Получаем месяц
$months = array( 1 =>
   'Январь' ,
   'Февраль' ,
   'Март' ,
   'Апрель' ,
   'Май' ,
   'Июнь' ,
   'Июль' ,
   'Август' ,
   'Сентябрь' ,
   'Октябрь' ,
   'Ноябрь' ,
   'Декабрь' );

//Выводим месяц и год в поле Период
$line['Период'] = '<p style="display: none;">' . date('Y ',$data1 ) . date('m ',$data1 ) . '</p>' . $months[date( 'n',$data1 )] . date(' Y',$data1 );


#10 ber

    Активный участник

  • Пользователи
  • PipPipPip
  • 234 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 29 Май 2018 - 17:35

Я делал просто 01.2018, 02.2017 и т.д. Тогда номер месяца идёт по порядку. Ну или 2018.02 (что бы и года шли по порядку). А вообще конечно не хватает поля типа Месяц с выбором типа отображаемых значений. Есть же дата без времени.
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных