magento2: Cannot assign products to categories not under tree root
Preconditions
Magento version: 2.1.4 community edition PHP version 7.0.15
Steps to reproduce
Try to assign some products to categories programmatically using a CategoryLinkManagement object. The code looks something like this:
$this
->categoryLinkManagement
->assignProductToCategories(
$someValidProduct->getSku(),
[$someValidCategory->getId()]
);
where the categoryLinkManagement property is injected via DI into the current class.
Expected result
The product gets assigned to the category.
Actual result
I get an error telling me that “Could not save product “2048” with position 0 to category 42”
What I think
After digging around in the code, it seems that the issue stems from this piece of code in the Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator class, the isCategoryProperForGenerating method:
if ($category->getParentId() != \Magento\Catalog\Model\Category::TREE_ROOT_ID) {
list(, $rootCategoryId) = $category->getParentIds();
return $rootCategoryId == $this->storeManager->getStore($storeId)->getRootCategoryId();
}
more specific,
list(, $rootCategoryId) = $category->getParentIds();
From what I can tell, the code simply tries to get the first element from the array of category parent ids and assign it to $rootCategoryId, but it does that by relying on php 5 or less behavior. Here is what the php manual says about list:
Warning In PHP 5, list() assigns the values starting with the right-most parameter. In PHP 7, list() starts with the left-most parameter.
They are even warning that list is unpredictable:
Generally speaking, it is advisable to avoid relying on a specific order of operation, as this may change again in the future.
So this code fails to get the root category in php 7 and it even generates a notice if the parent ids array has less than 2 elements, since there is no element with an index of 1.
Exception: Notice: Undefined offset: 1 in vendor/magento/module-catalog-url-rewrite/Model/ProductUrlRewriteGenerator.php on line 195
(here is a related issue detailing this: https://github.com/magento/magento2/issues/7916)
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Reactions: 7
- Comments: 20 (5 by maintainers)
same issue here @ 2.2.6
Hi I’m using the 2.3.5-p2 commerce cloud version, I’m facing the same issue. is there any patch or solution for this? Thanks in adavnce
The changes are already in 2.2.4 but i receive same error when unassigned any product from root category. How i will solve this?
Hello @graffxdesign @inkobject @harshvardhanmalpani @koopjesboom @salehawal @tukker01 @AlexanderHuyghebaert @digvijay2017
First of all, thank you all for the feedback, comments and collaboration!
We have investigated this issue and defined:
The issue and the fix details
2.2.2– It was not in2.2.1: Link to Code – The fix appears starting from2.2.2: Link to CodeCurrent Situation
2.2.1– has been fixed in2.2.2- cannot be reproduced by testing scenarios –2.3.0- cannot be reproduced by testing scenarios, fixed –2.2-develop- cannot be reproduced by testing scenarios, fixed –2.3-develop- cannot be reproduced by testing scenarios, fixedAnd as result:
Solution
Based on all of mentioned above: The best solution it’s to create a new issue. With detailed information about how it can be reproduced on the clear/vanilla Magento versions(
2.2-developand2.3-develop)Unfortunately, I am not able to reproduce error that was mentioned in the comments and because of that cannot create a new issue by myself. And that is why we need you for help with it.
I suppose a proposed solution could make you sad. But it is the most efficient way to resolve it as quickly as possible rather than add comments to closed, more than a year ago, issue.
magento 2.2.4
Could not save product with position to category Unique constraint violation found
it accrues after trying to remove categories from a product