Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
All Data Structures Namespaces Files Functions Variables Pages
CategoryProcessUrlRewriteSavingObserver.php
Go to the documentation of this file.
1 <?php
8 
16 use Magento\Store\Model\ResourceModel\Group\CollectionFactory;
17 use Magento\Store\Model\ResourceModel\Group\Collection as StoreGroupCollection;
19 
24 {
28  private $categoryUrlRewriteGenerator;
29 
33  private $urlRewriteBunchReplacer;
34 
38  private $urlRewriteHandler;
39 
43  private $databaseMapPool;
44 
48  private $dataUrlRewriteClassNames;
49 
53  private $storeGroupFactory;
54 
63  public function __construct(
64  CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator,
65  UrlRewriteHandler $urlRewriteHandler,
66  UrlRewriteBunchReplacer $urlRewriteBunchReplacer,
67  DatabaseMapPool $databaseMapPool,
68  $dataUrlRewriteClassNames = [
69  DataCategoryUrlRewriteDatabaseMap::class,
70  DataProductUrlRewriteDatabaseMap::class
71  ],
72  CollectionFactory $storeGroupFactory = null
73  ) {
74  $this->categoryUrlRewriteGenerator = $categoryUrlRewriteGenerator;
75  $this->urlRewriteHandler = $urlRewriteHandler;
76  $this->urlRewriteBunchReplacer = $urlRewriteBunchReplacer;
77  $this->databaseMapPool = $databaseMapPool;
78  $this->dataUrlRewriteClassNames = $dataUrlRewriteClassNames;
79  $this->storeGroupFactory = $storeGroupFactory
80  ?: ObjectManager::getInstance()->get(CollectionFactory::class);
81  }
82 
90  public function execute(\Magento\Framework\Event\Observer $observer)
91  {
93  $category = $observer->getEvent()->getData('category');
94  if ($category->getParentId() == Category::TREE_ROOT_ID) {
95  return;
96  }
97 
98  if (!$category->hasData('store_id')) {
99  $this->setCategoryStoreId($category);
100  }
101 
102  $mapsGenerated = false;
103  if ($category->dataHasChangedFor('url_key')
104  || $category->dataHasChangedFor('is_anchor')
105  || !empty($category->getChangedProductIds())
106  ) {
107  if ($category->dataHasChangedFor('url_key')) {
108  $categoryUrlRewriteResult = $this->categoryUrlRewriteGenerator->generate($category);
109  $this->urlRewriteBunchReplacer->doBunchReplace($categoryUrlRewriteResult);
110  }
111  $productUrlRewriteResult = $this->urlRewriteHandler->generateProductUrlRewrites($category);
112  $this->urlRewriteBunchReplacer->doBunchReplace($productUrlRewriteResult);
113  $mapsGenerated = true;
114  }
115 
116  //frees memory for maps that are self-initialized in multiple classes that were called by the generators
117  if ($mapsGenerated) {
118  $this->resetUrlRewritesDataMaps($category);
119  }
120  }
121 
132  private function setCategoryStoreId($category)
133  {
135  $storeGroupCollection = $this->storeGroupFactory->create();
136 
137  foreach ($storeGroupCollection as $storeGroup) {
139  if (in_array($storeGroup->getRootCategoryId(), explode('/', $category->getPath()))) {
140  $category->setStoreId($storeGroup->getDefaultStoreId());
141  }
142  }
143  }
144 
151  private function resetUrlRewritesDataMaps($category)
152  {
153  foreach ($this->dataUrlRewriteClassNames as $className) {
154  $this->databaseMapPool->resetMap($className, $category->getEntityId());
155  }
156  }
157 }
__construct(CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator, UrlRewriteHandler $urlRewriteHandler, UrlRewriteBunchReplacer $urlRewriteBunchReplacer, DatabaseMapPool $databaseMapPool, $dataUrlRewriteClassNames=[DataCategoryUrlRewriteDatabaseMap::class, DataProductUrlRewriteDatabaseMap::class], CollectionFactory $storeGroupFactory=null)
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31