我只是尝试使用extbase,并使用两个表(repostiories)和一个mm_table存储关系来解决问题。
表格是:
我创建了一个Address类型的对象,并且可以setName等没有问题。但是还有一个cateogry表,这两个表由mm_table相关联。而这种关系我只能在TYPO3后端而不是在插件中。
代码是这样的:
// get repo
$addressRepo = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\GoMapsExt\Domain\Repository\AddressRepository');
$addressCategoryRepo = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\GoMapsExt\Domain\Repository\CategoryRepository');
// get category object (lead = 2))
$addressCategoryObj = $addressCategoryRepo->findByUid(2);
// attach category to address
//$go_map_address->setCategories($addressCategoryObj); <-- need to add category here
我如何添加这样的关系?似乎没有setCategory方法。
答案 0 :(得分:0)
首先,检查模型内的功能。你肯定有像addCategory(),getCategories(),removeCategory()或setCategories()这样的函数。
第二,如果确实需要,不要使用makeInstance函数获取存储库(它已过时),只需注入它或使用ObjectManager:
/**
* categoryRepository
*
* @var \TYPO3\GoMapsExt\Domain\Repository\CategoryRepository
* @inject
*/
protected $categoryRepository;
或/和
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
if (!is_object($this->categoryRepository)) {
$this->categoryRepository = $objectManager->get('TYPO3\\GoMapsExt\\Domain\\Repository\\CategoryRepository');
}
因为Typo3可能有问题,所以我通常都会使用它们。
答案 1 :(得分:0)
在extbase中使用mm和其他关系非常简单。首先,您需要配置与TCA的关系,如果它在后端工作,那么您已经完成了这一部分。其次,您需要在模型中配置属性,如下所示:
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\GoMapsExt\Domain\Model\Category>
* @lazy
*/
protected $categories;
/**
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $categories
*/
public function setCategories($categories) {
$this->categories = $categories;
}
/**
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
*/
public function getCategories() {
// this prevents a fatal error if you have created your model with new instead of the objectManager
if ($this->categories === null) {
$this->categories = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
return $this->categories;
}
在Controller中,您可以添加/删除/遍历类别:
$go_map_address->getCategories->attach($addressCategoryObj);
foreach ($go_map_address->getCategories() as $category) {
//$category
}
请记住,在向其添加类别后,您必须将$ go_map_address与存储库一起保存,就像对对象的每次其他更改一样