Sonata admin:默认选择马赛克
Posted
技术标签:
【中文标题】Sonata admin:默认选择马赛克【英文标题】:Sonata admin: mosaic selected by default 【发布时间】:2018-10-24 03:57:47 【问题描述】:我正在使用 Sonata Admin,我有一个列表和一个马赛克视图。 如何默认选择马赛克视图? 我不想隐藏列表视图,默认选择马赛克视图。
【问题讨论】:
【参考方案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');
这些是设置和获取列表模式的方法。有两种列表模式的按钮:list
和 mosaic
。如果您将鼠标悬停在鼠标指针上,您会看到它们指向同一个 URL,但参数不同:
在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');
【讨论】:
以上是关于Sonata admin:默认选择马赛克的主要内容,如果未能解决你的问题,请参考以下文章