9 use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
74 private $cacheManager;
111 private function getCacheManager()
113 if (!$this->cacheManager) {
115 ->get(CacheInterface::class);
117 return $this->cacheManager;
150 return $this->arrayManager->set(
151 'create_category_modal',
157 'isTemplate' =>
false,
158 'componentType' =>
'modal',
160 'title' =>
__(
'New Category'),
163 'state' =>
'!index=create_category:responseStatus' 169 'create_category' => [
174 'componentType' =>
'container',
175 'component' =>
'Magento_Ui/js/form/components/insert-form',
177 'update_url' => $this->urlBuilder->getUrl(
'mui/index/render'),
178 'render_url' => $this->urlBuilder->getUrl(
179 'mui/index/render_handle',
181 'handle' =>
'catalog_category_create',
182 'store' => $this->locator->getStore()->getId(),
186 'autoRender' =>
false,
187 'ns' =>
'new_category_form',
188 'externalProvider' =>
'new_category_form.new_category_form_data_source',
189 'toolbarContainer' =>
'${ $.parentName }',
190 'formSubmitType' =>
'ajax',
209 $fieldCode =
'category_ids';
210 $elementPath = $this->arrayManager->findPath($fieldCode, $meta,
null,
'children');
211 $containerPath = $this->arrayManager->findPath(static::CONTAINER_PREFIX . $fieldCode, $meta,
null,
'children');
217 $meta = $this->arrayManager->merge(
224 'label' =>
__(
'Categories'),
226 'breakLine' =>
false,
227 'formElement' =>
'container',
228 'componentType' =>
'container',
229 'component' =>
'Magento_Ui/js/form/components/group',
230 'scopeLabel' =>
__(
'[GLOBAL]'),
231 'disabled' => $this->locator->getProduct()->isLockedAttribute($fieldCode),
240 'formElement' =>
'select',
241 'componentType' =>
'field',
242 'component' =>
'Magento_Catalog/js/components/new-category',
243 'filterOptions' =>
true,
244 'chipsEnabled' =>
true,
245 'disableLabel' =>
true,
246 'levelsVisibility' =>
'1',
247 'elementTmpl' =>
'ui/grid/filters/elements/ui-select',
248 'options' => $this->getCategoriesTree(),
250 'index=create_category:responseData' =>
'setParsed',
251 'newOption' =>
'toggleOptionSelected' 254 'dataScope' => $fieldCode,
261 'create_category_button' => [
265 'title' =>
__(
'New Category'),
266 'formElement' =>
'container',
267 'additionalClasses' =>
'admin__field-small',
268 'componentType' =>
'container',
269 'component' =>
'Magento_Ui/js/form/components/button',
270 'template' =>
'ui/form/components/button/container',
273 'targetName' =>
'product_form.product_form.create_category_modal',
274 'actionName' =>
'toggleModal',
278 'product_form.product_form.create_category_modal.create_category',
279 'actionName' =>
'render' 283 'product_form.product_form.create_category_modal.create_category',
284 'actionName' =>
'resetForm' 287 'additionalForGroup' =>
true,
289 'source' =>
'product_details',
290 'displayArea' =>
'insideGroup',
310 protected function getCategoriesTree($filter =
null)
312 $categoryTree = $this->getCacheManager()->load(self::CATEGORY_TREE_ID .
'_' . $filter);
314 return $this->serializer->unserialize($categoryTree);
317 $storeId = $this->locator->getStore()->getId();
319 $matchingNamesCollection = $this->categoryCollectionFactory->create();
321 if ($filter !==
null) {
322 $matchingNamesCollection->addAttributeToFilter(
324 [
'like' => $this->dbHelper->addLikeEscape($filter, [
'position' =>
'any'])]
328 $matchingNamesCollection->addAttributeToSelect(
'path')
329 ->addAttributeToFilter(
'entity_id', [
'neq' => CategoryModel::TREE_ROOT_ID])
332 $shownCategoriesIds = [];
335 foreach ($matchingNamesCollection as
$category) {
336 foreach (explode(
'/',
$category->getPath()) as $parentId) {
337 $shownCategoriesIds[$parentId] = 1;
342 $collection = $this->categoryCollectionFactory->create();
344 $collection->addAttributeToFilter(
'entity_id', [
'in' => array_keys($shownCategoriesIds)])
345 ->addAttributeToSelect([
'name',
'is_active',
'parent_id'])
349 CategoryModel::TREE_ROOT_ID => [
350 'value' => CategoryModel::TREE_ROOT_ID,
357 if (!isset($categoryById[$categoryId])) {
358 $categoryById[$categoryId] = [
'value' => $categoryId];
364 $categoryById[
$category->getParentId()][
'optgroup'][] = &$categoryById[
$category->getId()];
367 $this->getCacheManager()->save(
368 $this->serializer->serialize($categoryById[CategoryModel::TREE_ROOT_ID][
'optgroup']),
369 self::CATEGORY_TREE_ID .
'_' . $filter,
376 return $categoryById[CategoryModel::TREE_ROOT_ID][
'optgroup'];