Структура базы модуля flags

Аватар пользователя locker locker 12 апреля 2011 в 19:27

Есть такая задача - необходимо вывести количество материалов (цифра), которые определенный пользователь отметил определенным флагом. По идее запрос не сложный, но чет не могу разобраться со структурой баз - из каких баз берется это значение?

Комментарии

Аватар пользователя Master of Tragedy Master of Tragedy 12 апреля 2011 в 20:15

"locker" wrote:
По идее запрос не сложный

Для тебя сложный, т.к SQL ты не знаешь и под предлогом того, что ты там в чем-то не можешь разобраться, просишь сделать это за тебя. Любой мало мальски знакомый с базами данных посмотрит структуру таблицы и написать запрос не составит труда. А ты даже в терминологии путаешься.

Аватар пользователя locker locker 12 апреля 2011 в 20:39

Если бы я хотел, чтобы за меня сделали, я бы так и написал. 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 (все ноды нужного типа нужного пользователя) как то через задницу.

Аватар пользователя locker locker 13 апреля 2011 в 18:10

Ответа на вопрос даже не ожидал, честно говоря. Тем, кому интересно, количество флагов выводятся сниппетом:

<?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 />';
?>

Входные данные можно вытянуть стандартными функциями, но в качестве примера будет достаточно

Аватар пользователя locker locker 20 июня 2011 в 17:13

Smile Т.е я выложил код, который не решает задачи, которую я же и поставил? Оригинально Smile

Аватар пользователя iNFerNo iNFerNo 20 июня 2011 в 17:16

ну да.

у меня в типе материала песня есть флаг в топ. я покликал на 10 нодах - показывает цифру 10. зашел под другим ником... показывает цифру 10, добавил от этого ника еще флаг + 11, зашел назад под первым ником - 11 показывает. а должно показывать цифру только ту которую нажал конкретный юзер...

собственно как у вас и написано в первом посте.

Аватар пользователя locker locker 20 июня 2011 в 17:23

кусок AND fc.uid = %d выбирает для конкретного пользователя. Если что у вас показывается не так, может не так запрос построен? Лично я перед написанием все тестил под несколькими пользователями.

Аватар пользователя iNFerNo iNFerNo 20 июня 2011 в 17:26

ну не знаю я все добавил весь код и изменил 1 на свой fid и свой тип материала прописал

Аватар пользователя iNFerNo iNFerNo 28 июня 2011 в 10:23

Помажите вывести у флага количество отмеченных материалов конкретного типа. Красиво смотриться на друпалСН.ру

Аватар пользователя demart demart 28 июня 2011 в 16:26

Млин неужели никто не написал еще сниппет на эту тему.

Ладно, мне нужно было отображаться общее количество материалов независимо от типа.
Просто хотел чтоб юзеры рядом с ссылкой закладки видели сколько у них там материалов.

Для пользователя:

<?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.

Аватар пользователя iNFerNo iNFerNo 29 июня 2011 в 9:31

"demart" wrote:
Ладно, мне нужно было отображаться общее количество материалов независимо от типа.
Просто хотел чтоб юзеры рядом с ссылкой закладки видели сколько у них там материалов.

а что нужно добавить в запрос что бы для конкретного типа материла для конкретного флага общее число считалось?

т.е. для новостей флаг_1 у юзера Васи выводиться цифра 9 рядом с виджетом флага, у юзера Пети - 0, у типа материалы отчеты флаг_1 у Васи - 12 , а у Пети 0...

Аватар пользователя demart demart 29 июня 2011 в 15:11

ID флага это FID в базе, а вот Тип контента к сожалению это либо node, либо user я так понимаю так что можно погнуть условие только для конкретного флага но для разных типов нод не знаю .. возможно ли.

Аватар пользователя iNFerNo iNFerNo 29 июня 2011 в 19:31

ну выборку же по типу можно сделать... типа этава INNER JOIN {node} nd WHERE fc.content_type = '%s

Аватар пользователя demart demart 2 июля 2011 в 3:37

Может и можно но не в таблице самого модуля flag, так как "Тип контента к сожалению это либо node, либо user" то есть INNER JOIN {node} либо INNER JOIN {user} потому как для модуля flag "node" - это общее понятие, технически можно сделать еще один запрос в базу к $node и оттуда уже вытащит конкретные типы нод (story, page) и т.д.