2012-01-12 23 views
7

Tengo una clase de administración de producto. La entidad Producto tiene una relación muchos a uno con una entidad Categoría, es decir, un producto está asociado a una categoría.Sonata admin - campo "ordenar por" en la tabla relacionada

En la página de "lista" de administración para productos, necesito ordenar por el nombre de categoría (alfabéticamente) a la que está asociado cada producto.

Configurar el campo predeterminado para ordenar por es fácil si el campo está en la propia entidad (ver Sonata admin bundle order para saber cómo hacerlo). Pero no puedo descifrar cómo ordenar por un campo en una tabla relacionada.

Cualquier ayuda es apreciada.

Respuesta

6

Parece una solución, pero funciona. Usted tiene que añadir un método de unión anular CreateQuery(), que asignar un valor predeterminado sortBy anulando $ 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

Todavía tengo que probarlo, pero parece ser exactamente lo que necesito. Gracias. – agentar

5

Asume name es propiedad de la entidad Category por wich que desea ordenar. Usted puede hacer esto en que ProductAdmin.php

protected function configureListFields(ListMapper $listMapper) 
{ 

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

esta manera a aprovechar los enlaces de pedido, en la cabecera de la lista, generada por Sonata.

Editar

Si también le gustaría tener un enlace en el nombre de la categoría en la lista de productos a editar rápidamente la entidad Category, suponiendo que haya creado una clase CategoryAdmin, se debe escribir el código como el siguiente:

protected function configureListFields(ListMapper $listMapper) 
{ 

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

Y en su clase Category se debe implementar el método __toString() así:

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

Esto funcionó con 'KnpLabs/DoctrineBehaviors' traducible' -> add ('nombre', nulo, array ('propiedad_sociada' => 'EntityTranslation', 'sortable' => 'translations.name')) ' – kunicmarko20

Cuestiones relacionadas