Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Magento中仅获取包含图像的类别?_Php_Magento - Fatal编程技术网

Php 如何在Magento中仅获取包含图像的类别?

Php 如何在Magento中仅获取包含图像的类别?,php,magento,Php,Magento,我在一个类别中有一个巨大的子类别列表。 打开该类别时,我只需要显示设置了图像的子类别。 是否有方法过滤类别集合以仅显示以下类别: 是指定类别ID的子级 设置图像 查看此以显示类别图像代替类别名称 <?php //gets all sub categories of parent category 'Brands' $cats = Mage::getModel('catalog/category')->load(6)->getChildren(); $c

我在一个类别中有一个巨大的子类别列表。 打开该类别时,我只需要显示设置了图像的子类别。 是否有方法过滤类别集合以仅显示以下类别:

  • 是指定类别ID的子级
  • 设置图像

查看此

以显示类别图像代替类别名称

<?php
    //gets all sub categories of parent category 'Brands'
    $cats = Mage::getModel('catalog/category')->load(6)->getChildren();
    $catIds = explode(',',$cats);

    $categories = array();
    foreach($catIds as $catId) {
        $category = Mage::getModel('catalog/category')->load($catId); 
        $categories[$category->getName()] = array(
            'url' => $category->getUrl(),
            'img' => $category->getImageUrl()
        );
    }

    ksort($categories, SORT_STRING);
?>
    <ul>
        <?php foreach($categories as $name => $data): ?>
            <li>
                <a href="<?php echo $data['url']; ?>" title="<?php echo $name; ?>">
                    <img class="cat-image" src="<?php echo $data['img']; ?>" />
                </a>
            </li>   
        <?php endforeach; ?>
    </ul>

Magento收藏与查询: 您可以使用Magento category_集合构建查询。Magento集合查询扩展了Zend查询,因此您可以使用Zend查询允许您使用的许多东西(或者您可以获取Zend查询并直接修改它)

Magento集合查询带来的一个很好的补充是,您可以按EAV属性进行过滤(它添加了所有必要的表连接以获取属性)

Magento集合的另一个很好的补充是,它从当前存储(如果可用)或默认存储中获取信息

答复: 在我们的例子中,
image
parent\u id
都只是
catalog\u category\u entity
表中的字段,它们不是EAV属性,因此我们可以使用
addFieldToFilter
。如果它们是EAV属性,我们应该使用
addAttributeToFilter

平桌: 还有一个问题是,当启用平面表时,这些查询如何工作?我不记得捕获的确切内容。例如,我刚刚使用
addAttributeToFilter('image'
)测试了这个查询,尽管
image
是一个字段而不是一个属性,但查询对我有效,因为我测试它的商店使用的是平面表(平面表中的属性转换为字段)

对服务器的影响: 有几个性能要素需要监控:

  • PHP和SQL之间的通信(单个查询的数量)
  • 单个查询的复杂性/效率/速度
  • PHP数据处理
  • PHP内存使用
  • HTML/CSS/JS/Images文件下载时间
  • HTML/CSS/JS/Images呈现时间
  • Magento还内置了一些性能增强功能:

  • 平面表和其他索引(减少EAV SQL查询的开销)降低了许多SQL查询的复杂性(减少了问题2的影响)
  • 缓存(文件缓存、memcached或其他)减少了单个SQL查询的数量以及大量PHP数据处理(减少了问题1和3的影响)
  • 合并并缩小CSS和JavaScript文件(减少问题5和6的影响)
  • 将图像大小从正常的完整大小调整为缩略图大小--这将减少下载大图像和将其渲染到小区域的工作量(还将减少第5和第6条问题的影响)

  • 您当前正在从一个类别获取所有产品--您的问题是如何获取类别。您想要什么产品或类别?我知道如何获取图像。我需要筛选没有图像的产品以减少服务器上的负载。@slimshaddyyy您正在运行一个SQL查询来检索当前类别和其他类别每个子类别的SQL查询。这只是浪费。@slimshaddyyy使用类别集合,并将所有类别筛选为当前类别ID或具有该类别ID的父类别,而您只使用了一个SQL查询。@slimshaddyyy您可以进一步筛选该查询,以检查该类别是否具有图像,甚至在lo之前将其作为Magento对象加载,不仅可以节省SQL查询,还可以节省PHP处理和内存。作为StackOverflow的“良好实践”,答案应该是自包含的。这意味着外部链接和资源应该用作“参考”或“进一步阅读”不是作为答案的主要内容。这是因为这个答案应该与任何未来的访问者相关,如果你的外部链接被破坏,答案将变得无用。这正是我一直在寻找的!谢谢!如果有很多子类别,这会减少对服务器的影响吗?“对服务器的影响”是一个松散的术语。在该类别的许多子类别中有许多产品。现在加载大约需要一分钟。如果其中只有10个有图像,我就用这种方法选择它们。你认为加载主类别会花费更少的时间吗?这是我的问题:)我提供的查询不会加载任何产品。因此,它不会改变加载产品所使用的资源数量。您认为加载需要1分钟是什么意思?从服务器接收完整响应需要1分钟(服务器时间)还是从服务器加载响应、呈现HTML/CSS和加载所有相关图像需要1分钟(浏览器时间)?
    $categories = Mage::getResourceModel('catalog/category_collection')
        ->addFieldToFilter('image', array('notnull' => true))
        ->addFieldToFilter('parent_id', $categoryId)
        ->setStoreId(2);