更新31.01。
与此同时,我在Marcels网页上写了一个新的测试Ext: http://lbrmedia.net/codebase/Eintrag/extbase-bidirektionale-mm-relation/
我对此有同样的问题。
目标是Feuser(已登录)可以查看所有可用的客户并选择他的收藏夹。因此,每个Feuser都可以拥有许多客户,每个客户都可以被许多Feuse选中。表关系是正确的。在后端,我可以看到并更新各方的关系(客户可以从列表中选择Feusers,反之亦然。
请查找我的要点中所需的所有数据: https://gist.github.com/metaxos/91622c536588d0aa8440
可以在此处找到扩展程序的ZIP:http://www.filedropper.com/testmm000201501311251
用于小型Extbase扩展。我在Feusers和客户端之间有一个m:n连接。每个Feuser可以关联多个客户端。我已经与Extension Builder建立了关系,并且在后端,一切都可以根据需要运行。
在我的前端插件中,我还可以通过附加功能将客户端添加到我的feuser中(这可行)。
每个Feuser都可以看到所有客户端(这是有效的)。在所有客户端的for循环中,如果客户端与feuser关联,我想显示一个图标(这是有效的)。
但是我怎样才能避免内部for循环(见下文)?
<f:for each="{feusers.clients}" as="singleClient">
Feusers模型:
/**
* Clients
*
* @lazy
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<Exapoint\Exaibbrplus\Domain\Model\Clients>
*/
protected $clients;
/**
* __construct
*/
public function __construct() {
$this->initStorageObjects();
}
/**
* Initializes all ObjectStorage properties.
*
* @return void
*/
protected function initStorageObjects() {
$this->clients = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
/**
* Returns the clients
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Exapoint\Exaibbrplus\Domain\Model\Clients> $clients
*/
public function getClients() {
return $this->clients;
}
List.html :
<f:for each="{clients}" as="client">
<tr>
<td>
<f:for each="{feusers.clients}" as="singleClient">
<f:if condition="{client.identifier}=={singleClient.identifier}">
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</f:if>
</f:for>
</td>
</tr>
</f:for>
关联:
以下是我的游客客户的转储:
答案 0 :(得分:0)
在我看来,如果FrontendUser可以有n个客户端,但客户端只能有一个FrontendUser,那么你应该使用1:n关系。
不知何故,你的代码非常分散注意力:你遍历{feusers.clients}
,但只有当feusers
实际上不是FrontendUsers的ObjectStorage,而是单个FrontendUser时,你才能这样做。也许你可以发布更多你的设置。
建议您为Clients
模型添加瞬态属性,例如:
/**
* @var boolean
* @transient
*/
protected $isChildOfAuthenticatedUser`
对于此属性,您将创建一个getter。 getter比较当前经过身份验证的用户是否与客户端的父用户相同。在示例中,我假设Client
只有一个父/ FrontendUser
:
/**
* @return boolean
*/
public function $isChildOfAuthenticatedUser {
if ((int)$GLOBALS['TSFE']->fe_user->user['uid'] === $this->frontendUser->getUid()) {
return TRUE;
} else {
return FALSE;
}
}
然后,在您的Fluid模板中,您只需要检查该瞬态属性:
<f:if condition="{client.isChildOfAuthenticatedUser}">
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</f:if>
请记住,如果没有用户通过身份验证,是否还要显示数据,请添加一些额外的检查。