2012-12-08 15 views
5

Stiamo utilizzando il pacchetto Sonata per la nostra sezione di amministrazione. Quando un utente accede a una sezione qualsiasi dell'amministratore, ad esempio prodotti, e tenta di ordinare in base a una determinata colonna, non ricorda l'ordinamento nella pagina successiva e, inoltre, l'utente può solo ordinare in una direzione. so come aggiustarlo?Ordinamento di colonne nella pagina di amministrazione

Ecco il mio codice in cui estendo Sonata classe admin:

namespace Project\AdminBundle\Admin; 

use Sonata\AdminBundle\Admin\Admin; 
use Doctrine\ORM\EntityManager; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 
use Sonata\AdminBundle\Datagrid\ListMapper; 
use Sonata\AdminBundle\Show\ShowMapper; 
use Sonata\AdminBundle\Form\FormMapper; 
use Sonata\AdminBundle\Route\RouteCollection; 

abstract class AbstractAdmin extends Admin 
{ 
/** @var int */ 
protected $maxPerPage = 10; 

/** @var int */ 
protected $maxPageLinks = 30; 

/** @var \Doctrine\ORM\Mapping\ClassMetadata */ 
protected $metadata; 

/** @var Doctrine\ORM\EntityManager $entityManager */ 
protected $entityManager; 

/** @var array */ 
protected $forbiddenFormFields = array(
    'id', 'createdAt', 'updatedAt', 'publishedAt', 'notifiedAt' 
); 

/** @var array */ 
protected $optionalFormFields = array(
    'slug' 
); 

/** @var array */ 
protected $forbiddenShowFields = array(
    'id' 
); 

/** @var array */ 
protected $forbiddenDatagridFields = array(
    'createdAt', 'updatedAt', 'publishedAt', 'notifiedAt' 
); 

/** @var array */ 
protected $forbiddenDatagridTypes = array(
    'datetime', 'date', 'float', 'decimal' 
); 

/** @var array */ 
protected $forbiddenListFields = array(); 

/** @var array */ 
protected $listIdentifierFields = array(
    'id', 'name', 'slug', 'symbol' 
); 

/** @var array */ 
public $leftMostFields = array(
    'id', 'name', 'slug' 
); 

/** @var array */ 
public $rightMostFields = array(
    'notifiedAt', 'createdAt', 'updatedAt', 'publishedAt', 
); 

/** @var array */ 
public $fields; 

/** 
* Extended constructor with Entity Manager 
* 
* @param string      $code 
* @param string      $class 
* @param string      $baseControllerName 
* @param Doctrine\ORM\EntityManager $entityManager 
*/ 
public function __construct($code, $class, $baseControllerName, 
          $entityManager) 
{ 
    parent::__construct($code, $class, $baseControllerName); 
    $this->entityManager = $entityManager; 
    $this->metadata  = $entityManager->getClassMetadata($class); 
    $fields = array_merge($this->metadata->getAssociationNames(), 
     $this->metadata->getFieldNames()); 
    $this->fields = $this->sortFields($fields); 

    // Set default ordering of lists 
    if (!$this->hasRequest()) { 
     $this->datagridValues = array(
      '_page'  => 1, 
      '_sort_order' => 'DESC', 
      '_sort_by' => 'updatedAt' 
     ); 
    } 
} 

/** 
* @param FormMapper $mapper 
*/ 
protected function configureFormFields(FormMapper $mapper) 
{ 
    parent::configureFormFields($mapper); 
    foreach ($this->fields as $field) { 
     $options = array(); 
     $type = $this->metadata->getTypeOfField($field); 

     if (in_array($type, array('bool', 'boolean'))) { 
      $options['required'] = false; 
     } 

     if (in_array($field, $this->forbiddenFormFields)) { 
      continue; 
     } 

     if (in_array($field, $this->optionalFormFields)) { 
      $options['required'] = false; 
     } 

     if ($this->metadata->isAssociationWithSingleJoinColumn($field)) { 
      $assoc = $this->metadata->getAssociationMapping($field); 
      if (@$assoc['joinColumns']['0']['nullable']) { 
       $options['required'] = false; 
      } 
     } 

     $associations = $this->metadata->getAssociationMappings(); 
     if (isset($associations[$field])) { 
      $options['attr'] = array('class' => 'chzn-select'); 
      if ((isset($associations[$field]['joinTable'])) || 
       (!$associations[$field]['isOwningSide'])) { 
       $options['required'] = false; 
      } 
     } 

     $mapper->add($field, null, $options); 
    } 
} 

/** 
* @param ShowMapper $mapper 
*/ 
protected function configureShowFields(ShowMapper $mapper) 
{ 
    parent::configureShowFields($mapper); 
    foreach ($this->fields as $field) { 
     if (in_array($field, $this->forbiddenShowFields)) { 
      continue; 
     } 
     $mapper->add($field); 
    } 
} 

/** 
* @param DatagridMapper $mapper 
* 
* @return void 
*/ 
protected function configureDatagridFilters(DatagridMapper $mapper) 
{ 
    parent::configureDatagridFilters($mapper); 
    foreach ($this->fields as $field) { 
     $type = $this->metadata->getTypeOfField($field); 
     if (in_array($field, $this->forbiddenDatagridFields)) { 
      continue; 
     } 
     if (in_array($type, $this->forbiddenDatagridTypes)) { 
      continue; 
     } 
     $mapper->add($field); 
    } 
} 

/** 
* @param ListMapper $mapper 
*/ 
protected function configureListFields(ListMapper $mapper) 
{ 
    parent::configureListFields($mapper); 

    foreach ($this->fields as $field) { 
     if (in_array($field, $this->forbiddenListFields)) { 
      continue; 
     } 

     if (in_array($field, $this->listIdentifierFields)) { 
      $mapper->addIdentifier($field, null, array('route' => array('name' => 'show'))); 
     } else { 
      $mapper->add($field); 
     } 
    } 
} 

/** 
* @throws \Exception 
*/ 
public function sortFields($fields) 
{ 
    $leftMost = $this->leftMostFields; 
    $rightMost = $this->rightMostFields; 

    usort($fields, function($a, $b) use ($leftMost, $rightMost) { 
     if (count(array_intersect($leftMost, $rightMost)) != 0) { 
      throw new \Exception('Leftmost and Rightmost must differ'); 
     } 

     $leftPosA = array_search($a, $leftMost); 
     $isALeftMost = is_integer($leftPosA); 
     $rightPosA = array_search($a, $rightMost); 
     $isARightMost = is_integer($rightPosA); 

     $leftPosB = array_search($b, $leftMost); 
     $isBLeftMost = is_integer($leftPosB); 
     $rightPosB = array_search($b, $rightMost); 
     $isBRightMost = is_integer($rightPosB); 

     if ($isALeftMost && $isBLeftMost) { 
      return $leftPosA - $leftPosB; 
     } 
     if ($isARightMost && $isBRightMost) { 
      return $rightPosA - $rightPosB; 
     } 
     if ($isALeftMost || $isBRightMost){ 
      return -1; 
     } 
     if ($isARightMost || $isBLeftMost) { 
      return 1; 
     } 
     return strnatcasecmp($a, $b); 
    }); 

    return $fields; 
} 
} 

