Repository navigation
Cannot assign products to categories not under tree root #8970
Description
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: #7916)
Activity
tdgroot commentedon Jun 7, 2017
Would be great to hear what the core team has to say about this, because it's kind of an edgy case..
18 remaining items
sabl0r commentedon Sep 11, 2018
Still happens to me with magento 2.2.5
salehawal commentedon Oct 17, 2018
same issue here @ 2.2.4
tukker01 commentedon Oct 22, 2018
same issue here @ 2.2.6
AlexanderHuyghebaert commentedon Nov 29, 2018
Issue still persisting 2.2.4
digvijay2017 commentedon Jan 21, 2019
How can close this issue, even this issue already existing in magento 2.2.6.
sdzhepa commentedon Jan 23, 2019
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 in
2.2.1: Link to Code-- The fix appears starting from
2.2.2: Link to CodeCurrent Situation
-- the issue was reproducible in
2.2.1-- has been fixed in
2.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, fixed-- Cannot assign products to categories not under tree root #8970 (comment) by @inkobject
-- Cannot assign products to categories not under tree root #8970 (comment) by @harshvardhanmalpani
And 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.
Mrinza commentedon Aug 19, 2019
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?
inkobject commentedon Feb 21, 2020
@sdzhepa to continue the "respond to comments one year later" trend, thank you for your input. If it is of any use, I have since moved to different hosts and have made many changes to the environment. I have not seen the issue crop up since. I agree with your observation regarding my experience.
rtshshukla commentedon Jan 13, 2021
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
JMLucas96 commentedon Apr 15, 2021
Same issue on Magento2.3.6 CE...
ClintTec commentedon Feb 23, 2022
still happening on Magento 2.4.1p
Merge pull request #8970 from magento-gl/ACQE-6651_mainline_PR_deploy…
⏫ Forwardport of magento#11817 to 2.3-develop branch
Merge forwardport of magento#11817 to 2.3-develop branch
🔃 [EngCom] Public Pull Requests - 2.3-develop