Получить ID категории по ID продукта в OpenCart

4 мин. на чтение

Довольно распространенной задачей при программировании для OpenCart является получение родительской категории текущего товара.

Как правило такая задача возникает, если вы хотите распространить какое-то свойство на все товары определенной категории.

К сожалению, в обычном OpenCart такого готового метода нет, поэтому в сети часто можно встретить различные ухищрения, например такой: разобрать $this->requet->get['path'] на path_id с помощью встроенного в PHP метода explode() и взять последний элемент из полученного массива. Как костыль это может и сойдет, но в целом не сколько не эстетично.

При таком решении коса на камень начнет находить в том случае, когда Вам придется дорабатывать уже работающий интернет-магазин с включенным SEO ЧПУ.

Мое субъективное мнение, что получать текущую категорию товара лучше всего из Модели, а не путем каких-то сравнений и нарезаний в Контроллере. Если посмотреть в таблицу product_to_category, там связи видны как на ладони без каких-либо дополнительных SQL LEFT JOIN:

На моем скриншоте так же присутствует колонка main_category, которую вы можете не обнаружить в своей таблице если используете чистый OpenCart 2+. Я люблю сборку ocStore, что для нашей задачи не принципиально.

Так вот, задачу получения ID категории по ID товара очень элегантно решили ребята из команды ocStore, за что им реально большое спасибо. Они просто добавили в модель административной части catalog/product еще один метод:

public function getProductMainCategoryId($product_id) {
 $query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "' AND main_category = '1' LIMIT 1");

return ($query->num_rows ? (int)$query->row['category_id'] : 0);
}

В ocStore есть прекрасная функция «Главная категория», она позволяет избавится от массы SEO дублей карточки товара, т.к. устанавливает фактически единственный путь к товару через жесткую привязку к 1-й главной категории, при этом вы можете спокойной привязывать товар к любому количеству других категорий.

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

$categories = explode(',', $this->model_catalog_product->getProductCategories($this->request->get['product_id']);
$currect_category = 100; // Тут вы можете задать ручками ID категории или вместо этого использовать какой-то метод для получения ее ID
if (in_array($currect_category, $categories)){
 // Your script
 } else {
 // Your script if not product related with any categories
 }

Как видите, ничего особенно в проделанном методе нет, он прост и эффективен.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.