Комплексная сортировка таблиц

Мы отслеживаем прогресс проекта в единой базе данных. За последние два года требования руководства изменили формат, в котором мы храним даты (первоначально, просто год, затем год, месяц, теперь полные даты). Чтобы гарантировать отсутствие жалоб от базы данных, предыдущий администратор настроил таблицу для хранения дат в 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". Они должны быть в состоянии отсортировать их все, потому что все они будут датами в одном формате.

Другие вопросы по тегам