Magento 2 получает имена путей к категориям из продукта

Я пытаюсь получить для каждого продукта пути к категориям с именами и исключить корневую категорию (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

Я не очень хорош в этом. Любая помощь, пожалуйста?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить имя категории и удалить корневой каталог, вы должны сделать это следующим образом.

С объяснением кода ниже

Получение идентификаторов категорий: извлекаются идентификаторы категорий, связанных с продуктом. Имена и пути категорий. Для каждой категории: ее путь получается и разбивается на отдельные идентификаторы категорий. Каждый идентификатор категории загружается (если еще не загружен), чтобы получить его имя. Имена категорий суммируются для формирования полного пути, исключая «Корневой каталог». Вывод: все пути к категориям объединяются с помощью %% и печатаются. Результатом является строка, в которой каждый путь к категории отображается в иерархическом порядке с разделением %%.

Надеюсь, это поможет, поскольку все ваши требования добавлены, и я удаляю корневого кота по имени, а не по идентификатору, поскольку оба служат этой цели.

        $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);

Не работает. ваш код возвращает и массив выглядит следующим образом: 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>.....

G. G. 21.05.2024 00:11

@ГАРАНТИРОВАННАЯ ПОБЕДА. я обновил код с прикрепленным изображением результата

Kareem k 21.05.2024 07:30

И снова ваш код не на 100% верен. Теперь пути есть, но корневая категория не удалена. Оно всегда Первое на пути. И в конце вы получите www. >Root CART>Cat1>Subcat1>Subcat1 %% >Root Cart>Cat1>Subcat1www

G. G. 21.05.2024 20:05

www удаляется и удаляется корневая категория по имени. Например, если имя вашей корневой категории — ROOT CART, вы можете соответствующим образом изменить этот фрагмент кода if ($catNames[$value] !== 'ROOT CART') { // Не добавлять «Корневой каталог» по пути $categoryPath[] = $catNames[$value]; }

Kareem k 22.05.2024 06:21

код обновлен с учетом этих изменений 1. www удален 2. КОРНЕВАЯ КОРЗИНА удалена, если это имя вашей корневой категории.

Kareem k 22.05.2024 06:25

Теперь работало. Я не обратил внимания на ваши комментарии и прошу прощения. Хотя, поскольку в каждом пути ваш код сначала добавлял «>», я добавил небольшое дополнение, чтобы удалить его. Спасибо

G. G. 22.05.2024 20:43

Напоминание: ответы, созданные с помощью инструментов искусственного интеллекта, не допускаются в Stack Overflow.

miken32 23.05.2024 17:50

Другие вопросы по теме