Quando abbiamo aggiunto "sort_by" in ramoscello file.It è un lavoro solo da 1 a 9 pagine quando andiamo da 1 a 11 o 9 per 10 poi non ricorda l'ordinamento nella pagina successiva.

file di Twig:

<div class="pagination"> 
<ul> 
            {% if admin.datagrid.pager.page != 1 %} 
             <li><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, 1)) }}" title="{% trans from 'SonataAdminBundle' %}link_first_pager{% endtrans %}">&laquo;</a></li> 
            {% endif %} 

            {% if admin.datagrid.pager.page != admin.datagrid.pager.previouspage %} 
             <li><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, admin.datagrid.pager.previouspage)) }}" title="{% trans from 'SonataAdminBundle' %}link_previous_pager{% endtrans %}">&lsaquo;</a></li> 
            {% endif %} 

            {# Set the number of pages to display in the pager #} 
            {% for page in admin.datagrid.pager.getLinks() %} 
             {% if page == admin.datagrid.pager.page %} 
              <li class="active"><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, page)) }}{{sortBy}}">{{ page }}</a></li> 
             {% else %} 
              <li><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, page)) }}{{sortBy}}">{{ page }}</a></li> 
             {% endif %} 
            {% endfor %} 

            {% if admin.datagrid.pager.page != admin.datagrid.pager.nextpage %} 
             <li><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, admin.datagrid.pager.nextpage)) }}" title="{% trans from 'SonataAdminBundle' %}link_next_pager{% endtrans %}">&rsaquo;</a></li> 
            {% endif %} 

            {% if admin.datagrid.pager.page != admin.datagrid.pager.lastpage %} 
             <li><a href="{{ admin.generateUrl('list', admin.modelmanager.paginationparameters(admin.datagrid, admin.datagrid.pager.lastpage)) }}" title="{% trans from 'SonataAdminBundle' %}link_last_pager{% endtrans %}">&raquo;</a></li> 
            {% endif %} 

+0

può essere questo link è utile a voi http://stackoverflow.com/questions/8120787/sonata-admin-bundle-order –

+0

@ S.S grazie ma ho già visto questa risposta. – Sid

+0

Quali versioni di Symfony2 e SonataAdmin stai usando? Penso di aver avuto questo problema qualche tempo fa, ma è stato risolto con l'aggiornamento. – RobMasters

risposta

1

Questo è il tuo problema di impaginazione. vai sul tuo file di ramoscello dove imponi l'impaginazione e aggiungi "sort_by" dove passi il parametro.

+0

grazie, ma non funziona tutte le pagine. – Sid

+0

Questo è un bug di sonata, quando aggiorno il pacchetto Sonata Admin, lo aggiusto. – Sid

Problemi correlati