2014-11-07 2 views
1

У меня есть администратор сонаты для объекта с множеством элементов, который, естественно, охватывает несколько страниц в представлении списка.Symfony2 - Sonata Admin - Изменить/Создать действие «вернуться к списку»

Что бы я хотел сделать, так это после редактирования или создания нового объекта перенаправить пользователя на соответствующую страницу, на которой отображается отредактированный объект (в отличие от возврата к первой странице списка, которая является поведение по умолчанию администратора сонаты). Поведение dafult нормально, когда есть только 1 или 2 страницы, но когда у вас десятки или даже сотни страниц, переход на правильную страницу становится довольно утомительным.

Итак, мой вопрос в том, как правильно это сделать?

Я думаю, что это связано с настройкой контроллера администратора для объекта, но я не уверен, что такое правильные точки расширения. А также, как использовать paginator для получения правильной страницы для перехода назад.

Другим потенциальным взломом было бы захват состояния параметров запроса при навигации из вида списка в редактирование, а затем возврат пользователя к тому же URL-адресу. Это не сработает правильно для создания новых элементов.

Также существует вопрос о состоянии фильтров при навигации по списку (если пользователь отсортировал и/или отфильтровал список перед переходом на страницу редактирования).

ответ

3

Я знаю, что поздно, но это может быть полезным для кого-то еще ... Вот как я сделал это, переопределив AdminBundle CRUDController:

<?php 
namespace MyProject\AdminBundle\Controller; 

use Sonata\AdminBundle\Controller\CRUDController as BaseController; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class CRUDController extends BaseController 
{ 
    protected function redirectTo($object, Request $request = null) 
    { 
     $response = parent::redirectTo($object, $request); 

     if (null !== $request->get('btn_update_and_list') || null !== $request->get('btn_create_and_list')) { 
      $url = $this->admin->generateUrl('list'); 

      $last_list = $this->get('session')->get('last_list'); 

      if(strstr($last_list['uri'], $url) && !empty($last_list['filters'])) { 
       $response = new RedirectResponse($this->admin->generateUrl(
        'list', 
        array('filter' => $last_list['filters']) 
       )); 
      } 
     } 

     return $response; 
    } 

    public function listAction(Request $request = null) 
    { 
     $uri_parts = explode('?', $request->getUri(), 2); 
     $filters = $this->admin->getFilterParameters(); 
     $this->get('session')->set('last_list', array('uri' => $uri_parts[0], 'filters' => $filters)); 

     $response = parent::listAction($request); 

     return $response; 
    } 
} 
+1

Итак, вы используете сеанс для хранения последней страницы, на которой был пользователь, а затем перенаправляете на URL-адрес, соответствующий этой странице? Я читаю это правильно? Если это так - проблема с этим, так это, если пользователь открывает другую вкладку (в пределах одного сеанса) и просматривает ее. Я думаю, что решение идет по правильному пути, но ему нужна дополнительная защита (возможно, в виде уникального идентификатора для действия). Я бы рекомендовал добавить повествование к вашему ответу, и я соглашусь с ним. –

+0

Вы правы, это именно то, что я делаю. И вы также правы с странным поведением, если пользователь просматривает несколько вкладок. Извините, у меня нет времени найти подходящее рабочее решение, но я думаю, это возможно. Мой ответ - это только путь. Должны быть и другие. – wewereweb

0

У меня такая же проблема , Я думал о передаче переменной на пути к странице редактирования, таким образом, давая вам, откуда возник запрос на редактирование, затем вы можете перенаправить на исходную страницу с учетом переменной.

Смежные вопросы