2012-01-12 33 views
7

Tôi có một lớp Quản trị sản phẩm. Thực thể Sản phẩm có mối quan hệ nhiều người với một thực thể Danh mục, tức là một sản phẩm được liên kết với một danh mục.Quản trị viên Sonata - trường "theo thứ tự" trong bảng có liên quan

Trong trang "danh sách" của quản trị viên cho sản phẩm, tôi cần sắp xếp theo tên danh mục (theo thứ tự bảng chữ cái) mà mỗi sản phẩm được liên kết với.

Đặt trường mặc định để sắp xếp theo dễ dàng nếu trường đó nằm trên chính đối tượng đó (xem Sonata admin bundle order để biết cách thực hiện việc này). Nhưng tôi không thể tìm ra cách sắp xếp theo một trường trong bảng có liên quan.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

6

Có vẻ như một giải pháp thay thế, nhưng nó hoạt động. Bạn cần phải thêm một phương pháp tham gia trọng createQuery(), hơn gán một SortBy mặc định trọng $ 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

Tôi vẫn cần phải thử nó nhưng nó có vẻ là chính xác những gì tôi cần. Cảm ơn bạn. – agentar

5

Asume name là tài sản của tổ chức Category bởi Mà bạn muốn sắp xếp. Bạn có thể làm điều này trong bạn ProductAdmin.php

protected function configureListFields(ListMapper $listMapper) 
{ 

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

Bằng cách này bạn tận dụng các liên kết đặt hàng trong tiêu đề của danh sách, được tạo bởi Sonata.

Sửa

Nếu bạn cũng muốn có một liên kết vào tên mục trong danh sách sản phẩm để nhanh chóng chỉnh sửa các thực thể Category, giả sử bạn đã tạo ra một lớp CategoryAdmin, bạn nên viết mã của bạn như thế này:

protected function configureListFields(ListMapper $listMapper) 
{ 

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

Và trong lớp Category của bạn, bạn nên thực hiện phương pháp __toString() như thế này:

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

Điều này làm việc với 'KnpLabs/DoctrineBehaviors' có thể dịch' -> add ('name', null, array ('associated_property' => 'EntityTranslation', 'sortable' => 'translations.name')) ' – kunicmarko20

Các vấn đề liên quan