2016-05-20 6 views
1

Ich versuche, einige dynamische Filter mit Sonata zu implementieren. Und ich ziehe meine Haare.Wie implementiere ich dynamische Filter (verknüpfte Auswahlbox) mit Sonata?

Tatsächlich habe ich drei Objekte (Motor> Motor> Sensor).

class Engine { 
    /** 
    * @ORM\OneToMany(targetEntity=Motor, mappedBy=engine) 
    */ 
    private $motors; 
} 

class Motor { 
    /** 
    * @ORM\OneToMany(targetEntity=Sensor, mappedBy=motor) 
    */ 
    private $sensors; 

    /** 
    * @ORM\ManyToOne(targetEntity=Engine, inversedBy=motors) 
    */ 
    private $engine; 
} 

class Sensor { 
    /** 
    * @ORM\ManyToOne(targetEntity=Motor, inversedBy=sensors) 
    */ 
    private $motor; 
} 

Dieser Code soll nur eine Vorstellung vom Modell haben.

Im Admin-Teil möchte ich Sensor nach Motor und Motor filtern. Wenn ich den Motor auswähle, möchte ich, dass der Filter des Motors automatisch wechselt.

Nach etwas Forschung führt mich meine Forschung zu den Rückrufen. Aber ich habe es nie benutzt und die Dokumentation darüber ist sehr klein. Also wenn mir jemand helfen könnte.

Hier ist mein Code für die Seite Admin:

use Sonata\AdminBundle\Admin\Admin; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 

class SensorAdmin extends Admin { 

    /** 
    * @param DatagridMapper $prmDatagridMapper 
    */ 
    protected function configureDatagridFilters(DatagridMapper $prmDatagridMapper) 
    { 
     $prmDatagridMapper 
      ->add("motor.engine", null, array("label" => "Engine")) 
      ->add('motor', null, array(
       "callback" => array($this, "callbackMotorFilter") 
      )) 
     ; 
    } 

    public function callbackMotorFilter ($queryBuilder, $alias, $field, $value) 
    { 
     if (!$value) { 
      return; 
     } 

     $queryBuilder->leftJoin(sprintf('%s.motor', $alias), 'm'); 
     $queryBuilder->leftJoin("m.engine", "e"); 
     $queryBuilder->andWhere('e.id = :engine_id'); 
     $queryBuilder->setParameter('engine_id', $value['value']); 

     return true; 
    } 
} 

Vielen Dank im Voraus.

Antwort

0

Ich würde besser jede Art von API hier verwenden. Unmengen von Entitäten an das Front-End zu schicken ist keine gute Idee. Wenn Sie aus Tausenden von Elementen auswählen, kann der Browser hängen bleiben.

Zum Beispiel könnten Sie jede Art von jQuery Autocomplete-Eingaben mit einfachen JSON API verwenden.

Ich habe eine vor langer Zeit implementiert.

Formulartyp https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Form/Type/EntityAutocompleteType.php

jQuery-Plugin https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Resources/public/js/jquery.entity_autocomplete.js

Zweig Vorlage https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Resources/views/Form/entity_autocomplete.html.twig

nicht sicher, dass es mit den neuesten 3.0 Forms kompatibel ist, aber Modifikation sollte

+0

so einfach sein, schließlich, Problem wird durch neue Version behoben. Danke vielmals – Mausly

Verwandte Themen