magento2.2.3 根据产品ID获取栏目名称的正确调用方式

  • 根据product_id 获取 category_ids :

        /**
         * @param $product_id
         * @return array
         */
        public function mc_getCategoryIds($product_id)
        {
    //       +++ get product the category id
            $registry = $this->mc_C[‘product‘];
            $getObj = $this->mc_get_obj($registry);
            /**
             * @var \Magento\Catalog\Model\Product $getObj
             * \Magento\Catalog\Model\Product
             */
            $product = $getObj->load($product_id);
    
            /**
             * @var \Magento\Catalog\Model\Product $product
             * \Magento\Catalog\Model\Product
             */
    
            return $product->getCategoryIds();
        }

  • 获取 category_name :

    /**
         * @param $product_id
         * @return mixed
         */
        public function mc_getCategoryName($product_id)
        {
            $cats = $this->mc_getCategoryIds($product_id);
            if(count($cats) ){
                $firstCategoryId = $cats[(count($cats)-1)];
                $registry = $this->mc_C[‘category‘];
                $getObj = $this->mc_get_obj($registry);
    
                /**
                 * @var \Magento\Catalog\Model\CategoryFactory $getObj
                 */
                $_category = $getObj->create();
                /**
                 * @var \Magento\Catalog\Model\CategoryFactory $_category
                 */
                $data = $_category->load($firstCategoryId);
                /**
                 * @var \Magento\Catalog\Model\CategoryFactory $data
                 */
                return $data->getName();
            }
            return 0;
        }

以上简单的调用了栏目的名称。

FAQ:

1,如果使用不正确的 CategoryFactory 类

  • ‘re_category_c‘=>\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory::class,//fixme This class \Magento\Catalog\Model\ResourceModel\Category\Collection
  • ‘re_category_f‘=>\Magento\Catalog\Model\ResourceModel\CategoryFactory::class,//fixme This class\Magento\Catalog\Model\ResourceModel\Category
  • ‘re_category‘=>\Magento\Catalog\Model\ResourceModel\Category::class,//fixme This  Catalog category model

  正确的是:\Magento\Catalog\Model\CategoryFactory

  ResourceModel 与 Model 的区别:

 

Models : Models are where your main business logic should be handled and is a single instance of an object. The model will use the resource model to talk to the database and get/set data for it on save() and load().

Resource Model : A resource model is where your main C.R.U.D happens (CreateReadUpdateand delete). The resource model shouldn’t contain business logic however it will talk to the adapters and basically talk to the database.

 

2,如果使用不正确的通用SQL : 

  SQL:

select value from catalog_product_entity_varchar left join eav_attribute on
    eav_attribute.attribute_id = catalog_product_entity_varchar.attribute_id
where
    eav_attribute.attribute_code=‘name‘ and
    catalog_product_entity_varchar.entity_id=2082

  CODE:

$_connection = $this->mc_get_obj(\Magento\Framework\App\ResourceConnection::class);//get class
            $db_connection = $_connection->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);//connection
            $category = $db_connection->fetchAll(‘select * from ‘.‘`catalog_product_entity_varchar` ‘.‘left join ‘.‘`eav_attribute` ‘.‘on ‘.
                ‘`eav_attribute`.‘.‘`attribute_id`=‘.‘`catalog_product_entity_varchar`.‘.‘`attribute_id` ‘.
                ‘where ‘.‘`eav_attribute`.‘.‘`attribute_code`=‘.‘"name" ‘.‘and ‘. ‘`catalog_product_entity_varchar`.‘.‘`entity_id`=‘.$vi[‘product_id‘]);

            var_dump($category[0][‘value‘]);die;

  

  正确的SQL: 
  

SELECT
  e.entity_id AS product_id
  , e.type_id AS product_type
  , e.sku,
  (
    SELECT
      GROUP_CONCAT(DISTINCT(cv.value))
    FROM
      catalog_category_entity_varchar AS cv, catalog_category_product AS at_category_id
    WHERE
      at_category_id.category_id = cv.entity_id
      AND (at_category_id.product_id = e.entity_id)
      AND cv.attribute_id = 41 and cv.store_id = 0
  ) AS category_name
FROM catalog_product_entity AS e where e.entity_id=2082;

原文地址:https://www.cnblogs.com/q1104460935/p/11237280.html

