Множество задач по Друпалу сводились к тому, что нужно вытянуть с различных Нод некоторые поля и собрать их в таблицу применив некоторые изменяемые фильтры.
Я просто писал всё в свой Модуль. Закидывал запросы Гетом и таким образом, получал полный доступ ко всему. А как это делать по Феншую?
Комментарии
Нравится - делайте.
Но вообще открытые фильтры в views есть и search_api + facets тоже работает.
надо поглубже изучить views а потом написать свой модуль.
А при чём тут Вьюха? Вьюха - это запросы к БД.
Вот например последнее задание:
Самописный, чужой модуль отдаёт мне данные. На основании этих данных я строю таблицу. Но мне нужно к этим данным применить свои фильтры в виде выпадающих списков
Тут вопрос что считает "по феншую" тот, кто это задание давал. Думаю он должен объяснить свои требования.
А это то тут причём? Задание давно сделано, но я думаю что сделано оно не по канонам Друпала.
И спрашиваю именно про это.
По феншую - реализовать в своем модуле hook_views_data, в котором описать на понятном вьюсам языке свою таблицу и все поля, находящиеся в ней - тип данных, может быть отсортировано, может быть отфильтровано.
Возможно - свой плагин views для кастомного типа данных: если в поле хранится json и из него нужно что-то извлечь, или отсортировать-отфильтровать по нему.
Если в таблице хранятся id друпальных сущностей или значения их полей - указать данные для join и подтянуть в представление сущности (ноды, таксономию, юзеров и т.д).
Фильтры - из коробки, сортировка - из коробки, пагинация - из коробки, кеширование - из коробки.
Давайте возьмём совершенно чёткую задачу и посмотрим различные варианты решения. Я сейчас всё подготовлю
<?php
namespace Drupal\test\Controller;class
test {public function
cont() {if(isset (
$_GET['tip'])) $gtip = preg_replace('/[&<>\'";]/' , ' ', $_GET['tip']);else $gtip = 'металл';
['медь', 'металл', 500, 1000],
['вода','жидкость', 100, 500],
['железо','металл', 800, 1400],
['кислород','газ', 400, 900],
['литий','металл', 300, 500]
];
//print $t[0]->name;
<div class="leftform">
<div>
'.t('Type of substance').':<br>
<select name="tip" onchange="this.form.submit()">
';
foreach($t as $k=>$v){ // Это выбор типа вещества
print " <option";
if($gtip==$v->name) print ' selected';
print ">".$v->name."</option>\n";
}
print ' </select>
</div>
'
;print
'<table>
<tr>
<th>Название
<th>Тип вещества
<th>Свойство1
<th>Свойство2
';
foreach (
$vhod as $k=>$v){ // Это вывод строкиif(isset($gtip)) if($gtip!=$v[1]) continue;
print "<tr>
<td>$v[0]
<td>$v[1]
<td>$v[2]
<td>$v[3]
";
}
print
'</table>';ob_end_clean();
return [
'#markup' => \Drupal\Core\Render\Markup::create($mytab)];}
?>}
http://xml.russkiyslovar.ru/test
То есть - задача полностью решена. Но явно не по Феншую
По фэншую надо начать с того, чтобы использовать form API для создания формы.
Но нужно ведь чтоб форма была отдельно от таблицы.
Зачем таблицу засовывать в форму.
Выводить то и то отдельными блоками?
Дополнительно сделать контроллер, который будет выводить форму и таблицу.