Модификация блока "Прямой эфир"

  • strict warning: Declaration of views_handler_field_user_name::init() should be compatible with views_handler_field_user::init(&$view, $data) in /var/www/shvabrashvabr.ru/sites/all/modules/views/modules/user/views_handler_field_user_name.inc on line 61.
  • strict warning: Declaration of views_handler_argument_many_to_one::init() should be compatible with views_handler_argument::init(&$view, $options) in /var/www/shvabrashvabr.ru/sites/all/modules/views/handlers/views_handler_argument_many_to_one.inc on line 169.


Во втором скринкасте я рассказал о том, как создать блок "Прямой эфир" и привел соответствующую функцию для его темизации. Здесь я привожу модифицированную версию этой функции, которая, кроме всего прочего:

  • выводит ссылку на коллективный блог, в котором размещен пост (разумеется, если пост размещен в коллективном блоге)
  • корректно обрабатывает имя автора комментария, если он оставлен гостем:

function theme_views_view_live($view, $type, $nodes) {
$output = "";
for($i = 0; $i <= count($nodes) - 1; $i++){
$r = db_fetch_object(db_query("SELECT `group_nid` AS nid FROM {og_ancestry} WHERE `nid` = %d LIMIT 0,1", $nodes[$i]->nid));
$x = db_fetch_object(db_query("SELECT `title`, `nid` FROM {node} WHERE `nid` = %d", $r->nid));

$group = "";
if($x->title) {
$group_link = "node/" . $x->nid;
$group_link = drupal_get_path_alias($group_link);
$group = "" . $x->title . " → ";

}

$user_name = "";
if($nodes[$i]->comments_uid) {
$user_name = "comments_uid . "\">" . $nodes[$i]->comments_name . " → ";
} else {
$user_name = $nodes[$i]->comments_name . " → ";
}

$node_path = "node/" . $nodes[$i]->nid;
$node_path = drupal_get_path_alias($node_path);

$output .= $user_name . $group . "comments_cid . "\">" . $nodes[$i]->node_title . "
";
}
return $output;
}

Комментарии

спасибо за мануал по Прямому Эфиру!
есть пару вопросов:

1. где лучше производительность - если сделать выборку из базы вручную (здесь пробегала ссылка на такой код) или получать выборку через views ?

2. как лучше реализовать выдачу "Весь Прямой Эфир", такую как на хабре - http://habrahabr.ru/live/ ?

где лучше производительность - если сделать выборку из базы вручную (здесь пробегала ссылка на такой код) или получать выборку через views ?

Вручную лучше, так как запрос созданный руками будет легче, чем тот, который сделает Views. Вообще модуль Views надо использовать или тогда когда точно известно, что нагрузка на сайт не будет выше определенного предела, или тогда, когда автор сайта не умеет программировать и не умеет работать с SQL.

как лучше реализовать выдачу "Весь Прямой Эфир", такую как на хабре -

Страничная вьюха.

Два вопроса:

  • Как сгруппировать комментарии из одной ноды?
  • Как выводить только количество новых камментов?

То есть, чтобы было примерно так:
В блоке выводится название уникальной ноды только один раз. Рядом выводится ник последнего написавшего каммент в ноде и количество непрочитанных камментов. Названия нод ранжируются в порядке убывания даты написания последнего каммента в ней.

Пример:

Ромка → Youtube Plugin (3/4)
Ромка → Список разделов сайта в FCK (1/1)
Ромка → На почту об ответах на комментарий (23/102)
Ромка → Отображение ветки таксономии (7/8)
Ромка → Описание (0/1)
Coxus → Инвалидный фид (0/3)
nicolas → Сайт для авто-гаража на Друпале (0/34)
vtros → Ник (Карма) (0/35)

Первое число в скобках - непрочитанные камменты. Второе - камментов всего

Ну что, неужели ни у кого мыслей нет?

Последние штрихи!
Гость, фиг с ним, считаю, что гостям не нужно вообще никаких прав давать.
Осталось указать количество комментов.
Рома, объясни, как дабавить количество комментариев?

Вот здесь http://www.drupal.ru/node/18124
есть вариант, но я так к сожалению и не понял как это осуществить? Точнее у меня, видимо от скудных знаний это не получилось.

Что нужно добавить в коде? Или нет, скорее, как правильно написать и в каком месте конкретно вставить?
Спасибо.

Количество комментов к ноде? Это несложно.

После строчки:

