Есть такая задача - необходимо вывести количество материалов (цифра), которые определенный пользователь отметил определенным флагом. По идее запрос не сложный, но чет не могу разобраться со структурой баз - из каких баз берется это значение?
Для тебя сложный, т.к SQL ты не знаешь и под предлогом того, что ты там в чем-то не можешь разобраться, просишь сделать это за тебя. Любой мало мальски знакомый с базами данных посмотрит структуру таблицы и написать запрос не составит труда. А ты даже в терминологии путаешься.
Если бы я хотел, чтобы за меня сделали, я бы так и написал. SQL я знаю (пусть не профессионально, но простые селекты сделать могу). На данный момент я выбираю так:
<?php $user_flags = db_result(db_query("SELECT count(*) FROM {flag_content} WHERE content_type = '%s' AND fid = %d AND (uid = %d OR uid = 0)", 'node', 2, $node->uid)); echo 'Флагов: '.$user_flags.'<hr />'; ?>
Но это выбирает флаги для всех типов материала, а мне надо для определенного. В таблице делать это через where fcid in (все ноды нужного типа нужного пользователя) как то через задницу.
у меня в типе материала песня есть флаг в топ. я покликал на 10 нодах - показывает цифру 10. зашел под другим ником... показывает цифру 10, добавил от этого ника еще флаг + 11, зашел назад под первым ником - 11 показывает. а должно показывать цифру только ту которую нажал конкретный юзер...
кусок AND fc.uid = %d выбирает для конкретного пользователя. Если что у вас показывается не так, может не так запрос построен? Лично я перед написанием все тестил под несколькими пользователями.
Млин неужели никто не написал еще сниппет на эту тему.
Ладно, мне нужно было отображаться общее количество материалов независимо от типа.
Просто хотел чтоб юзеры рядом с ссылкой закладки видели сколько у них там материалов.
Для пользователя:
<?php $user_flags = db_result(db_query("SELECT COUNT(uid) AS summa,uid FROM `flag_content` WHERE uid=$user->uid GROUP BY uid")); echo $user_flags; ?>
Достаточно только модуля flag.
Для анонима:
<?php $user_flags = db_result(db_query("SELECT COUNT(f.sid) AS summa,f.sid FROM `flag_content` AS f,`session_api` AS s WHERE s.session_id='".addslashes($_COOKIE['session_api_session'])."' AND f.sid=s.sid GROUP BY f.sid")); echo $user_flags; ?>
Помимо модуля flag нужно ставить еще и модуль session API, не забудьте увеличить expire time (это в админке), а то он сессии создает минут на 10 по моему.
Ах да чуть не забыл в файле /sites/all/modules/flag/flag.inc в 710 строке замените INSERT INTO на REPLACE.
Ладно, мне нужно было отображаться общее количество материалов независимо от типа.
Просто хотел чтоб юзеры рядом с ссылкой закладки видели сколько у них там материалов.
а что нужно добавить в запрос что бы для конкретного типа материла для конкретного флага общее число считалось?
т.е. для новостей флаг_1 у юзера Васи выводиться цифра 9 рядом с виджетом флага, у юзера Пети - 0, у типа материалы отчеты флаг_1 у Васи - 12 , а у Пети 0...
ID флага это FID в базе, а вот Тип контента к сожалению это либо node, либо user я так понимаю так что можно погнуть условие только для конкретного флага но для разных типов нод не знаю .. возможно ли.
Может и можно но не в таблице самого модуля flag, так как "Тип контента к сожалению это либо node, либо user" то есть INNER JOIN {node} либо INNER JOIN {user} потому как для модуля flag "node" - это общее понятие, технически можно сделать еще один запрос в базу к $node и оттуда уже вытащит конкретные типы нод (story, page) и т.д.
Комментарии
Для тебя сложный, т.к SQL ты не знаешь и под предлогом того, что ты там в чем-то не можешь разобраться, просишь сделать это за тебя. Любой мало мальски знакомый с базами данных посмотрит структуру таблицы и написать запрос не составит труда. А ты даже в терминологии путаешься.
Если бы я хотел, чтобы за меня сделали, я бы так и написал. SQL я знаю (пусть не профессионально, но простые селекты сделать могу). На данный момент я выбираю так:
<?php
$user_flags = db_result(db_query("SELECT count(*) FROM {flag_content} WHERE content_type = '%s' AND fid = %d AND (uid = %d OR uid = 0)", 'node', 2, $node->uid));
echo 'Флагов: '.$user_flags.'<hr />';
?>
Но это выбирает флаги для всех типов материала, а мне надо для определенного. В таблице делать это через where fcid in (все ноды нужного типа нужного пользователя) как то через задницу.
Ответа на вопрос даже не ожидал, честно говоря. Тем, кому интересно, количество флагов выводятся сниппетом:
<?php
$flag_id = 1; //параметр fid в таблице flags
$type = 'node'; //параметр content_type в таблице flag_content
$material = 'story'; //параметр type в таблице node
$user_flags = db_result(db_query("SELECT count(*) FROM {flag_content} fc INNER JOIN {node} nd WHERE fc.content_type = '%s' AND fc.fid = %d AND fc.uid = %d AND (nd.nid = fc.content_id and nd.type = '%s')", $type, $flag_id, $node->uid, $material));
echo 'Флагов: '.$user_flags.'<hr />';
?>
Входные данные можно вытянуть стандартными функциями, но в качестве примера будет достаточно
выше код не решает задачу из первого поста... имхо...
Т.е я выложил код, который не решает задачи, которую я же и поставил? Оригинально
ну да.
у меня в типе материала песня есть флаг в топ. я покликал на 10 нодах - показывает цифру 10. зашел под другим ником... показывает цифру 10, добавил от этого ника еще флаг + 11, зашел назад под первым ником - 11 показывает. а должно показывать цифру только ту которую нажал конкретный юзер...
собственно как у вас и написано в первом посте.
кусок AND fc.uid = %d выбирает для конкретного пользователя. Если что у вас показывается не так, может не так запрос построен? Лично я перед написанием все тестил под несколькими пользователями.
ну не знаю я все добавил весь код и изменил 1 на свой fid и свой тип материала прописал
Показывает всегда 0 флагов. iNFerNo прав, код не работает.
Помажите вывести у флага количество отмеченных материалов конкретного типа. Красиво смотриться на друпалСН.ру
Млин неужели никто не написал еще сниппет на эту тему.
Ладно, мне нужно было отображаться общее количество материалов независимо от типа.
Просто хотел чтоб юзеры рядом с ссылкой закладки видели сколько у них там материалов.
Для пользователя:
<?php
$user_flags = db_result(db_query("SELECT COUNT(uid) AS summa,uid FROM `flag_content` WHERE uid=$user->uid GROUP BY uid"));
echo $user_flags;
?>
Достаточно только модуля flag.
Для анонима:
<?php
$user_flags = db_result(db_query("SELECT COUNT(f.sid) AS summa,f.sid
FROM `flag_content` AS f,`session_api` AS s
WHERE s.session_id='".addslashes($_COOKIE['session_api_session'])."' AND f.sid=s.sid
GROUP BY f.sid"));
echo $user_flags;
?>
Помимо модуля flag нужно ставить еще и модуль session API, не забудьте увеличить expire time (это в админке), а то он сессии создает минут на 10 по моему.
Ах да чуть не забыл в файле /sites/all/modules/flag/flag.inc в 710 строке замените INSERT INTO на REPLACE.
а что нужно добавить в запрос что бы для конкретного типа материла для конкретного флага общее число считалось?
т.е. для новостей флаг_1 у юзера Васи выводиться цифра 9 рядом с виджетом флага, у юзера Пети - 0, у типа материалы отчеты флаг_1 у Васи - 12 , а у Пети 0...
ID флага это FID в базе, а вот Тип контента к сожалению это либо node, либо user я так понимаю так что можно погнуть условие только для конкретного флага но для разных типов нод не знаю .. возможно ли.
ну выборку же по типу можно сделать... типа этава INNER JOIN {node} nd WHERE fc.content_type = '%s
Может и можно но не в таблице самого модуля flag, так как "Тип контента к сожалению это либо node, либо user" то есть INNER JOIN {node} либо INNER JOIN {user} потому как для модуля flag "node" - это общее понятие, технически можно сделать еще один запрос в базу к $node и оттуда уже вытащит конкретные типы нод (story, page) и т.д.