Комментариев всего
Комментарии в 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 с нужной записью. Или не будет всплывать чтобы не мозолить глаза фразой «нет комментариев». Естественно, всё тоже самое можно распилить и собрать по-другому, но это уже вопрос вкусов.
