Непонятки с фильтрацией нод...

Главные вкладки

Аватар пользователя stasroot stasroot 10 января 2011 в 0:21

Всем привет! Такая возникла ситуация: у меня есть несколько типов материалов, есть несколько ролей, есть несколько связей, и есть куча материалов которые не опубликованы.

Задача: Пользователю определенной роли предоставить вьюшку в которой он сможет:
1. Просмотреть материалы которые только заданного типа - решено
2. Только материалы тех пользователей которые состаят с ним в определенной пользовательской роли (связи) модуль UserRelationship - решено за исключением материалов пользователя UID1!
3. Предоставить фильтр по имени пользователя чтобы отобрать только материалы одного из пользователей удовлетворяющего условиям 1 и 2. - решено.

Внимание вопрос: почему когда пользователь которому все это надо посмотреть и профильтровать не имея подтвержденных связей (UR) все равно видит материалы UID1 которые подходят под критерий номер 1. Т.е. как-то фильтр по пользовательской связи не учитывается для UID1.
Все ничего если бы такой пользователь был один и ему можно просматривать, просто он еще не успел подтвердить связь со мной. Но ведь другие пользователи при регистрации получившие эту самую заветную роль, которой нужен этот вьюс тоже в итоге могут смотреть материалы UID1 а это не хорошо так как я может даже не знаю их или категорически против того, чтобы они смотрели мои записи.

Прикрепил скриншот вьюса.
Вот запрос вьюса:

SELECT node.nid AS nid,
   node.title AS node_title,
   node.language AS node_language,
   node_revisions.body AS node_revisions_body,
   node_revisions.format AS node_revisions_format,
   node.created AS node_created,
   node_data_field_beg_vsego.field_beg_vsego_value AS node_data_field_beg_vsego_field_beg_vsego_value,
   node.type AS node_type,
   node.vid AS node_vid,
   node_data_field_beg_vsego.field_ring_water_km_value AS node_data_field_beg_vsego_field_ring_water_km_value,
   node_data_field_beg_vsego.field_shtanga_vsego_kg_value AS node_data_field_beg_vsego_field_shtanga_vsego_kg_value,
   node_data_field_beg_vsego.field_samochuvstvie_value AS node_data_field_beg_vsego_field_samochuvstvie_value,
   users.uid AS users_uid
 FROM node node
 LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requester_id
 INNER JOIN users users ON node.uid = users.uid
 LEFT JOIN node_revisions node_revisions ON node.vid = node_revisions.vid
 LEFT JOIN content_type_trenirovka node_data_field_beg_vsego ON node.vid = node_data_field_beg_vsego.vid
 WHERE (node.type in ('trenirovka')) AND (node.status = 0) AND (user_relationships.rtid in ('2', '4')) AND (user_relationships.approved = '1') AND (users.uid <> ***CURRENT_USER***)
   ORDER BY node_created DESC

Пожалуйста помогите решить эту проблему. Бьюсь над ней уже какой день подряд....

ВложениеРазмер
Иконка изображения problemnyy_vyus.png82.47 КБ

Комментарии

Аватар пользователя stasroot stasroot 10 января 2011 в 13:55

Может будет правильнее сменить автора всем материалам которые написаны пользователем UID1 и не использовать UID1 для написания контента? Только тогда как это сделать массово? Для нескольких сотен материалов одним махом?

Аватар пользователя stasroot stasroot 11 января 2011 в 1:16

Я так понимаю, что за хранение нод отвечает две таблицы в БД:
`node` (   `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,   `vid` int(10) unsigned NOT NULL DEFAULT '0',   `type` varchar(32) NOT NULL DEFAULT '',   `language` varchar(12) NOT NULL DEFAULT '',   `title` varchar(255) NOT NULL DEFAULT '',   `uid` int(11) NOT NULL DEFAULT '0',   `status` int(11) NOT NULL DEFAULT '1',   `created` int(11) NOT NULL DEFAULT '0',   `changed` int(11) NOT NULL DEFAULT '0',   `comment` int(11) NOT NULL DEFAULT '0',   `promote` int(11) NOT NULL DEFAULT '0',   `moderate` int(11) NOT NULL DEFAULT '0',   `sticky` int(11) NOT NULL DEFAULT '0',   `tnid` int(10) unsigned NOT NULL DEFAULT '0',   `translate` int(11) NOT NULL DEFAULT '0',   PRIMARY KEY (`nid`),   UNIQUE KEY `vid` (`vid`),   KEY `node_changed` (`changed`),   KEY `node_created` (`created`),   KEY `node_moderate` (`moderate`),   KEY `node_promote_status` (`promote`,`status`),   KEY `node_status_type` (`status`,`type`,`nid`),   KEY `node_title_type` (`title`,`type`(4)),   KEY `node_type` (`type`(4)),   KEY `uid` (`uid`),   KEY `tnid` (`tnid`),   KEY `translate` (`translate`) ) ENGINE=MyISAM AUTO_INCREMENT=258 DEFAULT CHARSET=utf8 AUTO_INCREMENT=258;

И таблица:

`node_revisions` (   `nid` int(10) unsigned NOT NULL DEFAULT '0',   `vid` int(10) unsigned NOT NULL AUTO_INCREMENT,   `uid` int(11) NOT NULL DEFAULT '0',   `title` varchar(255) NOT NULL DEFAULT '',   `body` longtext NOT NULL,   `teaser` longtext NOT NULL,   `log` longtext NOT NULL,   `timestamp` int(11) NOT NULL DEFAULT '0',   `format` int(11) NOT NULL DEFAULT '0',   PRIMARY KEY (`vid`),   KEY `nid` (`nid`),   KEY `uid` (`uid`) ) ENGINE=MyISAM AUTO_INCREMENT=258 DEFAULT CHARSET=utf8 AUTO_INCREMENT=258;

Насколько я понимаю мне будет достаточно сменить в первой и во второй таблице номера пользователей с 1 на скажем 3. Как это правильно сделать? в SQL не силен совсем.

Аватар пользователя stasroot stasroot 11 января 2011 в 1:26

Нашел в теме не далеко тут примерно такой код запроса к MySQL:

UPDATE
  node_revisions
SET
  body = REPLACE(body, '/xxx/.img/', '/yyy/img/'),
  teaser = REPLACE(teaser, '/xxx/.img/', '/yyy/img/')

Может мне можно сделать по аналогии:

UPDATE
  node_revisions
SET
  uid = REPLACE(uid, '1', '3')
 

И еще тут:

UPDATE
  node
SET
  uid = REPLACE(uid, '1', '3')

Думаю запросы эти сделать через phpMyAdmin у хостера. Подскажите насколько правильно я мыслю, можно ли выполнить эти запросы к БД и обойдется ли без последствий? Ясное дело, что перед этим сделаю полный бэкап, но все же...

Аватар пользователя stasroot stasroot 14 января 2011 в 3:12

Вопрос в силе. Насколько безопасны с точки зрения сохранения данных и их доступности в дальнейшем если обновить записи в указанных двух таблицах?