我使用ZeTheme来允许用户选择不同的主题。在一个主题中,我想以不同的方式显示来自控制器的数据,例如重新排序和分组工件。
我知道控制器应该处理这样的事情,但在这种情况下,它只适用于这个主题,另一个主题可能会有完全不同的主题,其余的主题应保持原样。它应该是主题本身提供的插入式解决方案。
我想到的选项是:
Controller
RenderStrategy
ViewHelper
Event
挂钩(没有找到哪些适用)每个主题。
我错过了什么吗?什么是最好的选择?
答案 0 :(得分:2)
我会使用ViewHelper
方法。基本上你会做这样的事情:
'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);
}
}
<?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
}