views добавление своей таблицы.

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

Аватар пользователя ХулиGUN ХулиGUN 26 сентября 2012 в 19:23

Уже раньше писал, но есть задача сделать заказ столиков в ресторане без оплаты заказа. В ресторане есть несколько этажей... и по задумке клиента этот заказ должен выглядеть примерно следующим образом: Юзер выбирает этаж и день на который нужен столик и ему должен выводится список всех столиков этажа и в зависимости заказан столик или нет должен быть соответствующий маркер(но столики должны вводится все и занятые и свободные)
Решил сделать это посредством views+webform.

1. Создал тип материала "Столы" и привязал к нему webform, так же создал словарь "Этаж"... добавил необходимые поля
2. Создал столы и определил поля для webform
Идея в следующем: Сделать вьюху которая выводила бы все столы этажа (аргумент = термин словаря "Этаж") на данное число (второй аргумент = Дата). И если столик свободен по клику на нём выводить в pop-up вебформу для заказа (в веб форме одно поле должно быть скрытым, там будет дата, которая должна подставлять токен из аргумента "Дата" вьюхи). Соответственно, если столик заказан, то вебформа не должна быть доступна.
Логика: Выводим поля № стола(заголовок), вебформ боди, колорбокс (опционально для вывода формы в модальном окне, ещё не решил как это будет), поле с результатами вебформы данной ноды и пхп поле, где будет сравниваться аргумент даты из урл с результатами вебформы и выводить заказан столик или нет.
Поля результата вебформы нет в списке доступных полей, поэтому решил сделать его самостоятельно. Данные результатов вебформ хранит в таблице webform_submitted_data. Делаю модуль, где указываю api вьюхе и реализовываю:
<?php bla-bla-bla_views_data(){
$data['webform_submitted_data']['table']['join']['node']=> array(
'left_field' => 'nid', // ключевое поле из базовой таблицы, т.е из {node}
'field' => 'nid', // ключевое поле из подключаемой таблицы, т.е из {webform_submitted_data}
);
$data['webform_submitted_data']['data'] = array(

'title' => 'Результаты форм',
'help' => 'Бла-бла-бла',
'field' => array('handler' => 'views_handler_field');
return $data;
}
?>
Структура webform_submitted_data:
nid(ид ноды)
sid(ид сабмишена вебформы)
cid(ид поля вебформы)
no (множественное значение поля)
data(Собственно, то что вводит юзер)

После чего у меня возникли дубликаты(((
Хотелось получить:
field: title
field: Моё поле: значение 1, значение 2, значение 3

А получаю
field: title
field: Моё поле: значение 1
field: title
field: Моё поле: значение 2
field: title
field: Моё поле: значение 3

Как избавиться от этих дубликатов?

Комментарии

Аватар пользователя sg85 sg85 28 сентября 2012 в 1:54

Я так понимаю у вас данные хранятся - ваше поле, цепляется к ноде, при этом в таблице может быть множество полей на одну ноду?
В этом случае от INNER JOIN толку будет мало, оно просто отсеит пустые результаты(LEFT в этом случае выплюнет NULL)

Для того, что бы согнать все в нужный вид вижу 2 варианта(от балды):

1 Сложный запрос, что честно говоря, не делал во вьювс(да и вообще как-то не приходилось использовать, пока), в добавок он довольно медленный(должен быть), не уверен что именно так можно делать(тупо от балды), но сама идея:
select n.title, concat(m.field,' ') from {node} as n inner join {my_table} as m on n.nid = m.nid group by n.nid

2 Сгруппировать поля в настройках отображения вьюхи и темизировать, в этом варианте возникнут сложности с пейджером, притом большие

Аватар пользователя divined divined 28 сентября 2012 в 14:43

Через 2 вьюхи, да коряво )))

Данная задача не является тривиально и решение ее через views будут абсурдным.

Мое решение было бы следующим:

Создаем модуль

- меню на страницу
- страница - запрос к базе (в 7-ке офигенно с этим)
- результат запроса - мини-формы, где стол элемент формы с ajax, нажатие - сабмит
- сабмит - изменение формы - вставка в форму данных для заказа и отображение в оверлее.

Результат будет отрабатываться намного быстрее чем двойная вьюха, ajax составляющяя будет идти через друпал, а не в стороннем яваскрипт файле.

В общем плюсов много )

Аватар пользователя divined divined 28 сентября 2012 в 15:39

Я для каждого проекта пишу свой модуль.
Универсальное - действительно очень трудоемко.

Единственное - я делаю список реализованных функций, и потом, если проекты пересекаются, копирую эти функции между проектами.