Как связать views и БД?

24 июля 2018 в 8:41

Есть тип материала "контрольная". Когда пользователь решил контрольную в базе данных в собственноручно созданной таблице значение поля flag меняется с 0 на 1. Мне нужно вьюхой вывести только те контрольные, которые пользователь уже решил, т.е. значение флага равно 1. Как дать понять вьюхе, что нужно учитывать значение из БД?

Комментарии

Антоха82 wrote:

в базе данных в собственноручно созданной таблице значение поля flag меняется с 0 на 1.

А зачем оно так делается-то? Может проще сразу переделать по-человечески и навсегда забыть о вечном геморрое, связанном с "собственноручно созданной таблицей"?

24 июля 2018 в 8:59

Средствами Drupal, естественно. Либо в материал "Контрольная" добавить поле со списком пользователей, решивших ее, либо наоборот, либо сделать отдельный тип материала "Решённые контрольные", ссылающийся на пользователя и контрольную. В любом случае вьюшки тогда будет строить легко и приятно.

24 июля 2018 в 9:11

Была мысль сделать дополнительное поле в типе материала "контрольная" и заносить флаг туда. Тогда вьюха увидит это значение. Но мне кажется должно быть более изящное решение. У меня и так уже куча полей в этом типе материала. Кроме того, удобнее создавать одну таблицу и заносить туда всю информацию, нежели искать ее по полям из разных таблиц БД.

24 июля 2018 в 9:07

marassa wrote:

в материал "Контрольная" добавить поле со списком пользователей, решивших ее


Это интересная мысль. Я только не совсем понимаю, как туда занести информацию о нескольких пользователях? Я понимаю, как в ячейку занести число, ну например одного пользователя с uid 17, а если их много, то нужно массив что ли заносить?

24 июля 2018 в 9:23

Антоха82 wrote:

Я только не совсем понимаю, как туда занести информацию о нескольких пользователях?

Drupal поддерживает поля с несколькими значениями. Просто внимательно посмотрите на все опции при добавлении поля. И забудьте про "ячейки" и "массивы" - пусть у друпала голова болит о том, как все это хранить.

24 июля 2018 в 9:29

Всем отозвавшимся спасибо, оба варианта интересные, но вариант с хуком hook_views_data мне показался более гибким. Все работает.

24 июля 2018 в 12:22

Нет, что-то я рано возрадовался. Вроде почти получилось, но на какой-то ерунде сижу весь день. В общем вот моя таблица, которую надо подключить к вьюхе:

Здесь нас интересуют три столбца: uid - айдишник пользователя, nid_kontrolnoy - айдишник контрольной, которую надо вывести и флаг - решил контрольную или нет.

Вот хук вьюхи:

<?php
function my_modul_views_data() {

$data['otvetbl_v_kontrolnoy']['table']['group'] = t('otvetbl_v_kontrolnoy');

 

$data['otvetbl_v_kontrolnoy']['table']['join'] = array(
        
'node' => array(
       
'left_field' => 'nid',
       
'field' => 'nid_kontrolnoy',
     ),
   );
 
 
$data['otvetbl_v_kontrolnoy']['uid'] = array(
 
'title' => t('UID'),
 
'help' => t('Идентификатор пользователя'),
'argument' => array(
  
'handler' => 'views_handler_argument_string',
),
);
 

$data['otvetbl_v_kontrolnoy']['flag'] = array(
 
'title' => 'Контольная написана',
 
'help' => t('Написана ли контрольная'),
 
'filter' => array(
   
'handler' => 'views_handler_filter_boolean_operator',
   
'label' => 'Контольная написана?',
   
'type' => 'yes-no',
 ),
);
 
 
   return 
$data;

?>

Обычный фильтр отбирает по флагу. Вся загвоздка с айдишником пользователя. С обычным фильтром у меня не получилось никак, поэтому я решил использовать контекстный фильтр. В адресной строке ввожу аргумент, который определяет uid текущего пользователя. В превью все работает.НО! Когда я пытаюсь сделать ссылку в меню (с помощью хук меню) вьюха мне НЕ ДАЕТ этого сделать. Если отключить вьюху, то ссылка появляется. Как сделать ссылку в меню?

24 июля 2018 в 18:48

Semantics wrote:

Вероятно, речь идёт о текущем юзере.

Можно поставить https://www.drupal.org/project/me, например.


А чем это отличается от токена [user: uid]? При попытке создать ссылку не работает ни токен, ни me.

24 июля 2018 в 19:22

Так модуль me нельзя установить без модуля token.
Нет, обманывать не пытаюсь, просто ни пса не выходит, уже голову сломал.

24 июля 2018 в 22:34