Комплексная сортировка таблиц
Мы отслеживаем прогресс проекта в единой базе данных. За последние два года требования руководства изменили формат, в котором мы храним даты (первоначально, просто год, затем год, месяц, теперь полные даты). Чтобы гарантировать отсутствие жалоб от базы данных, предыдущий администратор настроил таблицу для хранения дат в varchar
вместо date
, Я создал веб-интерфейс для пользователей для доступа и создания отчетов, но веб-страница статична (на стороне пользователя). Руководство хочет иметь возможность сортировки, нажав на заголовки таблицы. Это легко. Моя проблема в тех датах! Из-за форматов они сортируются неправильно.
Вот три формы, в которых даты могут появляться в PHP: %Y
, %Y%m
, а также %c/%e/%Y
,
Я использую TableSorter для сортировки таблицы, но я не могу понять, как сортировать даты с помощью jQuery. Первоначальная сортировка выполняется полностью в запросе MySQL:
ORDER BY
CASE WHEN cstatus = 'Complete' THEN 1 ELSE 0 END DESC,
CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 6 THEN
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%m/%d/%Y'), '%c/%e/%2014')
ELSE
CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 4 THEN
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y%m'), '%c/%e/%Y')
ELSE
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y'), '%c/%e/%Y')
END
END DESC,
id DESC
Мне нужно повторить сортировку для столбцов даты в сортировке jQuery.
Надеюсь, мне повезет больше после ночного отдыха, но я хотел опубликовать это на тот случай, если кто-нибудь может дать мне старт. ^^
Решение:
Я изменил запрос, чтобы вместо сортировки по условиям сначала оставить для него сортировку по умолчанию и создать дополнительные столбцы для заполнения data-text
атрибут, как предложено Мотти.
SELECT
CASE WHEN cdevelopmentStart IS NULL THEN
'01/01/2012'
ELSE
CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 6 THEN
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%m/%d/%Y'), '%m/%d/%Y')
ELSE
CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 4 THEN
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y%m'), '%m/01/%Y')
ELSE
DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y'), '01/01/%Y')
END
END
END AS developmentSort,
CASE WHEN courses.cstatus = 'Complete' THEN
0
ELSE
CASE WHEN courses.cstatus = 'Cancelled' THEN
1
ELSE
CASE WHEN courses.cstatus = 'Hold' THEN
2
ELSE
CASE WHEN courses.cstatus = 'Review' THEN
3
ELSE
CASE WHEN courses.cstatus = 'Rework' THEN
4
ELSE
CASE WHEN courses.cstatus = 'Open' THEN
5
ELSE
6
END
END
END
END
END
END AS statusSort
Затем я добавил data-text="' . $result['developmentSort'] . '"
а также data-text="' . $result['statusSort'] . '"
в соответствующие столбцы сгенерированной PHP таблицы. Наконец, я настроил сортировку по умолчанию и дал команду извлечь из data-text
атрибут, если он установлен, добавив следующее к <HEAD>
:
$("#mainlist").tablesorter({
textAttribute: 'data-text',
usNumberFormat: true,
sortList: [[19, 0], [6, 1], [0, 1]]
});
Спасибо, Мотти, за быстрый ответ и решение.:)
2 ответа
Возможно, самым простым решением было бы добавить атрибут данных в каждую ячейку таблицы, которая содержит "правильно" отформатированную строку даты
<td data-text="1/1/2015">2015 01</td>
затем, если вы используете мой форк TableSorter, вы можете использовать следующий код ( демо):
$(function () {
$('table').tablesorter({
theme: 'blue',
// data-attribute that contains alternate cell text
textAttribute: 'data-text',
// false for German "1.234.567,89" or French "1 234 567,89"
usNumberFormat: true
});
});
Если вам необходимо использовать оригинальный сортировщик таблиц, то вы можете использовать этот код с тем же HTML ( демо):
$(function () {
$('table').tablesorter({
// set to "us", "pt", "uk", "dd/mm/yy"
dateFormat: "us",
// custom table cell text extraction method
textExtraction: function (node) {
var $node = $(node);
return $node.attr('data-text') || $node.html();
}
});
});
Как только вы введете даты, я сделаю их одинаковыми. Так что на дату "2014" сделайте это "01.01.2014". Для даты "2014/6" сделайте это "01.06.2014". Они должны быть в состоянии отсортировать их все, потому что все они будут датами в одном формате.