TYPO3 extbase:如何使用ObjectStorage?

4

我正在尝试使用m:n关系,与FrontEndUser与FrontEndUserGroup相关的方式相同,例如,没有中间的mm表。在我的控制器中,我构建了我的对象,然后调用$barRepository->update($barObject);来更新我的对象的值。但是,在更新函数上失败,并出现以下错误:

Fatal error: Call to undefined method Cbrunet\Up\Domain\Model\Foo::getPosition() in /home/cbrunet/websites/typo3_src-6.1.1/typo3/sysext/extbase/Classes/Persistence/Generic/Backend.php on line 486

Foo 是 Bar 的 ObjectStorage 中包含对象的类型时。我的理解是应该在 ObjectStorage 上调用 getPosition,而不是在包含在该 ObjectStorage 中的对象上调用。然而,我无法弄清楚为什么在我的情况下这不起作用。

这是在 TYPO3 6.1.5 中。任何提示都将不胜感激。


Bar 的模型具有与 Foo 的 m:n 关系,如下所示:

namespace Cbrunet\Up\Domain\Model;

class Bar extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

/**
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Cbrunet\Up\Domain\Model\Foo>
 */
protected $myprop;

public function __construct() {
    $this->myprop = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}

/**
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $myprop
 * @return void
 */
public function setMyprop(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $myprop) {
    $this->myprop = $myprop;
}

/**
 * @param \Cbrunet\Up\Domain\Model\Foo $myprop
 * @return void
 */
public function addMyprop(\Cbrunet\Up\Domain\Model\Foo $myprop) {
    $this->myprop->attach($myprop);
}

/**
 * @param \Cbrunet\Up\Domain\Model\Foo $myprop
 * @return void
 */
public function removeMyprop(\Cbrunet\Up\Domain\Model\Foo $myprop) {
    $this->myprop->detach($myprop);
}

/**
 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
 */
public function getMyprop() {
    return $this->myprop;
}
}

我的控制器中相关的代码如下:

/**
 * action update
 *
 * @return void
 */
public function updateAction() {
    $args = $this->request->getArgument('myargs');
    foreach ($args as $k=>$val) {
        $pp = $this->barRepository->findOneByAprop($k); // another prop of Bar, not illustrated in the code above.
        $listepour = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
        foreach ($val as $p) {
            $ap = $this->fooRepository->findOneByUid(intval($p));
            $listepour->attach($ap);
        }
        $pp->setMyprop($listepour);
        $this->barRepository->update($pp); // error occurs here
    }
    $this->redirect('list');
}
1个回答

3
  • 你也配置了TCA吗?
  • 你在你的领域模型中有一个initStorageObjects函数吗?

另外,你可以尝试使用扩展管理器构建这些案例并比较代码。


1
缺失的部分是 initStorageObjects 函数。它在哪里有文档记录?为什么 FrontEndUser 没有这个函数? - Charles Brunet
1
由于 frontenduser 在其 construct 方法中使用了与 initstorageObjects 相同的调用。 - freshp
但这是一个好问题,它在哪里记录呢?因此使用扩展管理器比较一些设置非常有用。 - freshp
6
确实,我也想知道这些东西的文档在哪里。我感觉自从 ExtBase 及其相关工具进入 TYPO3 队伍后,编写 TYPO3 的代码变得更加困难了。我喜欢这个框架,也喜欢它不断发展的代码库,但是当太多时间都花在尝试解决问题上时,我很难保持动力。我希望有参考级别的文档,但即使源代码中有一些链接指向“我们在这里和那里讨论过这个问题”,也会对我有很大帮助! - norwebian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接