Как фильтровать вывод по Фешую?

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

Аватар пользователя kompospec kompospec 14 июля 2023 в 16:08

Множество задач по Друпалу сводились к тому, что нужно вытянуть с различных Нод некоторые поля и собрать их в таблицу применив некоторые изменяемые фильтры.
Я просто писал всё в свой Модуль. Закидывал запросы Гетом и таким образом, получал полный доступ ко всему. А как это делать по Феншую?

Комментарии

Аватар пользователя kompospec kompospec 14 июля 2023 в 18:22

А при чём тут Вьюха? Вьюха - это запросы к БД.
Вот например последнее задание:
Самописный, чужой модуль отдаёт мне данные. На основании этих данных я строю таблицу. Но мне нужно к этим данным применить свои фильтры в виде выпадающих списков

Аватар пользователя VasyOK VasyOK 14 июля 2023 в 18:53

Тут вопрос что считает "по феншую" тот, кто это задание давал. Думаю он должен объяснить свои требования.

Аватар пользователя kompospec kompospec 14 июля 2023 в 19:09

А это то тут причём? Задание давно сделано, но я думаю что сделано оно не по канонам Друпала.
И спрашиваю именно про это.

Аватар пользователя Andruxa Andruxa 15 июля 2023 в 11:50

По феншую - реализовать в своем модуле hook_views_data, в котором описать на понятном вьюсам языке свою таблицу и все поля, находящиеся в ней - тип данных, может быть отсортировано, может быть отфильтровано.
Возможно - свой плагин views для кастомного типа данных: если в поле хранится json и из него нужно что-то извлечь, или отсортировать-отфильтровать по нему.
Если в таблице хранятся id друпальных сущностей или значения их полей - указать данные для join и подтянуть в представление сущности (ноды, таксономию, юзеров и т.д).

Фильтры - из коробки, сортировка - из коробки, пагинация - из коробки, кеширование - из коробки.

Аватар пользователя kompospec kompospec 15 июля 2023 в 11:54

Давайте возьмём совершенно чёткую задачу и посмотрим различные варианты решения. Я сейчас всё подготовлю

Аватар пользователя kompospec kompospec 15 июля 2023 в 12:56

<?php

namespace Drupal\test\Controller;

class 

test {

  public function 

cont() {

  

ob_start();

 if(isset (

$_GET['tip'])) $gtip preg_replace('/[&<>\'";]/'  ' '$_GET['tip']);
  else 
$gtip 'металл';

  

$vhod = [
    [
'медь''металл'5001000],
    [
'вода','жидкость'100500],
    [
'железо','металл'8001400],
    [
'кислород','газ'400900],
    [
'литий','металл'300500]
  ];

 

$t = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree('test');
  
//print $t[0]->name;
  

  

print   '<form>
    <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>';

  

$mytab ob_get_contents();
  
ob_end_clean();

  return [

'#markup' => \Drupal\Core\Render\Markup::create($mytab)];

}
}

?>
Аватар пользователя kompospec kompospec 16 июля 2023 в 14:04

Но нужно ведь чтоб форма была отдельно от таблицы.
Зачем таблицу засовывать в форму.
Выводить то и то отдельными блоками?