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

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

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 8:41

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

Комментарии

Аватар пользователя marassa marassa 24 июля 2018 в 8:59

Антоха82 wrote:

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

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

Аватар пользователя marassa marassa 24 июля 2018 в 9:11
1

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

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 9:07

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

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 9:23

marassa wrote:

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


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

Аватар пользователя marassa marassa 24 июля 2018 в 9:29

Антоха82 wrote:

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

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

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 12:22

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

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 18:48

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

Здесь нас интересуют три столбца: 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 текущего пользователя. В превью все работает.НО! Когда я пытаюсь сделать ссылку в меню (с помощью хук меню) вьюха мне НЕ ДАЕТ этого сделать. Если отключить вьюху, то ссылка появляется. Как сделать ссылку в меню?

Аватар пользователя Антоха82 Антоха82 24 июля 2018 в 19:22

Semantics wrote:

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

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


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