Менеджер событий. Поздравлялка с ежегодными событиями.

5 года 7 мес. назад - 5 года 7 мес. назад #3554 от athree
Добрых суток :)

Задался тут целью сделать простенький менеджер событий, выводящий кои в определенном диапазоне.

Суть довольно проста. Тип контента, назовем его "Event", содержит два поля (простые числовые списки), первый - "месяц" (01-12), второй - "число" (01-31), сохраняются которые в БД в поля "month" и "day" соответственно. Есть, конечно, и другие поля, например "название события" и "текст события", но это не суть... Ну и таким образом заполняется база данных всеми нужными ежегодными событиями.

Сложность в выводе этого дела в виде списка. Если достаточно события вывести только на сегодняшний день, то можно с помощью простейшего самописного Live Value плагина подставлять в поля "месяц" и "число", собственно, текущие месяц и число, и дело в шляпе. А вот как выводить в диапазоне, например, на минус десять дней тире сегодняшний день, я в тупике...

Первая мысль была следующая. Искать в диапазоне нет сложности, достаточно создать копию поля числа месяца, с тем же стореджем (day). Основное поле, например, будет первым крайним значением диапазона (минус десять дней), а копия - вторым (сегодняшний день), значения подставлять с помощью упомянутого самописного Live Value плагина, ну и в Match указать Numeric ">" и "<". А вот как это дело теперь связать с месяцем?

Вторая мысль была использовать Picker Calendar, в Format указать "m-d" (т.е. показывать только месяц и день), а искать тогда с помощью Match: Date. Проблема, что при поиске все равно будет учитываться и год, даже когда тот скрыт (т.к. в БД он все равно заносится), что совсем не нужно. Это доказано экспериментальным путем. Тоже тупик.

Если мои размышления вас запутали, то еще раз повторю: при создании события нужно указать любым способом месяц и число события, а поиск событий (в модуле, например), осуществлять в диапазоне -10 дней по текущий день.

У кого есть какие мысли по этому поводу, прошу подсказку :unsure:

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 7 мес. назад #3571 от Wedal
athree, по идее вы мыслите правильно, но нужно использовать в плагине чуть более сложную логику. 10 дней у вас могут выпадать либо только на один месяц, либо на два. Создайте для месяца два поля, аналогичные дню, а в плагине добавьте несколько php-условий проверки. Алгоритм примерно следующий:
1. Получаем в плагине переменные - текущие день и месяц(x и y).
2. Если (x-10) < 1 то y=y-1, если (x+10)>30(или 31, тут нужно еще узнать сколько дней в месяце), y=y+1.
3. Также в пункте 2 нужно проверить чтобы месяц был не первым и не последним, если он является таковым, то присвоить нужные значения. Короче говоря, обычное программирование.
4. Присвоить Live Value полей дня и месяца x и y, а дальше фильтровать.
Спасибо сказали: athree

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 7 мес. назад - 5 года 7 мес. назад #3582 от athree
Wedal, спасибо, подтвердили некоторые мои мысли. Теперь задача на уровне расчета месяца/дня в Live Value выглядит весьма очевидной. На официальном форуме даже есть уже готовый подобный плагин
[url=http://]http://www.seblod.com/support/forum/Field-Live-Values-Plugin/32761-New-Live-Value-Plug-in-to-Get-Past-or-Future-Date-in-Date--Time-Field.html][/url]
возвращающий полную дату, и, взяв его за основу, можно реализовать задуманное. Окей.
Теперь проблема с Match. Простое "больше" и "меньше", очевидно, не подходит. Например, число 3 мая входит в сложный диапазон 24 апреля -> 30 апреля -> 1 мая -> 3 мая, и простое математическое сравнение не применимо. К тому же, еще нужно учитывать и год (для событий на первые числа января нижняя граница диапазона переходит на предыдущий год). Здесь придется внедрять уже в Match, и там править логику, в чем сложность. Во-первых, видимо, Match не поддерживается системой плагинов, значит - жесткий хак, что не только для меня эстетически неприемлемо, а еще и поломает остальные SEBLOD-приложения... Однако, я ни в чем не уверен, если видите, как здесь продолжить путь, прошу пожалуйста.

Я рассматривал второй путь, изначально предложенный мною в первом топике, и тут есть небольшой прогресс. Поля месяц и день можно сохранить в одно поля BD, просто "склеив" их плагином SD Concat, в формате MM-DD.
Ну а дальше:
1)Live Value плагином получать текущий месяц и день, тем же форматом (MM-DD).
2)Сравнивать обычным Match - Date. Он, вроде, правильно интерпретирует такую неполную запись именно как месяц и день.
И вновь возникает проблема расчетов на "сломе" годов. При такой неполной записи, хранящийся в БД и "подсовываемой" в Match, год SEBLOD вроде как все равно учитывает, но, видимо, берет "от балды", то ли текущий, то ли 1970... Таким образом, на выходе получается, что 31 декабря предыдущего года больше, чем 1 января нынешнего (т.к. год не учитывается).
Т.е. на этом пути нужно, опять-таки, "обучать" Match считать и год. И вновь хак, и вновь непростая логика...

Снова и там и там неразрешимое для меня препятствие. Я уже думал использовать поле Core 42 и что-нибудь да запрограммировать, но как бы вновь не споткнуться о Match...

Будут еще какие мысли, прошу :)

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 7 мес. назад #3587 от Wedal
athree, а не проще тогда просто использовать стандартный формат, в котором есть и день, и месяц, и год? Match умеет его сравнивать. В чем проблема?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 7 мес. назад #3592 от athree
Проблема в том, что события повторяются каждый год, что требует создания многих копий одного и того же события на каждый год. Не айс, мягко скажем...

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 7 мес. назад - 5 года 7 мес. назад #3596 от athree
В рамках той же темы:

Можно ли искать по множественному полю (Field X) с запросами Match? Я имею ввиду, что множественные поля хранятся в БД в виде стены текста с тегами-разделителями, и работает только пословный поиск... Может быть, есть какая хитрость?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.


Вверх