Комментариев всего

8 January 2009

Комментарии в MODx делаются с помощью сниппета Jot. Пишем в шаблон [!Jot!] — и вот вам полноценные комментарии. Подсыпав пару параметров можно включить каптчу, премодерацию, автоуведомление автора о новых комментариях и прочие вкусняшки. Кстати, очень интересна разница между русскоязычной и оригинальной документацией, в последней даже рецепты есть, а в первой и о параметрах не сказано. Такое, к сожалению, не редкость.

Так вот, вся сложность включения комментариев на этом сайте была в кастрации превращении навороченного ввода-вывода в то, чем он является сейчас. Пришлось перековырять стандартные шаблоны, потом довести до ума стандартные стили, а потом еще подкрутить всё чтобы валидация xHTML прошла. Вуаля — на сайте комментарии.

А потом потребовалось, по заявкам радиослушателей, добавить к дайджесту (ничего, что я так?) сообщение о количестве имеющихся комментариев. И это оказалось задачкой, пам-пам-пам, так как в сниппете нет такого параметра :) Типа, «а такое мы не проходили» :)

В API MODx я не нашел как можно обратиться к полям других сниппетов. У самого Jot как такового API вообще нет насколько я понимаю. Пораскинув мозгами придумал два варианта: либо дописывать функционал Jot-а до такой фичи, либо писать фичу отдельно. Решил писать отдельно чтобы ничего не уронить :)

Залезаем в БД и вникаем в структуру таблиц Jot-а, в одной из них как раз контент комментариев. Комментарии привязываются к документам через uparent. Сочиняем запрос, которым вытаскиваем количество комментариев. Входными опшнсами по-любому управляю я, поэтому ничего экранировать и проверять не стал.

@$result = mysql_query("SELECT COUNT(id) FROM modx_jot_content WHERE uparent = ". trim($options)) or $out = 'err';

Затем проверяем а не ошибка ли получилась.

if ($out != 'err')

Если нет, то разбираем ответ и выводим количество. Потом в одном месте засвербило и захотелось выводить со склонениями :) А потом еще засвербило и захотелось ничего не выводить если комментариев нет.

{ $out = mysql_fetch_array($result); // разбираем ответ
  if ($out = $out[0]) // если там не ноль, то
  { $mod = $out % 10; // находим отстаток от деления на 10
    $end = 'ев'; //  для большинства окончание -ев
    if ($mod == 1) $end = 'й'; // для 1, 31, 141 -й
    if (($mod > 1) && ($mod < 5)) $end = 'я'; // см. выше
    $out = '<div class="comments">' . $out . ' комментари' . $end . '</div>';
  }
  else // если комментариев нет
    $out = '<!-- нет комментариев -->';
}

Ну а если запрос вернул ошибку, то выводим её, но чтобы никто не заметил :)

else
  $out = '<!--' . mysql_error() . '-->';

 В результате возвращаем что бог послал.

return $out;

Вот и всё. Засовываем всё это в сниппет, я свой назвал phx:comments. В шаблоне теперь записываем [+phx:comments=`[+id+]`+] (где [+id+] — это ИДэ документа) и радуемся, т.к. в нужном месте будет всплывать дивчик класса comments с нужной записью. Или не будет всплывать чтобы не мозолить глаза фразой «нет комментариев». Естественно, всё тоже самое можно распилить и собрать по-другому, но это уже вопрос вкусов.