如何将产品媒体库与收藏一起加载?

     2023-02-22     145

关键词:

【中文标题】如何将产品媒体库与收藏一起加载?【英文标题】:How to load products media gallery along with the collection? 【发布时间】:2011-08-19 12:31:10 【问题描述】:

谁能告诉我如何将产品的媒体库与收藏一起加载?

我得到这样的集合:

$collection = Mage::getModel('catalog/product')->getCollection()
                        ->addStoreFilter($storeId)
                        ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
foreach ($collection as $product) 
    var_dump($product->getMediaGalleryImages());

但 getMediaGalleryImages() 返回 null。我知道我可以使用 $product = Mage::getModel('catalog/product')->load($product->getId()) 单独加载每个产品,但我想避免这种情况,因为它会导致不必要的工作量。

【问题讨论】:

【参考方案1】:

如果有人正在寻找另一种方法,我发现这是可行的(仅在一种情况下,所以不能保证!):

请务必先执行$collection->addAttributeToSelect(’image’);,然后在循环收集产品时执行:

$attributes = $product->getTypeInstance(true)->getSetAttributes($product);
$media_gallery = $attributes[’media_gallery’];
$backend = $media_gallery->getBackend();
$backend->afterLoad($product); //this loads the media gallery to the product object

不确定所有这些是否有必要,但我很着急。在我的特殊情况下,我试图使用 $product->getImageUrl(); 获取图像 url,这种方法对我有用。

希望它可以帮助别人。

【讨论】:

关于性能的重要说明: afterLoad() 实际上非常快。获取 $backend 不是。 $backend 变量实际上应该对所有产品都相同,以便可以缓存。 根据 Alex 的评论,我们发现 getSetAttributes($product) 大约需要 50 毫秒才能加载。对我们来说这是一个问题,因为我们加载了许多产品,所以 50 毫秒很重要。如果您缓存(仅对第一个产品运行它们)前 3 行,而不仅仅是 getBackend 行,那么性能(至少对我们而言)会显着提高。【参考方案2】:

我最近也必须这样做,最快的方法:

class My_Module_Block_Name extends Mage_Catalog_Block_Product_View_Abstract


/** @var null|Mage_Catalog_Model_Resource_Eav_Attribute */
protected static $_mediaGalleryBackend = null;

public function getGalleryImages()

    $product = $this->getProduct();
    $this->_getBackend()->afterLoad($product);
    $collection = $product->getMediaGalleryImages();

    return $collection;



/**
 * @return Mage_Catalog_Model_Resource_Eav_Attribute
 */
protected function _getBackend() 
    if (self::$_mediaGalleryBackend === null) 

        $mediaGallery = Mage::getSingleton('eav/config')
            ->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'media_gallery');

        self::$_mediaGalleryBackend = $mediaGallery->getBackend();
    

    return self::$_mediaGalleryBackend;



【讨论】:

【参考方案3】:

试试这个

$collection = Mage::getModel('catalog/product')->getCollection()
                        ->addStoreFilter($storeId)
                        ->addAttributeToSelect(array('image', 'media_gallery'))
                        ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
foreach ($collection as $product) 
    var_dump($product->getMediaGallery());

【讨论】:

【参考方案4】:

可以直接在循环中使用:

foreach ($collection as $product) $product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product); foreach ($product->getMediaGalleryImages() as $image) var_dump($image->debug());

【讨论】:

【参考方案5】:

你将不得不使用:

// Returns the Media Gallery Images
Mage::getModel(’catalog/product’)->load(productid)->getMediaGalleryImages();

参考:http://www.magentocommerce.com/boards/viewthread/29639/

【讨论】:

它加载整个产品。是的,它有效,但需要大量时间和内存。 您推荐的解决方案是什么?【参考方案6】:

处理涉及产品的自定义集合时的秘诀是init 方法的第三个参数……至少对我来说是这样。 这样我就不需要加载整个产品并运行昂贵的查询

所以,拥有我的自定义 $product 代表 Mage_Catalog_Model_Product 的一个实例,但从我的自定义集合中,我可以这样做:

(string)Mage::helper('catalog/image')->init($product, 'small_image', $product->getImage())

我还需要将image 属性添加到我的自定义集合中,我通过添加->addAttributeToSelect(['image']) 来做到这一点。

您还可以相应地调整图像大小:

(string)Mage::helper('catalog/image')->init($product, 'small_image', $product->getImage())->resize($width, $height=null)

【讨论】:

【参考方案7】:

这是一个将媒体库添加到集合的函数:

// Source: http://www.magentocommerce.com/boards/viewthread/17414/#t141830

