To use Extbase CategoryRepository
, to work with Categories
on our model we need to:
Add in ext_tables.sql
, in our model, the categories field categories int(11) unsigned DEFAULT '0' NOT NULL,
Make your model categorizable, by adding bellow snipet in ext_tables.php
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
$_EXTKEY,
'tx_mymodels_domain_model_mymodel'
);
Create own Category
model and CategoryRepository
by extending extabase Category
and CategoryRepository
namespace MyVendor\MyModels\Domain\Model;
class Category extends \TYPO3\CMS\Extbase\Domain\Model\Category {}
namespace MyVendor\MyModels\Domain\Repository;
class CategoryRepository extends \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository {}
In your MyModelController
inject CategoryRepository
/**
* CategoryRepository
*
* @var \MyVendor\MyModels\Domain\Repository\CategoryRepository
* @inject
*/
protected $categoryRepository = null;
Add to your model categories
field with getters and setters
/**
* categories
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\MyVendor\MyModels\Domain\Model\Category>
* @lazy
*/
protected $categories;
/**
* Get categories
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\MyVendor\MyModels\Domain\Model\Category>
*/
public function getCategories()
{
return $this->categories;
}
/**
* Set categories
*
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $categories
* @return void
*/
public function setCategories($categories)
{
$this->categories = $categories;
}
In Configuration\TypoScript\setup.txt
map back your model to extbase category table
plugin.tx_mymodels.persistence.classes {
MyVendor\MyModels\Domain\Model\Category {
mapping {
recordType = 0
tableName = sys_category
}
}
}
Use this way:
// gets all categories, all across the site
$categoryRepository->findAll();
// gets categories for this model
$myModel->getCategories();
// get all models for specific category
$collection = \TYPO3\CMS\Frontend\Category\Collection\CategoryCollection::load(
$categoryId,
TRUE,
'tx_mymodels_domain_model_mymodel',
'categories'
);
If you want to take categories records only from a sys folder you need to configure repository:
defaultQuerySettings->setRespectStoragePage(true)
defaultQuerySettings->setStoragePageIds($storagePageIds);
Really useful. Thank you.
One question: I implemented this into my custom extension, and everything seems to work fine. But, in some cases the error message appears in the frontend: 'ColumnMap for property "categories" of class "XXX" is missing'.
Think this line returns an error: "$constraints[] = $query->equals('categories.uid', intval($settings["categoriesList"]));"
Once the cache is cleared everything is working, but after few hours an error appear again.
In general, everything is implemented based on your example. Do you have any hint, how to resolve this issue?