在视图中显示之前重新排序数据

时间:2014-05-21 08:05:32

标签: zend-framework2

我使用ZeTheme来允许用户选择不同的主题。在一个主题中,我想以不同的方式显示来自控制器的数据,例如重新排序和分组工件。

我知道控制器应该处理这样的事情,但在这种情况下,它只适用于这个主题,另一个主题可能会有完全不同的主题,其余的主题应保持原样。它应该是主题本身提供的插入式解决方案。

我想到的选项是:

  • 自定义Controller
  • 自定义RenderStrategy
  • 自定义ViewHelper
  • 编辑:与某些Event挂钩(没有找到哪些适用)

每个主题。

我错过了什么吗?什么是最好的选择?

2 个答案:

答案 0 :(得分:2)

我会使用ViewHelper方法。基本上你会做这样的事情:

Conifiguration

'view_helpers' => [
    'factories' => [
        'collectionRenderer' => 'My\View\Helper\CollectionRendererFactory'
    ]
]

工厂

<?php
namespace My\View\Helper;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class CollectionRendererFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $sl)
    {
        $realSl = $sl->getServiceLocator();

        $userTheme = // get access to the current theme, session, config, user-db, whatever

        return new CollectionRenderer($userTheme);
    }
}

ViewHelper

<?php
namespace My\View\Helper;

use Zend\View\Helper\AbstractHelper;

class CollectionRenderer extends AbstractHelper
{
    protected $theme;

    public function __construct($userTheme = 'default-theme')
    {
        $this->theme = $userTheme;
    }

    public function __invoke($collection)
    {
        return $this->getView()->render(
            'path/to/collection/renderer/' . $this->theme,
            ['collection' => $collection]
        );
    }
}

示例视图

// module/path/to/collection/renderer/default-theme.phtml
<h2>Stuff in list</h2>
<ul>
<?php foreach ($this->collection as $entry) : ?>
     <li><?= $entry->getName();?></li>
<?php endforeach; ?>
</ul>

然后,根据所选主题,它也可以是一个表

// module/path/to/collection/renderer/super-mega-theme.phtml
<h2>Stuff in table</h2>
<table>
<?php foreach ($this->collection as $entry) : ?>
     <tr><td><?= $entry->getName();?></td></tr>
<?php endforeach; ?>
</table>

普通视图

echo $this->collectionRenderer($collectionData);

在视图中你也可以对集合进行处理,比如重新订购等......

答案 1 :(得分:0)

如何存储用户当前在会话中使用的主题类型?并通过简单的if条件控制数据,该条件检查主题是否是需要数据重新排序的主题:

use Zend\Session\Container;


// serves as identifier, you can access this is other controllers by doing this line again and the namespace you used.
$container = new Container('namespace'); 

// Setter
$container->themeName = 'theme name';

// on a separate controller this is how you check
$container = new Container('namespace');
if ($container->themeName == "theme name") {
    // do reordering stuffs

}