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);