Искать  
 
   
 
Вывод записей для конкретных групп пользователей по значению поля
Отправлено: 19 Июнь 2012 10:24 P.M.   [ Игнорировать ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Привет, други!

Давненько не писал в форуме, но столкнулся с задачей, буквально взорвавшей мозг... Нужна помощь вот в чём:

Имеется стандартный exp:weblog:entries-тег, который выводит все записи раздела. Имеется опредеённое list-поле c заданным набором значений. Есть несколько групп пользователей...

Задача: не прибегая к SQL-запросам, выводить для пользователя из группы X только записи со значением list-поля Y; для пользователя из группы Z - только записи, в которых значение этого самого поля соответствует Q и т.п. Более того, поле-признак в данном случае является Matrix-полем.

Надеюсь на вашу подмогу!

P.S. Теоретически, могу и SQL-запрос написать, но поскольку выводить требуется множество значений полей, а также - связанные записи, запрос получается крайне громоздким.

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 12:32 A.M.   [ Игнорировать ]   [ # 1 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  644
Зарегистрирован  2009-04-11

Тут кажется тока php поможет.. проверять {group_id} и значения в листе.

 Подпись 

Няшка, программист, фотограф, подкастер, блоггер и CEO студии FDCore Studio

Профиль
 
 
Отправлено: 20 Июнь 2012 02:42 P.M.   [ Игнорировать ]   [ # 2 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Совсем уйти от SQL не удаётся пока...

Решил попытаться реализовать ограничение вывода записей через “entry_id=” примерно так:

{exp:weblog:entries weblog="orders"
                     
entry_id="{exp:query sql="SELECT entry_id
                                                              FROM exp_weblog_data 
                                                              WHERE FIND_IN_SET 
('<?php global $SESS;
                                                                                                   echo $SESS->userdata['
group_title'];?>'
                                                                                              
field_id_8)"}
                                      {entry_id}|{/exp:query}"
status="open|closed" disable="trackbacks" limit="100"

Но, FIND_IN_SET выводит записи только в том случае, если значение ячейки таблицы точно соответствует критерию, а поскольку у меня field_id_8 - matrix-поле, в нём много всякого “хлама”...

Вот, например, содержимое ячейки столбца field_id_8 таблицы exp_weblog_data по вхождению в которое подстроки со значением “АМ-К” производится проверка (для группы пользователей с имененм “АМ-К”)

a:1:{i:0;a:8:{i:3;s:96:"http://../images/uploads/3/Заявка № 15-АМК к Заказу № 4-АМК.pdf";i:1;s:8:"4-АМК";
i:9;s:10:"1337025600";i:2;s:0:"";i:5;s:7:"АМ-К";i:4;s:2:"21";i:6;s:8:"НОВО";i:7;s:319:"разный текст.";}} 

Всвязи с этим, возникла пара вопросов:
1. Какой оператор использовать вместо FIND_IN_SET?
2. С точки зрения разбора парсера будет ли данный код исполняться (т.е. что обрабатывается раньше: {exp:query} или {exp:weblog:entries})?
3. Какие, на ваш взгляд, могут быть подводные камини у такого метода при условии большого количества записей?

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 03:11 P.M.   [ Игнорировать ]   [ # 3 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Вот такой запрос получился для группы пользователей с именем “АМ-К”:

{exp:query sql="SELECT entry_id FROM exp_weblog_data WHERE field_id_8 LIKE '%АМ-К%'"}{entry_id}|{/exp:query} 

Осталось теперь динамически назначать имя группы пользователей для оператора LIKE и результат запроса выводить в entry_id… Есть соображения?

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 06:46 P.M.   [ Игнорировать ]   [ # 4 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  644
Зарегистрирован  2009-04-11

Я так понял группы пользователей хрянятся в matrix? Я бы сделал всё намного легче но с нагрузкой на сервер, перебирая все записи и проверяя данные в матрикс переменной.

 Подпись 

Няшка, программист, фотограф, подкастер, блоггер и CEO студии FDCore Studio

Профиль
 
 
Отправлено: 20 Июнь 2012 07:04 P.M.   [ Игнорировать ]   [ # 5 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Не, не совсем так.
Просто в матрикс имеется list-поле, возможные значения которого эквивалентны именам групп пользователей... Вот я и пытаюсь сперва выцепить имя группы текущего авторизованного пользователя, а затем запросом выдернуть id записей, в которых в matrix-поле встречается подстрока равная имени группы.

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 07:08 P.M.   [ Игнорировать ]   [ # 6 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  644
Зарегистрирован  2009-04-11

мб так?

{exp:query sql="SELECT entry_id FROM exp_weblog_data WHERE field_id_8 LIKE '%{group_title}%'"}{entry_id}|{/exp:query} 
 Подпись 

Няшка, программист, фотограф, подкастер, блоггер и CEO студии FDCore Studio

Профиль
 
 
Отправлено: 20 Июнь 2012 07:09 P.M.   [ Игнорировать ]   [ # 7 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Основная трудность сейчас - “запихнуть” результат представленного выше запроса внутрь {exp:weblog:entries entry_id=”“}. Порядок парсинга не позволяет просто воткнуть код запроса в entry_id=”“... Через Динамически назначаемые глобальные переменные не прокатило. Через вложенные шаблоны - тоже. Через reposition не получилось. Вот теперь думаю как быть с php…

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 07:12 P.M.   [ Игнорировать ]   [ # 8 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02
NetSoul - 20 Июнь 2012 07:08 P.M.

мб так?

{exp:query sql="SELECT entry_id FROM exp_weblog_data WHERE field_id_8 LIKE '%{group_title}%'"}{entry_id}|{/exp:query} 

Да, именно так я получаю id нужных записей, но вот как эти id поместить значением параметра entry_id в weblog:enries - не придумал.

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 07:14 P.M.   [ Игнорировать ]   [ # 9 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  644
Зарегистрирован  2009-04-11
{exp:query sql="SELECT entry_id as entry8 FROM exp_weblog_data WHERE field_id_8 LIKE '%{group_title}%'"}
     {exp
:weblog:entries weblog="orders" entry_id="{entry8}" dynamic="off"}
          {title}
     {
/exp:weblog:entries}
{
/exp:query} 
 Подпись 

Няшка, программист, фотограф, подкастер, блоггер и CEO студии FDCore Studio

Профиль
 
 
Отправлено: 20 Июнь 2012 07:45 P.M.   [ Игнорировать ]   [ # 10 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

{group_title} внутри{exp:query} не обрабатывается - вот в чём беда. Если это “обойти” - код будет рабочим. Я имя группы задавал жёстко до этого.

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 07:47 P.M.   [ Игнорировать ]   [ # 11 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  644
Зарегистрирован  2009-04-11

Мб заюзать embed, и ему передать группу, типо

{embed:group_title} 
{embed="embed/orders" group_title="{group_title}"
 Подпись 

Няшка, программист, фотограф, подкастер, блоггер и CEO студии FDCore Studio

Профиль
 
 
Отправлено: 20 Июнь 2012 07:52 P.M.   [ Игнорировать ]   [ # 12 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Пробую через php… Сам по себе php код срабатывает корректно, а вот внутри запроса - нет.

{exp:query sql="SELECT entry_id as entry8 FROM exp_weblog_data WHERE field_id_8 LIKE '<?php global $SESS; echo $SESS->userdata['group_title'];?>'" backspace="1"}{entry8}|{/exp:query} 

Парсер php установлен на “Ввод”.

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль
 
 
Отправлено: 20 Июнь 2012 08:01 P.M.   [ Игнорировать ]   [ # 13 ]
Студент
Avatar
RankRank
Всего сообщений:  150
Зарегистрирован  2008-02-02

Тьфу, ёлы-палы... Ошибся в синтаксисе. Вот абсолютно рабочий код:

{exp:query sql="SELECT entry_id as entry8 FROM exp_weblog_data WHERE field_id_8 LIKE '%<?php global $SESS; echo $SESS->userdata['group_title'];?>%'"}
     {exp
:weblog:entries weblog="orders" entry_id="{entry8}" dynamic="off"}
          {title}
     {
/exp:weblog:entries}
{
/exp:query} 

NetSoul - огромное спасибо! Очень помог!

 Подпись 

Запустил WEB-BRICKS - ресурс для web-мастеров. Прошу любить и жаловать!

Профиль