时间: 2024-11-10 07:19:52

magento2.2.3 根据产品ID获取栏目名称的正确调用方式的相关文章

织梦调用指定顶级栏目或当前子栏目名称的方法

有时候我们会在列表页或者内容详情页调用指定的顶级栏目名称及链接,试了很多方法,有的只能调用所有顶级栏目或者是该频道下面的子栏目,实在是让人感到费解..下面说说各种栏目名称的调用方法:  1.{dede:field name="typename"} 这是调用当前栏目的名称 2.{dede:channel type='son' row='5'} <a href="[field:typeurl/]">[field:typename/]</a> {/

dedecms提取某栏目及子栏目名称到首页怎么弄

我们建网站时有不同的需求,例如为页面创建一个栏目导航,用dedecms如何提取某栏目及子栏目名称和链接呢?如下图所示,先列出指定的顶级栏目,在下方再列出此栏目的所有子栏目. 之前ytkah说过dedecms调用当前栏目的子栏目怎么操作,我们可不可以发散一下思维进行扩展呢? 先列出指定的顶级栏目,以近视为例,typeid为8 {dede:type typeid='8'} <a href="[field:typeurl/]">[field:typename/]</a>

magento获取当前栏目ID号与栏目名称函数

Magento获取当前栏目ID:$_cat= new Mage_Catalog_Block_Navigation();$curent_cat= $_cat->getCurrentCategory();$curent_cat_id= $curent_cat->getId(); 或者Mage::registry('current_category')->getEntityId() Magento获取当前栏目名称: $category= Mage::registry('current_cate

dedecms获取顶级栏目名称、二级栏目名称实现方法 转

织梦DEDECMS文章.栏目页获取当前页面顶级栏目名称的方法 在用织梦做一些项目时,时常会碰到需要在当前页面调用顶级栏目名称的时候,织梦默认{dede:field name='typename' /} 可以获取当前栏目页上一级栏目的名称,而不是当前栏目顶级栏目名称. 下面拓展出一个方法来实现这个效果.: 在include/common.func.php的最下方加入: //获取顶级栏目名function GetTopTypename($id){   global $dsql;   $row = $

织梦dedecms 扩展channel栏目标签 获取交叉栏目名称和链接

channel栏目标签默认有调用顶级栏目(top).子栏目(son).同级栏目(self),那想获取交叉栏目的名称和链接怎么获取呢? 其实在原来的代码上改一下就可以了.下面是具体代码.打开文件channel.lib.php: 在搜索: $topid = $refObj->TypeLink->TypeInfos['topid']; 在其下方增加: $crossid = $refObj->TypeLink->TypeInfos['crossid']; 再搜索: $topid = $ro

wxid数据提取软件,微信号原始id获取方式解密

wxid数据提取软件,微信号原始id获取方式解密,很多企业及商户做微信营销都面临着一个非常关键问题,那就是如何精准加粉,也许你玩过群 发软件,玩过了加群好友软件,但是这些都没法满足精准化微信加人需求,一款可以在电脑上加手机号码通讯录好友的软件肯怕你都没听说过吧.人人有站顺势推出全新黑科技产品,微信爆粉软件,全网开售.一台电脑,无限多开加粉,无需微信登陆账号密码,无需扫码即可在软件上直接导粉.手机号码转换wxid软件,IOS协议微信爆粉精准营销系统.如果你是菜鸟,以下功能你可能看不懂.全看完你就懂

js中用tagname和id获取元素的3种方法

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>3种用tagname和id获取元素的方法</title> <style> body{     margin: 0; } ul{     margin: 0;     padding: 0;     list-style: none; } h1{

JavaScript通过ID获取元素坐标

JavaScript通过ID获取元素坐标 function getElementPos(elementId) { var ua = navigator.userAgent.toLowerCase(); var isOpera = (ua.indexOf('opera') != -1); var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof var el = document.getElementByIdx

根据进程ID获取进程路径

根据进程ID获取进程路径有两种方法:方法1:OpenProcess --> GetModuleFileNameEx方法2:OpenProcess --> EnumProcessModules --> GetModuleFileNameEx 注意事项:1.使用GetModuleFileNameEx()而不是GetModuleFileName()2.GetModuleFileNameEx()指定的hProcess需要PROCESS_QUERY_INFORMATION | PROCESS_VM