public function buildDatagrid()
{
if ($this->datagrid) {
$this->datagrid = null;
$this->filterFieldDescriptions = array();
}
$filterParameters = $this->getFilterParameters();
$persistentParameters = $this->getPersistentParameters();
$context = $persistentParameters['context'];
$provider = $persistentParameters['provider'];
if ($context && array_key_exists('context', $filterParameters)) {
if ($filterParameters['context']['value'] != $context) {
$filterParameters['context']['value'] = $context;
$filterParameters['_page'] = 1;
}
} else {
$filterParameters['context'] = array('value' => $persistentParameters['context']);
}
if ($provider && array_key_exists('providerName', $filterParameters)) {
if ($filterParameters['providerName']['value'] != $provider) {
$filterParameters['providerName']['value'] = $provider;
$filterParameters['_page'] = 1;
}
} elseif ($provider) {
$filterParameters['providerName']['value'] = $provider;
$filterParameters['_page'] = 1;
} else {
$filterParameters['providerName'] = array('value' => $persistentParameters['provider']);
}
$this->request->getSession()->set($this->getCode() . '.filter.parameters', $filterParameters);
// transform _sort_by from a string to a FieldDescriptionInterface for the datagrid.
if (isset($filterParameters['_sort_by']) && is_string($filterParameters['_sort_by'])) {
if ($this->hasListFieldDescription($filterParameters['_sort_by'])) {
$filterParameters['_sort_by'] = $this->getListFieldDescription($filterParameters['_sort_by']);
} else {
$filterParameters['_sort_by'] = $this->getModelManager()->getNewFieldDescriptionInstance($this->getClass(), $filterParameters['_sort_by'], array());
$this->getListBuilder()->buildField(null, $filterParameters['_sort_by'], $this);
}
}
// initialize the datagrid
$this->datagrid = $this->getDatagridBuilder()->getBaseDatagrid($this, $filterParameters);
$this->datagrid->getPager()->setMaxPageLinks($this->maxPageLinks);
$mapper = new DatagridMapper($this->getDatagridBuilder(), $this->datagrid, $this);
// build the datagrid filter
$this->configureDatagridFilters($mapper, $context, $provider);
// ok, try to limit to add parent filter
if ($this->isChild() && $this->getParentAssociationMapping() && !$mapper->has($this->getParentAssociationMapping())) {
$mapper->add($this->getParentAssociationMapping(), null, array('field_type' => 'sonata_type_model_reference', 'field_options' => array('model_manager' => $this->getModelManager()), 'operator_type' => 'hidden'));
}
foreach ($this->getExtensions() as $extension) {
$extension->configureDatagridFilters($mapper, $context);
}
}