Добрый день.
Помогите с решением задачи.
Дано: в проекте есть основной тип материала - карточка пользователя (не путать с профилем пользователя). Это тип материалов, в котором подробно описывается пользователь сайта. Этот документ единственный для каждого пользователя. Есть другие типы материалов которые может создавать пользователь (их число неограниченно), например TypeA, TypeB, TypeC и т.д.
Задача стоит следующим образом: надо сделать вьюшку, в которой будут выводиться все карточки пользователей а так же подсчитываться количество документов определённых типов, и количество записей в поле C карточки пользователя, т.е. надо сделать вьюшку следующего вида:
Card1 26 12 4
Card2 13 8 2
Card3 4 3 0
Вьюшка уже есть, сделана стандартным способом через модуль views, т.е. не кодом.
Делать подсчёт количества нод внутри вьюшки, на мой взгляд не правильно, потому что работа такой вьюшки будет очень ресурсоёмка (т.е. на каждую карточку пользователя придётся по несколько селектов).
Как я решаю эту задачу: Я сделал в карточке пользователя 3 поля, внутри которых хранится искомое количество документов и записей в поле. Заполнять эти поля, планирую в момент создания пользователем новой ноды указанного типа. Т.е. я использую хук menu_alter, в котором задаю callback-функцию, внутри которой считаю количество уже существующих материалов нужного типа, делаю +1 и пытаюсь сохранить в поле ноды "карточка пользователя". Не работает
Уважаемые спецы, помогите решить задачу. Вполне допускаю, что у меня где-то алгоритмический просчёт и эту задачу надо решать совсем по-другому.
P.S. Вставлю часть кода модуля, чтоб не быть голословным:
<?php function docs_count_menu_alter(&$items) {
$items['node/add/doc']['page callback'] = 'docs_count_article_page_callback';
$items['node/add/pic']['page callback'] = 'docs_count_pic_page_callback';
}
function docs_count_article_page_callback() {
global $user;
global $node;
if ($user->uid == 0)
return node_add('doc');
$count = db_query("SELECT COUNT(*) FROM {node} n
WHERE n.uid = $user->uid AND n.type = 'doc'")->fetchField();
if ($count > 0) {
$node->field_docs_count['ru'][0]['value'] = $count;
}
return node_add('doc');
}?>
Комментарии
ну, я б сделала вьюсом для начала. Views это конструктор запросов, а вам и нужен запрос. Кеш тоже никто не отменял
вы суровый
есть хуки на «после создания ноды» (http://api.drupal.org/api/drupal/modules%21node%21node.api.php/function/...). Но вам надо будет не забыть и про неопубликованное/опубликованное, и про удаленные ноды, и про смену автора и короче куча всего.
'und' там поставьте, может и заработает, но я б это сожгла
Да, надо попробовать сделать всё же через вьюшку и замерить время формирования. Может и зря оно всё.
В смысле?
Точно, этот хук будет логичнее использовать.
Да, про это я не подумал. Надо вставить проверки.
Почему?
кстати вот ещё материал http://xandeadx.ru/blog/drupal/505 но я думаю что для Views 3 он может и не понадобиться
потому что код ацкий
К сожалению, в документации к этому модулю написано: «The field will not work in views »
Переписал код модуля, сделал через хук node_insert()
<?php function docs_count_node_insert($node) {
global $user;
if ($node->type == 'doc') {
$count = db_query("SELECT COUNT(*) FROM {node} n
WHERE n.uid = $user->uid AND n.status = 1
AND n.type = 'doc'")->fetchField();
$node->field_doc_count['und'][0]['value'] = $count;
}
}?>
Всё равно не работает. Не могу понять почему.
А! Я понял почему не работает: $node содержит другой объект - сохраняемую ноду, а не ноду карточки, куда надо сохранить посчитанное значение. Сразу же встаёт другой вопрос: как теперь корректно изменить поле совсем другой ноды, а не той, что в данный момент сохраняется?
Загрузить.
Изменить.
Сохранить.
Но вы занимаетесь хернёй
что вы делаете? вам надо найти ноду, соответствующую карточке юзера, положить в нее ваш $count и сделать node_save().
p.s. не $user->uid а $node->uid
Аргументируйте
Сделал так, после чего сервер упал:
<?php
function docs_count_node_insert($node) {
if ($node->type == 'doc') {
$count = db_query("SELECT COUNT(*) FROM {node} n WHERE n.uid = $node->uid
AND n.type = 'doc'")->fetchField();
if ($count >= 1) {
$nid = db_query("SELECT n.nid FROM {node} n where n.uid = $node->uid
AND n.type = 'user_card'")->fetchField();
$user_card = node_load($nid);
$user_card->field_docs_count['ru'][0]['value'] = $count;
node_save($user_card);
}
}
}
?>
Поэтому и спрашиваю, как сделать правильно. Пока опыта программирования под Друпал мало.
включите валидатор php кода в своем редакторе и поставьте точки с запятыми
Разве в Notepad++ есть php-валидатор?
Да пропустил одну точку с запятой, исправил. И в целом код подправил, всё равно не записывает в поле. Куда копать?
ну сказала же,LANGUAGE_NONE. ппц какойто, молодой человек.
"Спокойней, спокойней" (с)
Работает с 'und'. Спасибо за комментарий
Хотя нет, поторопился. С 'ru' как раз не работает.