public function addMediaGalleryAttributeToCollection(Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection $_productCollection) 
    $_mediaGalleryAttributeId = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'media_gallery')->getAttributeId();
    $_read = Mage::getSingleton('core/resource')->getConnection('catalog_read');

    $_mediaGalleryData = $_read->fetchAll('
        SELECT
            main.entity_id, `main`.`value_id`, `main`.`value` AS `file`,
            `value`.`label`, `value`.`position`, `value`.`disabled`, `default_value`.`label` AS `label_default`,
            `default_value`.`position` AS `position_default`,
            `default_value`.`disabled` AS `disabled_default`
        FROM `catalog_product_entity_media_gallery` AS `main`
            LEFT JOIN `catalog_product_entity_media_gallery_value` AS `value`
                ON main.value_id=value.value_id AND value.store_id=' . Mage::app()->getStore()->getId() . '
            LEFT JOIN `catalog_product_entity_media_gallery_value` AS `default_value`
                ON main.value_id=default_value.value_id AND default_value.store_id=0
        WHERE (
            main.attribute_id = ' . $_read->quote($_mediaGalleryAttributeId) . ') 
            AND (main.entity_id IN (' . $_read->quote($_productCollection->getAllIds()) . '))
        ORDER BY IF(value.position IS NULL, default_value.position, value.position) ASC    
    ');

    $_mediaGalleryByProductId = array();
    foreach ($_mediaGalleryData as $_galleryImage) 
        $k = $_galleryImage['entity_id'];
        unset($_galleryImage['entity_id']);
        if (!isset($_mediaGalleryByProductId[$k])) 
            $_mediaGalleryByProductId[$k] = array();
        
        $_mediaGalleryByProductId[$k][] = $_galleryImage;
    
    unset($_mediaGalleryData);
    foreach ($_productCollection as &$_product) 
        $_productId = $_product->getData('entity_id');
        if (isset($_mediaGalleryByProductId[$_productId])) 
            $_product->setData('media_gallery', array('images' => $_mediaGalleryByProductId[$_productId]));
        
    
    unset($_mediaGalleryByProductId);

    return $_productCollection;

它的用法示例如下:

$products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*');
$this->addMediaGalleryToArray($products);

【讨论】:

web.archive.org/web/20120514004308/http://… @janw 那糟糕的 magento 本身呢?

如何将 Azure DevOps Git 存储库与 Azure 静态 Web 应用程序一起使用?

】如何将AzureDevOpsGit存储库与Azure静态Web应用程序一起使用?【英文标题】:HowtouseAzureDevOpsGitRepositorywithAzureStaticWebApp?【发布时间】:2021-05-1415:29:32【问题描述】:Azure有一个非常有用的新(ish)静态托管产品。这个想法是您可以... 查看详情

如何将这个 React 库与 React-Rails 一起使用

】如何将这个React库与React-Rails一起使用【英文标题】:HowcanIusethisReactlibrarywithReact-Rails【发布时间】:2015-07-0307:11:47【问题描述】:我遇到了这个:https://github.com/ssorallen/turbo-react而且我喜欢它的功能,我只是对如何在目前使用Re... 查看详情

如何将 maven 1 存储库与 maven 2 一起使用?

】如何将maven1存储库与maven2一起使用?【英文标题】:Howtouseamaven1repositorywithmaven2?【发布时间】:2011-08-2518:30:02【问题描述】:我在构建我的项目(使用maven2)时遇到问题,该项目引用了maven1存储库中的一些jar。场景:我的公司... 查看详情

如何将针对 Entity Framework .Net 4.6.1 的库与 .Net Core 应用程序一起使用

】如何将针对EntityFramework.Net4.6.1的库与.NetCore应用程序一起使用【英文标题】:HowtouselibrarytargetingEntityFramework.Net4.6.1with.NetCoreApplication【发布时间】:2018-11-0915:20:51【问题描述】:我有一个用于MVC应用程序的存储库。它运行良好... 查看详情

将 Java 库与 DB2 Java 存储过程捆绑在一起

...运行DataStudio,并在云实例中远程部署到我的DB2服务器。如何将jar与我的存储过程捆绑在一起?【问题讨论】:你 查看详情

将 Jackson JSON 库与骆驼一起使用时出现异常

】将JacksonJSON库与骆驼一起使用时出现异常【英文标题】:ExceptionusingJacksonJSONlibrarywithcamel【发布时间】:2014-03-0123:06:26【问题描述】:我在将JacksonJSON库与骆驼一起使用时遇到问题。例外是:FailedToCreateRouteException:Failedtocreateroute... 查看详情

Android 将 github 库与 maven 一起使用是不是安全

】Android将github库与maven一起使用是不是安全【英文标题】:AndroidisitsafetousegithublibrarieswithmavenAndroid将github库与maven一起使用是否安全【发布时间】:2017-01-1300:33:29【问题描述】:我正在使用带有AndroidStudio的Gradle构建系统,并且有... 查看详情

从 Magento 中的产品集合中获取产品媒体库图像

】从Magento中的产品集合中获取产品媒体库图像【英文标题】:GetProductMediaGalleryImagesfromaProductCollectioninMagento【发布时间】:2011-12-1423:49:09【问题描述】:我在Magento中有一系列产品,我希望能够从中获取媒体库图像。但是我发现... 查看详情

将任何活动指示器库与 Moya 一起使用

】将任何活动指示器库与Moya一起使用【英文标题】:UseanyActivityIndicatorlibrarywithMoya【发布时间】:2018-12-1713:23:05【问题描述】:我在我的iOS项目中使用MoyaNetworking。我做了一个具有以下方法的类:classUserAdapterstaticfuncgetUsers(amount:I... 查看详情

将公共 maven 存储库与 ivy 一起使用

】将公共maven存储库与ivy一起使用【英文标题】:Usepublicmavenrepositorywithivy【发布时间】:2011-06-1716:27:44【问题描述】:我有一个ivy.xml包含<dependencies><dependencyorg="commons-lang"name="commons-lang"rev="2.4"/><dependencyorg="foo-bar"name= 查看详情

将 C 库与 Cython 一起使用时出现错误

】将C库与Cython一起使用时出现错误【英文标题】:Igetanerror,whenusingC-librarywithCython【发布时间】:2019-11-1312:17:33【问题描述】:在QtCreator中,我创建了一个小库(在Python项目的“Squaring”子文件夹中):平方.h:intsquaring(inta);平方... 查看详情

将 Boost 库与 Borland C++ 命令行工具一起使用

】将Boost库与BorlandC++命令行工具一起使用【英文标题】:UsingBoostlibrarywithBorlandC++CommandLineTool【发布时间】:2014-04-2402:52:04【问题描述】:我在使用BorlandC++命令行工具(BorlandC++5.5.1forWin32)编译包含boost(1.55.0)的C++代码时遇到问题... 查看详情

如何将 .dll 库与 C++ VS 项目链接?

】如何将.dll库与C++VS项目链接?【英文标题】:Howtolink.dlllibrarywiththeC++VSproject?【发布时间】:2014-06-1008:42:52【问题描述】:我想在我的C++项目中将现有库(仅.dll,而不是.lib)与相应的头文件一起使用。我更改了这些设置:Projec... 查看详情

将 Laravel 存储库与数据表一起使用

】将Laravel存储库与数据表一起使用【英文标题】:UseLaravelrepositorieswithDatatables【发布时间】:2016-03-3018:53:43【问题描述】:在我的Laravel5.1.*项目中,我通过这个https://github.com/andersao/l5-repository库使用存储库。对于数据表,我使用... 查看详情

是否可以将 Material UI 库与 React Native 一起使用?

】是否可以将MaterialUI库与ReactNative一起使用?【英文标题】:IsitpossibletouseMaterialUIlibrarywithReactNative?【发布时间】:2020-08-0710:33:00【问题描述】:我已经使用react有一段时间了,我知道MaterialUIhttps://material-ui.com/是为react构建的UI库... 查看详情

我可以将使用 android 支持的库与 Androidx 项目一起使用吗?

】我可以将使用android支持的库与Androidx项目一起使用吗?【英文标题】:CanIuselibrarythatusedandroidsupportwithAndroidxprojects.【发布时间】:2019-02-0116:00:39【问题描述】:我知道,androidxandsupportdependencycausingmultidexerror我们不能同时使用and... 查看详情

将 golang S2 Geometry 库与 dynamodb 一起使用

】将golangS2Geometry库与dynamodb一起使用【英文标题】:UsinggolangS2Geometrylibrarywithdynamodb【发布时间】:2019-07-1222:28:06【问题描述】:我希望将dynamo-geo.js库的一部分移植到golang,以便查询到给定点的最近点(存储在DyanmoDB中)。radius... 查看详情

将 python2 库与 python3 一起使用

】将python2库与python3一起使用【英文标题】:Usingapython2librarywithpython3【发布时间】:2015-12-0314:11:48【问题描述】:我正在使用python3和geolite2,但是我发现我无法传入我想要查找的IP地址,并且出现以下错误。我已经尝试转换为utf-... 查看详情