Интересное решение на неявном преобразовании типов

Задача, собственно, проста: ненавязчиво напоминать пользователю когда он последний раз читал топик надписью в заголовке о количестве дней, прошедших с момента последнего его прочтения. Делается так:
{$numberOfDays = ($smarty.now|date_format:"%Y%m%d"-0)-($oTopic->getDateRead()|replace:"-":""-0)}
{if ($numberOfDays != 0) }
    <div style="font-size: 10px; display: inline; color: #d3d3d3;">
        (Прочитано {$numberOfDays} дней назад)
    </div>
{/if}

Комментировать дальше не буду, но на вопросы отвечу).

15 комментариев

avatar
Написал бы уже где этот код вставить для новичков, а так зачот.
avatar
в topic header помоему
avatar
Редактор съел тег (не обернул кодом). Было так:
Код добавляется в topic_part_header.tpl в элемент
<h1 class="topic-title word-wrap">
    {if $oTopic->getPublish() == 0}   
        <i class="icon-tag" title="{$aLang.topic_unpublish}"></i>
    {/if}
    
    {if $oTopic->getType() == 'link'} 
        <i class="icon-share-alt" title="{$aLang.topic_link}"></i>
    {/if}
    
    {if $bTopicList}
        <a href="{$oTopic->getUrl()}">{$oTopic->getTitle()|escape:'html'}</a><---СЮДА
    {else}
        {$oTopic->getTitle()|escape:'html'}
    {/if}
</h1>

после ссылки с заголовком.
avatar
Код добавляется в topic_part_header.tpl в элемент после ссылки с заголовком
avatar
у меня нету topic_part_header.tpl… можете подсказать где для 0.5.1 искать?
avatar
ну посмотрите что там есть и воткните куда надо.
avatar
Лучше ставить под
{if $oTopic->getType() == 'link'}

{/if}

{$numberOfDays = ($smarty.now|date_format:"%Y%m%d"-0)-($oTopic->getDateRead()|replace:"-":""-0)}
{if ($numberOfDays != 0) }
(Прочитано {$numberOfDays} дн. назад)

{/if}
Смешно выглядит (Прочитано 3 дней назад) < — :) а хотелось бы автоматом определение. 3 дня назад
avatar
Смешно выглядит вот это: regexp-based address validation, а я лишь показал неявное преобразование типов в smarty/php. Я не говорил, что это руководство к действию. А определение автоматом только через PHP в движке или расширении, иначе получится еще смешнее.
avatar
в смарти есть склонение по языкам.
avatar
Полезный прибамбас. Только слова надо подправить, не просто Прочитано 5 дней назад а Прочитано мной 5 дней назад, а то юзеру будет непонятно кем это было прочитано :)
  • aex
  • 0
avatar
если сайт не для клинических идиотов, то вполне понятно будет кем там прочитано.

Заглюнул мельком в базу, увидел там таблицу table_read в которой сохраняются все просмотры. Мне вот интересно это не тормозит? Допустим у меня сайт с 100-120 постоянно залогиненных юзеров которые в день заходят минимум в 20 новых «топиков». Т.е получается в среднем 100*20 записей в день или 2000 строк*31. Итого почти 50.000 строчек в таблице за один месяц.

В скриптах лазить не стал, мне интересно эта таблица чистеца или как оно вообще оптимизировано. Судя по всему только кешами.
avatar
Эта таблица состоит из 4-x целочисленных полей и одного DATETIME, итого 4*4+8=24 байта одна запись. В вашем примере 50000*24/1024/1024=1.4 мегабайта/в месяц. атрибуты таблицы по которым идет отбор в индексе. Сложные запросы и по ней не работают. По моему если и будет тормозить, то не более, чем остальные таблицы.
avatar
есть smarty функция date_format
* Список ключей параметров:
 * 		date*          [string]
 * 		format*        [string]
 * 		declination*   [int]
 * 		now*           [int]    Количество секунд, в течении которых событие имеет статус "Только что"
 * 		day*   	       [string] Указывает на необходимость замены "Сегодня", "Вчера", "Завтра".
 * 								В указанном формате 'day' будет заменено на соответствующее значение.
 * 		minutes_back*  [int]    Количество минут, в течении которых событие имеет статус "... минут назад"
 * 		hours_back*    [int]    Количество часов, в течении которых событие имеет статус "... часов назад

Можно добавить days_back по аналогии с hours_back и вставлять кратко и лаконично в шаблон без лишних манипуляций.
avatar
Вот потому, что hours_back нет в реализации функции, мне придется создать собственную функцию smarty/[изменить уже существующую], то есть внести изменения в движок — что неправильно или реализовать плагин, переопределяющий $oTopic. Мне кажется моя реализация немного проще).
avatar
И вновь спасибо за хороший хак )
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.