【问题标题】:Sonata admin: mosaic selected by defaultSonata admin:默认选择马赛克
【发布时间】:2018-10-24 03:57:47
【问题描述】:

我正在使用 Sonata Admin,我有一个列表和一个马赛克视图。 如何默认选择马赛克视图?
我不想隐藏列表视图,默认选择马赛克视图。

【问题讨论】:

    标签: symfony sonata-admin sonata symfony-sonata


    【解决方案1】:

    Admin 类继承自 AbstractAdmin。如果我们有一个实体类Foo,我们将创建一个管理类FooAdmin 扩展Sonata\AdminBundle\Admin\AbstractAdmin

    让我们看一下源代码:

    public function setListMode($mode)
    {
        if (!$this->hasRequest()) {
            throw new \RuntimeException(sprintf('No request attached to the current admin: %s', $this->getCode()));
        }
    
        $this->getRequest()->getSession()->set(sprintf('%s.list_mode', $this->getCode()), $mode);
    }
    
    public function getListMode()
    {
        if (!$this->hasRequest()) {
            return 'list';
        }
    
        return $this->getRequest()->getSession()->get(sprintf('%s.list_mode', $this->getCode()), 'list');
    }
    

    这些是设置和获取列表模式的方法。有两种列表模式的按钮:listmosaic。如果您将鼠标悬停在鼠标指针上,您会看到它们指向同一个 URL,但参数不同:

    • /list?_list_mode=list
    • /list?_list_mode=mosaic

    getListMode 方法中,我们看到默认调用list 模式。

    我发现将mosaic 设置为默认值的方法是在Admin 类中调用setListMode 方法:

    protected function configureListFields(ListMapper $listMapper)
    {
        if ($mode = $this->request->query->get('_list_mode')) {
            $this->setListMode($mode);
        } else {
            $this->setListMode('mosaic');
        }
    
        $listMapper
            ->addIdentifier('fooId')
            ->add('fooBar')
        ;
    }
    

    我希望它可以帮助某人。我一直在寻找更优雅的方式,比如在管理服务中设置,但找不到更好的解决方案。如果有人有其他建议,我很乐意学习新知识。

    【讨论】:

    • 如果没有请求(例如全局搜索的结果),此解决方案将失败。我建议简单地做: if ($this->hasRequest()) { $this->setListMode('mosaic'); }
    • @devilcius 我没有想到那种极端情况。谢谢你指出。对我来说,它确实是这样工作的。我认为理想的解决方案是在管理服务中设置选项,但我不知道该怎么做。对configureListFields 方法的任何摆弄都是一种肮脏的方法。
    • @devilcius 您的解决方案的问题是即使用户单击列表按钮也会显示马赛克视图。那会很烦人。 if 条件应该用你的 sn-p 扩展,以捕捉你提到的边缘情况。然而,它仍然是一个快速而肮脏的解决方案,我知道这一点,但由于缺乏更深入的理解和更好的知识,我不得不暂时坚持下去。
    【解决方案2】:

    在 getListMode 方法中,我们看到列表模式是按 默认。

    所以在我看来,最简单的方法是覆盖getListMode 并将“list”替换为“mosaic”。

    public function getListMode()
    {
        if (!$this->hasRequest()) {
            return 'mosaic';
        }
    
        return $this->getRequest()->getSession()->get(sprintf('%s.list_mode', $this->getCode()), 'mosaic');
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 2011-09-29
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多