for($i = 0; $i <= count($nodes) - 1; $i++){

Нужно добавить:

$com = db_fetch_object(db_query("SELECT comment_count AS count FROM {node_comment_statistics} WHERE nid = %d", $nodes[$i]->nid));

Теперь в переменной $com->count лежит число, соответствующее количеству комментариев привязанных к выбранной ноде, и это число нужно куда-нибудь воткнуть, например заменив строчку:

$output .= $user_name . $group . "comments_cid . "\">" . $nodes[$i]->node_title . "";

на

$output .= $user_name . $group . "comments_cid . "\">" . $nodes[$i]->node_title . " (" . $com->count . ")";

О_о СПАСИБО!
Всё получилось и работает.
Ура! Прямой эфир доведён до ума!

вобщем почему то в прямом эфире и здесь на швабре так и показывает классический вид ссылок на юзеров и посты вида http://shvabrashvabr.ru/user/216
и http://shvabrashvabr.ru/node/327

хотя в самих постах со ссылками всё ок

т.е. они вида http://shvabrashvabr.ru/users/vtros и посты http://shvabrashvabr.ru/blog/dovedem-do-uma

как все таки корректно их настроить чтобы было одинаково нормально во всех местах?

Немного не понял вопроса, но за преобразование системного пути в человекопонятный алиас отвечает функция drupal_get_path_alias, по этому в нужных местах вместо:

print "node/" . $node->nid;

нужно использовать код:

print drupal_get_path_alias("node/" . $node->nid);
, если алиас найден, то он будет использован вместо системного пути, если не найден, то будет использован системный путь.

аватар: a.mohax

и весию для тех кто неиспользует OGroup можно попросить? (:

Не понял вопроса. Подробнее объясни что нужно...

аватар: a.mohax

Модуль OG у меня не установлен (пока нет необходимости),. Вставляю этот код в template.php, и выходит такая ошибка:
user warning: Table 'gn_aboutDB.d57_og_ancestry' doesn't exist query: SELECT `group_nid` AS nid FROM d57_og_ancestry WHERE `nid` = 57 LIMIT 0,1 in /var/home/users/site/web/includes/database.mysql.inc on line 172.

Это не в отсутствии модуля "OG Alias" дело, а в отсутствии модуля "Organic Groups". Попробуй такую версию функции:


function theme_views_view_live($view, $type, $nodes){
$output = "";
for($i = 0; $i <= count($nodes) - 1; $i++){
if(module_exists("og")) {
$r = db_fetch_object(db_query("SELECT `group_nid` AS nid FROM {og_ancestry} WHERE `nid` = %d LIMIT 0,1", $nodes[$i]->nid));
$x = db_fetch_object(db_query("SELECT `title`, `nid` FROM {node} WHERE `nid` = %d", $r->nid));

$group = "";
if($x->title) {
$group_link = "node/" . $x->nid;
$group_link = drupal_get_path_alias($group_link);
$group = "" . $x->title . " → ";

}
} else {
$group = "";
}

$user_name = "";
if($nodes[$i]->comments_uid) {
$user_name = "comments_uid . "\">" . $nodes[$i]->comments_name . " → ";
} else {
$user_name = $nodes[$i]->comments_name . " → ";
}

$node_path = "node/" . $nodes[$i]->nid;
$node_path = drupal_get_path_alias($node_path);

$output .= $user_name . $group . "comments_cid . "\">" . $nodes[$i]->node_title . "
";
}
return $output;
}

Протестировал, вроде работает. А.mohax, отпишись, если у тебя тоже проблем с кодом не будет.

аватар: a.mohax

Спасибо Ромка! Я очень благодарен вам. Вот этот код замечательно работает!

аватар: a.mohax

Здравствуйте. Да именно про отсутствие модуля "Organic Groups" я и говорил. Сейчас протестировать никак не могу, у хостера сломался досту к сайту по FTP. И такое бывает. Обещал, опять, сегодня починить. Отпишусь обязательно.

Рома не работает корректно ссылка юзера. То есть ссылка на юзверя остаётся ввида /user/*
Синоним pathauto не прокатывает.

Жду возвращения и твоих предложений и решений.

Хммм... Ну это вопрос уже не к ог алиасу, а к пазавто. Если правильно задать маску в "User path settings" (у меня там по дефолту прописано "users/[user-raw]"), поставить галку "Bulk generate aliases for users that are not aliased" и сохранить изменения, то для всех существующих пользователей должны будут создаться алиасы, для новых юзеров они будут создаваться автоматически.

Мне кажется это вопрос к фукнции темизации прямого эфира... для ссылки на комментарий алиасы мы добывали... а для ссылки на профиль юзера алиас мы не добыли... я сделал так :)

блок user_name:


$user_name = "";
if($nodes[$i]->comments_uid) {
$user_name = "<a href=\"" . base_path() . "user/" . $nodes[$i]->comments_uid . "\">" . $nodes[$i]->comments_name . "</a> → ";
} else {
$user_name = $nodes[$i]->comments_name . " → ";
}

Я немного переделал по образу блока node_path и получилось:


$user_path = "user/" . $nodes[$i]->comments_uid;
$user_path = drupal_get_path_alias($user_path);

$user_name = "<a href=\"" . base_path() . $user_path . "\">" . $nodes[$i]-gt;comments_name . "</a> → ";
} else {
$user_name = $nodes[$i]->comments_name . " → ";
}

На моем сайте работает... Хочу сделать коллективный блог про минимал техно :) по образу и подобию швабра :) Спасибо Ромке...
С твоего сайта я начал углубляться в друпал и php :)

немогу побороть долбанное форматирование коментов здесь :)
надеюсь смысл понятен :)

Я пробовал и так и так, то есть [user-raw] и [user], не помогает. Может с темой как-то связанно?

Вопрос: например в теме garland по умолчанию посты в коллективных блоках не выводятся в режиме - "Имя кол.блока -> Имя поста" , а выводятся в режиме "Имя поста". Как поправить?

Нашел, туплю. Но все равно название группы остается просто надписью, а не ссылкой. Что делать?

Поставь вот такую сентенцию:


<?php
$group = "";
if($node->title) {
$group_link = "node/" . $node->og_groups[0];
$group_link = drupal_get_path_alias($group_link);
$group = "" . $node->og_groups_both[$node->og_groups[0]] . " → ";

}
?>
<?php print $group; ?>

Где нашел?

В соседнем посте.
http://shvabrashvabr.ru/blog/shvabra/opisanie
В каментах описано.

Там какая-то хитрость с кодировкой. Вместо стрелок пришлось вставить стрелку кодом.

У меня тоже вместо стрелочек - знаки вопроса в прямом эфире

как ты вставил - подскажи плиз ?

Попробуйте сохранить файл как UTF without BOM. Это может текстовый редактор Notepad++ или Notepad2 или им подобные...
Должно помочь ;)

Стрелку сделать:

→ - вправо
← -влево

Back to top