Symfony2 - Sonata Admin - 编辑/创建"返回列表"行动

时间:2014-11-07 19:29:59

标签: symfony sonata-admin

我有一个包含许多元素的实体的Sonata管理员,这些元素在列表视图中自然跨越多个页面。

我想做的就是在编辑或创建新实体之后,将用户重定向到显示已编辑实体的相应页面(而不是返回到列表中)第一页,这是奏鸣曲管理员的默认行为)。当只有1或2页时,dafult行为是正常的,但当你有几十页甚至几百页时,导航回正确的页面变得相当繁琐。

所以我的问题是,实现这一目标的恰当方法是什么?

我认为它会涉及为实体自定义管理员控制器,但我不确定正确的扩展点是什么。此外,如何利用分页器获取正确的页面以导航回来。

另一个潜在的黑客攻击是在从列表视图导航到编辑时捕获查询参数状态,然后将用户返回到相同的URL。这对于创建新项目无法正常工作。

从列表视图导航时,过滤器状态也是如此(如果用户在导航到编辑页面之前已对列表进行了排序和/或过滤)。

2 个答案:

答案 0 :(得分: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 :(得分:0)

我遇到了同样的问题,我正在考虑将路径中的变量传递给编辑页面,从而为您提供编辑请求的来源,然后您可以在给定变量的情况下重定向到原始页面。