从Fluid中访问Extbase ObjectStorage进行循环混乱(如何避免嵌套循环)

时间:2015-01-30 18:54:59

标签: typo3 fluid extbase typo3-6.2.x

更新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>

关联: enter image description here

以下是我的游客客户的转储: enter image description here

1 个答案:

答案 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>

请记住,如果没有用户通过身份验证,是否还要显示数据,请添加一些额外的检查。