Я пытаюсь получить для каждого продукта пути к категориям с именами и исключить корневую категорию (id 1). Я разделяю их с помощью
%%
Я использую этот код:
<?php
$categories = $product->getCategoryIds();
$categoryNames = array();
foreach($categories as $category){
$cat = $objectManager->create('Magento\Catalog\Model\Category')->load($category);
$categoryNames[] = $cat->getPath();
}
$categoryList = implode(' %% ', $categoryNames);
echo $categoryList;
Но вместо того, чтобы давать мне имена путей, он дает идентификаторы категорий, не удаляя корневую категорию:
1/3/1945 %% 1/3/1986/1995 %% 1/3/1986/1987 %% 1/3/1672 %% 1/3/2005/2032 %% 1/3/1672/1773/1774
Я не очень хорош в этом. Любая помощь, пожалуйста?






Чтобы получить имя категории и удалить корневой каталог, вы должны сделать это следующим образом.
С объяснением кода ниже
Получение идентификаторов категорий: извлекаются идентификаторы категорий, связанных с продуктом. Имена и пути категорий. Для каждой категории: ее путь получается и разбивается на отдельные идентификаторы категорий. Каждый идентификатор категории загружается (если еще не загружен), чтобы получить его имя. Имена категорий суммируются для формирования полного пути, исключая «Корневой каталог». Вывод: все пути к категориям объединяются с помощью %% и печатаются. Результатом является строка, в которой каждый путь к категории отображается в иерархическом порядке с разделением %%.
Надеюсь, это поможет, поскольку все ваши требования добавлены, и я удаляю корневого кота по имени, а не по идентификатору, поскольку оба служат этой цели.
$categories = $product->getCategoryIds();
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$catNames = [];
$processedCategories = [];
$categoryPaths = [];
foreach ($categories as $category) {
if (in_array($category, $processedCategories)) {
continue; // Skip already processed categories
}
$cat = $objectManager->create('Magento\Catalog\Model\Category')->load($category);
$pathParts = explode('/', $cat->getPath()); // Split the path into separate parts
$categoryPath = [];
foreach ($pathParts as $value) {
if (!isset($catNames[$value])) { // Load category only if not already loaded
$categoryModel = $objectManager->create('\Magento\Catalog\Model\CategoryFactory')->create()->load($value);
$catNames[$value] = $categoryModel->getName();
}
if ($catNames[$value] !== 'Root CART') { // Avoid adding 'Root Catalog' to the path
$categoryPath[] = $catNames[$value];
}
}
// Join the path with '>' and add it to the categoryPaths array
$categoryPaths[] = implode('>', $categoryPath);
$processedCategories = array_merge($processedCategories, $pathParts); // Mark categories as processed
}
// Join all category paths with '%%' and print
echo implode(' %% ', $categoryPaths);
@ГАРАНТИРОВАННАЯ ПОБЕДА. я обновил код с прикрепленным изображением результата
И снова ваш код не на 100% верен. Теперь пути есть, но корневая категория не удалена. Оно всегда Первое на пути. И в конце вы получите www. >Root CART>Cat1>Subcat1>Subcat1 %% >Root Cart>Cat1>Subcat1www
www удаляется и удаляется корневая категория по имени. Например, если имя вашей корневой категории — ROOT CART, вы можете соответствующим образом изменить этот фрагмент кода if ($catNames[$value] !== 'ROOT CART') { // Не добавлять «Корневой каталог» по пути $categoryPath[] = $catNames[$value]; }
код обновлен с учетом этих изменений 1. www удален 2. КОРНЕВАЯ КОРЗИНА удалена, если это имя вашей корневой категории.
Теперь работало. Я не обратил внимания на ваши комментарии и прошу прощения. Хотя, поскольку в каждом пути ваш код сначала добавлял «>», я добавил небольшое дополнение, чтобы удалить его. Спасибо
Напоминание: ответы, созданные с помощью инструментов искусственного интеллекта, не допускаются в Stack Overflow.
Не работает. ваш код возвращает и массив выглядит следующим образом:
Array ( [1] => empty [3] => Root Cat [45] => cat1 [265] => cat2 [287] => cat3 [1315] => cat4 [1326] => cat5 [1374] => cat6 [2005] => cat7 [2012] => cat8 )это неправильно. Также корневая категория (id=3) все еще существует. Суть в том, чтобы получить путь: cat1>subcat1>.....