Есть тип материала "контрольная". Когда пользователь решил контрольную в базе данных в собственноручно созданной таблице значение поля flag меняется с 0 на 1. Мне нужно вьюхой вывести только те контрольные, которые пользователь уже решил, т.е. значение флага равно 1. Как дать понять вьюхе, что нужно учитывать значение из БД?
Комментарии
А зачем оно так делается-то? Может проще сразу переделать по-человечески и навсегда забыть о вечном геморрое, связанном с "собственноручно созданной таблицей"?
"По-человечески" - это как?
Средствами Drupal, естественно. Либо в материал "Контрольная" добавить поле со списком пользователей, решивших ее, либо наоборот, либо сделать отдельный тип материала "Решённые контрольные", ссылающийся на пользователя и контрольную. В любом случае вьюшки тогда будет строить легко и приятно.
Была мысль сделать дополнительное поле в типе материала "контрольная" и заносить флаг туда. Тогда вьюха увидит это значение. Но мне кажется должно быть более изящное решение. У меня и так уже куча полей в этом типе материала. Кроме того, удобнее создавать одну таблицу и заносить туда всю информацию, нежели искать ее по полям из разных таблиц БД.
hook_views_data
Это интересная мысль. Я только не совсем понимаю, как туда занести информацию о нескольких пользователях? Я понимаю, как в ячейку занести число, ну например одного пользователя с uid 17, а если их много, то нужно массив что ли заносить?
Drupal поддерживает поля с несколькими значениями. Просто внимательно посмотрите на все опции при добавлении поля. И забудьте про "ячейки" и "массивы" - пусть у друпала голова болит о том, как все это хранить.
Всем отозвавшимся спасибо, оба варианта интересные, но вариант с хуком hook_views_data мне показался более гибким. Все работает.
Нет, что-то я рано возрадовался. Вроде почти получилось, но на какой-то ерунде сижу весь день. В общем вот моя таблица, которую надо подключить к вьюхе:
Здесь нас интересуют три столбца: uid - айдишник пользователя, nid_kontrolnoy - айдишник контрольной, которую надо вывести и флаг - решил контрольную или нет.
Вот хук вьюхи:
<?php
$data['otvetbl_v_kontrolnoy']['table']['join'] = array(
function my_modul_views_data() { $data['otvetbl_v_kontrolnoy']['table']['group'] = t('otvetbl_v_kontrolnoy');
'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 текущего пользователя. В превью все работает.НО! Когда я пытаюсь сделать ссылку в меню (с помощью хук меню) вьюха мне НЕ ДАЕТ этого сделать. Если отключить вьюху, то ссылка появляется. Как сделать ссылку в меню?
Вероятно, речь идёт о текущем юзере.
Можно поставить https://www.drupal.org/project/me, например.
А чем это отличается от токена [user: uid]? При попытке создать ссылку не работает ни токен, ни me.
Как минимум, тем, что из коробки в меню токенов нет.
Вы в очередной раз пытаетесь обмануть систему?
Так модуль me нельзя установить без модуля token.
Нет, обманывать не пытаюсь, просто ни пса не выходит, уже голову сломал.