2015-07-27 9 views
5

Sono nuovo nel framework Symfony. Mi piacerebbe creare un elenco di record che sarebbe simile a questa:Come creare liste in Symfony?

enter image description here

Ho bisogno di alcuni filtri in cima, elenco di elementi al centro e impaginazione in fondo. L'elenco dovrebbe supportare sia la modalità modificabile che quella di sola lettura. In modalità di sola lettura, l'utente poteva semplicemente sfogliare i dati mentre in modalità di modifica sarebbe in grado di aggiornare i valori in più campi e colonne.

Poiché creerò molte di queste liste, mi piacerebbe utilizzare l'interfaccia come Moduli in Symfony2 piuttosto che modificare i modelli di ramoscello tutto il tempo.

Mi mancano alcune funzionalità di Symfony Form che potrebbero creare elenchi come questo? C'è qualche altro modo comune per implementare questo? Puoi darmi dei suggerimenti su quali classi relazionarsi alle form per estendere per creare supporto per le liste?

+3

Cosa stai cercando di fare qui, per me almeno, sembra meglio affrontare con Twitter bootstrap (per il bit CSS), e [il Paginator KNP] (http: //knplabs.com/en/blog/knp-paginator-reborn), che è un pacchetto di paginatori più che capace per SF2. Detto questo, ritengo che questa domanda sia leggermente fuori tema, dato che non sembra che si tratti di un problema specifico legato al codice, è più di un tipo di domanda "Come iniziare" di tipo _ (se hai bisogno di un corso intensivo su SF2, controlla il ricettario Symfony sul loro sito, è abbastanza buono, davvero) –

+0

Ho già controllato il libro di cucina ma non descrive come creare liste. Vedo che posso crearli in twig, ma mi piace l'interfaccia di costruzione di moduli. Poiché ho bisogno di elenchi modificabili che possono avere campi come i moduli, ho provato a eseguire il debug dei moduli per capire dove posso collegarmi. Vedo che dovrei sostituire PropertyPathMapper per gestire le righe di dati, ma questo è solo un inizio. Quindi speravo che ci fosse una soluzione più semplice per modificare i moduli affinché funzionassero come liste. – pbosko

+0

Utilizzare i moduli come elenchi non è così difficile, e sicuramente non richiede di scavare più in profondità come il "ProperyPathMapper", un semplice modello di ramoscello e un tipo di modulo personalizzato nidificato dovrebbero fare, entrambi sono coperti dal libro di ricette di symfony e spiegato in dettaglio nei documenti di symfony2 –

risposta

2

Per trasformare i moduli Symfony in liste ho creato un nuovo tipo di modulo ListType che accetta il tipo di raccolta annidata arbitraria. In questo modo posso creare liste con varie colonne. Assomiglierà a:

class ListType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     if (empty($options['collection_type']) || !$options['collection_type'] instanceof AbstractType) { 
      throw new \InvalidArgumentException(); 
     } 
     $builder->add('rows', 'collection', array('type' => $options['collection_type'])); 
     $builder->add('save', 'submit', array('label' => 'Save')); 
    } 
    ... 
} 

Userò la matrice $ options per fornire o attivare o disattivare altre funzioni come il filtro di ricerca e l'impaginazione.

Al fine di avere una semplice interfaccia per la visualizzazione di liste come:

{{ list(list) }} 

ho creato Twig estensione:

class ListExtension extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('list', array($this, 'listFunction'), array('is_safe' => array('html'), 'needs_environment' => true)) 
     ); 
    } 

    public function listFunction(\Twig_Environment $env, FormView $form) 
    { 
     return $env->resolveTemplate($this->defaultTemplate)->renderBlock('list', array('form' => $form)); 
    } 
    ... 
} 

Rende "lista" di blocco Twig. Aggiungerò anche altri sotto blocchi allo stesso modo. Questa estensione fornisce una maggior quantità di feed rispetto ai blocchi "form".

ho registrato lista delle estensioni come servizio:

# app/config/services.yml 
services: 
    my.twig.list.extension: 
     class: MyBundle\Twig\Extension\ListExtension 
     arguments: ["::my_theme.html.twig"] 
     public: false 
     tags: 
      - { name: twig.extension } 

Ora devo solo a creare una forma di mia ListType e passarlo una serie di entità fila.

Grazie a Elias Van Ootegem per avermi indicato nella giusta direzione.