Typo3 从Fluid for loop chaos访问Extbase ObjectStorage(如何避免嵌套循环)
更新31.01。 同时,我做了一个新的测试,如Marcels网页上所写: 我也有同样的问题 目标是一个Feuser(登录)可以看到所有可用的客户端并选择他的收藏夹。因此,每个Feuser可以有多个客户端,每个客户端可以由多个Feuser选择。表关系是正确的。在后端,我可以看到并更新每一方的关系(客户端可以从列表中选择Feuser,反之亦然) 请在我的要点中找到所需的所有数据: 可在此处找到扩展的ZIP地址: 初始问题 对于一个小的Extbase扩展。我在Feuser和客户端之间有一个m:n连接。每个Feuser可以有多个关联的客户端。我已经与extension Builder建立了关系,在后端,一切都可以根据需要工作 在我的前端插件中,我还可以使用attach将客户端添加到我的feuser(这很有效) 每个Feuser都可以看到所有客户机(这是可行的)。在所有客户机的for循环中,如果客户机与Feuser关联,我想显示一个图标(这是可行的) 但是如何避免内部for循环(见下文)Typo3 从Fluid for loop chaos访问Extbase ObjectStorage(如何避免嵌套循环),typo3,fluid,extbase,typo3-6.2.x,Typo3,Fluid,Extbase,Typo3 6.2.x,更新31.01。 同时,我做了一个新的测试,如Marcels网页上所写: 我也有同样的问题 目标是一个Feuser(登录)可以看到所有可用的客户端并选择他的收藏夹。因此,每个Feuser可以有多个客户端,每个客户端可以由多个Feuser选择。表关系是正确的。在后端,我可以看到并更新每一方的关系(客户端可以从列表中选择Feuser,反之亦然) 请在我的要点中找到所需的所有数据: 可在此处找到扩展的ZIP地址: 初始问题 对于一个小的Extbase扩展。我在Feuser和客户端之间有一个m:n连
费尔斯型号:
/**
* 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;
}
<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>
/**
*客户
*
*@懒惰
*@var\TYPO3\CMS\Extbase\Persistence\ObjectStorage
*/
受保护的客户;
/**
*_uuu构造
*/
公共函数构造(){
$this->initStorageObjects();
}
/**
*初始化所有ObjectStorage属性。
*
*@返回无效
*/
受保护的函数initStorageObjects(){
$this->clients=new\TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
/**
*返回客户端
*@return\TYPO3\CMS\Extbase\Persistence\ObjectStorage$clients
*/
公共函数getClients(){
返回$this->clients;
}
List.html:
/**
* 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;
}
<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>
关系:
下面是我的Feuser客户的垃圾堆:
在我看来,如果一个FrontendUser可以有n个客户端,但一个客户端只能有一个FrontendUser,那么应该使用1:n关系 不知何故,您的代码非常分散注意力:您迭代了
{feuser.clients}
,但只有当feuser
实际上不是FrontendUsers的ObjectStorage,而是单个FrontendUser时,您才能这样做。也许您可以发布更多的设置
A建议您在客户机
模型中添加一个瞬态属性,例如:
/**
* @var boolean
* @transient
*/
protected $isChildOfAuthenticatedUser`
对于此属性,您将创建一个getter。getter将比较当前经过身份验证的用户是否与客户端的父用户相同。在本例中,我假设客户端
只有一个父用户/前端用户
:
/**
* @return boolean
*/
public function $isChildOfAuthenticatedUser {
if ((int)$GLOBALS['TSFE']->fe_user->user['uid'] === $this->frontendUser->getUid()) {
return TRUE;
} else {
return FALSE;
}
}
然后,在流体模板中,只需检查瞬态特性:
<f:if condition="{client.isChildOfAuthenticatedUser}">
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</f:if>
请记住,添加一些额外的检查,如果没有用户经过身份验证,是否也要显示数据。一个Feuser可以有多个客户端。一个客户端也可以有多个Feuser。想象Feuser是一名医生。医生有多个客户端,客户端可以有多个医生(一个用于眼睛,一个用于烟道等)。每个登录的Feuser都可以“pic”他的客户机,其想法是向他们显示所有客户机,并用图标指示客户机15和客户机34已经与他们连接,如果没有,则允许他们将列表条目(客户机)附加到客户机上(Feuser).关于显示的数据,仅限登录用户使用,不公开。你的意思是因为可以访问Feuers数据吗?嗨,我在上一篇文章中添加了信息。对不起,我没有经验,我不想在这里出错……我是否应该删除旧问题,然后再做一个新问题?我应该如何继续?不,编辑该文章就可以了。我会得到答案稍后或明天再给你回复。