2012-01-12 11 views
7

Ho una classe di amministrazione del prodotto. L'entità prodotto ha una relazione molti-a-uno con un'entità di categoria, ad esempio un prodotto è associato a una categoria.Amministratore sonata - Campo "ordina per" nella tabella correlata

Nella pagina "elenco" di amministratori per i prodotti, ho bisogno di ordinare in base al nome della categoria (alfabeticamente) a cui ogni prodotto è associato.

L'impostazione del campo predefinito da ordinare è semplice se il campo si trova sull'entità stessa (vedere Sonata admin bundle order per come procedere). Ma non riesco a capire come ordinare da un campo in una tabella correlata.

Qualsiasi aiuto è apprezzato.

risposta

6

Sembra una soluzione alternativa, ma funziona. È necessario aggiungere un metodo join sovrascrivendo createQuery(), di assegnare un valore predefinito sortby sovrascrivendo $ datagridValues:

<?php 
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; 

class ExpenseAdmin extends Admin 
{ 
    protected $datagridValues = array(
     '_page'  => 1, 
     '_sort_order' => 'ASC', // sort direction 
     '_sort_by' => 'c.name' // field name 
    ); 

    /** 
    * @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface 
    */ 
    public function createQuery($context = 'list') 
    { 
     $query = parent::createQuery($context); 

     return new ProxyQuery($query 
      ->join(sprintf('%s.category', $query->getRootAlias()), 'c')); 
    } 
} 
+0

Ho ancora bisogno di provarlo ma sembra essere esattamente quello di cui ho bisogno. Grazie. – agentar

5

asume name è di proprietà di un'entità Category da wich si desidera ordinare. Si può fare questo in voi ProductAdmin.php

protected function configureListFields(ListMapper $listMapper) 
{ 

    $listMapper->add('category.name', null, array(
      'sortable' => true, 
    )); 
    ... 
} 

questo modo di sfruttare i collegamenti ordinazione nell'intestazione della lista, generata dalla Sonata.

Modifica

Se si desidera anche avere un link sul nome della categoria nella lista dei prodotti per modificare rapidamente l'entità Category, a patto di aver creato una classe CategoryAdmin, si dovrebbe scrivere il codice come questo:

protected function configureListFields(ListMapper $listMapper) 
{ 

    $listMapper->add('category', null, array(
      'sortable' => 'category.name', 
    )); 
    ... 
} 

E nella tua classe Category è necessario implementare il metodo __toString() in questo modo:

public function __toString() 
{ 
    return $this->getName(); 
} 
+0

Questo ha funzionato con 'KnpLabs/DoctrineBehaviors' traducibile' -> add ('nome', null, array ('associated_property' => 'EntityTranslation', 'ordinabile' => 'translations.name')) ' – kunicmarko20

Problemi correlati