Questions tagged «best-practice»

表示与Magento中的最佳做法相关的问题。

3
Magento:更新产品属性的最快方法
我正在寻找质量属性更新的最快,最可靠的方法。下面是我知道的方法,但是我不知道应该使用哪种方法。 $store_id = 0; Mage::getSingleton('catalog/product_action')->updateAttributes( array($product_id), array('attribute_code' => $attribute_code), $store_id ); 要么 $product->setData($attribute_code, 1234); $product->getResource()->saveAttribute($product, $attribute_code);

1
如何在Magento 2中管理config.php
首先,这可能是一个已经回答的问题,但是我没有找到关于该主题的任何信息。 这不是问题,而是有关config.php在Magento 2中管理文件的最佳方式的问题。 实际上,我们config.php没有版本化(默认情况下,在M2 .gitignore文件中),因此它不在我们的存储库中。问题是,当有人安装项目时,他没有此文件,但他已经有数据库,因此无法运行bin/magento setup:install ...以生成文件。 我们知道,只有在文件存在的情况下,才能向其中bin/magento setup:upgrade添加未声明的模块,config.php并且bin/magento module:enable可以添加模块,但是我们希望避免在每次部署或安装项目时启动该模块。 我的问题(S): -我们必须删除config.php从.gitignore和版本呢? -我们是否必须在存储库中第一次添加它,然后再添加它.gitignore? -管理此文件的最佳方法是什么?

5
Magento2:修改CSS文件的最佳做法
我想修改css文件pub/static/frontend/Magento/luma/en_US/css/styles-l.css。 最初,此文件不存在于pub / static文件夹中,并且存在于 vendor/magento/theme-frontend-blank/web/css/styles-l.less (it's styles-l.less) 当我使用来分配静态内容时php bin/magento setup:static-content:deploy,会在pub / static中创建与之相关的2个文件。 1. pub/static/frontend/Magento/luma/en_US/css/styles-l.less 2. pub/static/frontend/Magento/luma/en_US/css/styles-l.css 我是一名支持开发人员,在开发模块时,我倾向于删除pub / static中存在的任何内容(.htaccess除外)。所以对我来说,直接修改似乎不是最好的选择pub/static/frontend/Magento/luma/en_US/css/styles-l.css。 在这种情况下,修改上述CSS文件的最佳做法是什么? 1.我应该修改pub/static/frontend/Magento/luma/en_US/css/styles-l.less还是 2.我的理解是错误的,因为我可以删除pub/static(在开发过程中)所有内容,因此我应该修改pub/static/frontend/Magento/luma/en_US/css/styles-l.css而不是删除它。

4
在phtml模板上实例化getModel类是否很好?
这是有关Magento中良好编程习惯的问题。 我需要在缩略图中显示(在类别产品列表中)该产品及其相关产品。所以我mypackage/mytheme/template/catalog/product/list.phtml用这样的东西编辑 <?php $related=$_product->getRelatedProductIds(); if(count($related)>0){ echo '<div class="a'.$ap.'"></div>'; echo '<div class="li_p"><ul>'; foreach($related as $rela){ $rela_nom=Mage::getModel('catalog/product')->load($rela); echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>'; } echo '</ul></div>'; } ?> 而且效果很好。 但是我的问题是:在phtml文件上实例化模型类是否正确? 如果不是,那么实现此功能的最佳方法是什么?我的意思是,哪个文件最好编辑,哪个类最好添加,在哪里?帮手 您能提供一个例子还是让我看看哪些文件最好编辑。

1
是否有充分的理由在两个try AND catch块中放入相同的代码?
在方法中的file:中app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Datetime.php,render()似乎在try和catch块中正在运行完全相同的代码。根本不处理异常。我很想知道写这样的代码的原因(如果有的话): try { $data = Mage::app()->getLocale() ->date($data, Varien_Date::DATETIME_INTERNAL_FORMAT)->toString($format); } catch (Exception $e) { $data = Mage::app()->getLocale() ->date($data, Varien_Date::DATETIME_INTERNAL_FORMAT)->toString($format); }

1
避免在大规模动作中循环保存
我创建了自己的CRUD模块,其中包含类似于CMS页面的内联编辑操作, 一切正常,但是以EcgM2标准运行phpsniffer时,出现以下警告: 在循环中检测到模型LSD方法save() 如何避免这种情况? 注意:如果我“嗅探”上面链接的核心文件,则会出现相同的警告。如果有人需要, 这是我的execute方法。但这与CMS页面控制器中的非常相似 public function execute() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->jsonFactory->create(); $error = false; $messages = []; $postItems = $this->getRequest()->getParam('items', []); if (!($this->getRequest()->getParam('isAjax') && count($postItems))) { return $resultJson->setData([ 'messages' => [__('Please correct the data sent.')], 'error' => true, ]); } foreach (array_keys($postItems) as …

3
如何在Magento 2中使用AJAX呈现HTML
我尝试在Magento 2中找到通过AJAX呈现HTML的最佳方法。 方法1:使用不带布局的控制器 文件 Foo/Bar/Controller/Popin/Content.php <?php namespace Foo\Bar\Controller\Popin; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; /** * Class Content */ class Content extends Action { /** * Content constructor. * * @param Context $context */ public function __construct( Context $context ) { parent::__construct($context); } /** * */ public function execute() { /** @var …

3
实现getExtensionAttributes()的正确方法
我想知道,实现可扩展EAV模型的正确方法是什么。 我在中看到Magento\Catalog\Model\Product该方法getExtensionAttributes()是这样实现的: public function getExtensionAttributes() { $extensionAttributes = $this->_getExtensionAttributes(); if (!$extensionAttributes) { return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface'); } return $extensionAttributes; } 但是在其他情况下,例如客户或类别模型 public function getExtensionAttributes() { return $this->_getExtensionAttributes(); } 如果以前未设置extension_attributes键,则可能导致结果为NULL。 务实的是,我希望第一个。这样Magento\Framework\Api\ExtensionAttributesInterface,即使模型刚刚实例化,我也始终可以确保获得的实例。 但是,为什么在其他模块中不使用它呢?是否与我们在客户模块中看到的新的数据模型分离背道而驰?如果是这样,我们应该如何初始化扩展属性?

4
加入产品属性的最佳实践
我有一个带有产品参考的自定义表product_id。现在,我想在后端网格中显示产品信息(SKU,名称),但是我不确定这样做的最佳实践是什么? 我的最佳猜测SKU如下: $collection->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') ) (来自 我的网格块类中方法的代码_prepareCollection() ) 但是产品名称呢?可以在catalog_product_entity_varchar中找到。我的理解是,如果您自己的资源模型和集合是基于的,Mage_Eav_Model_Entity_Collection_Abstract则可以很容易地获得它,因为这样您就可以使用joinAttribute。但是我的模型是基于一个简单的表并从扩展而来Mage_Core_Model_Resource_Db_Collection_Abstract,没有joinAttribute可用的方法。 那么在这种情况下获得产品名称的最佳方法是什么? 感谢您的时间和帮助:-) 更新: 更准确地说,我在谈论我的资源模型和集合。它与仅具有几个属性的简单平面表匹配,例如 entity_id product_id created_at user_id 我的意图是在后端显示一些统计数据: ProductSku Count(ProductSku) MAX(created_at) 据我所知,执行此操作的最佳方法是通过网格块类,而执行的方法是_prepareCollection()。 我的方法如下所示: protected function _prepareCollection() { // Get and set our collection for the grid $collection = Mage::getResourceModel($this->_getCollectionClass()); $collection ->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') …


3
心电图合规性:怎么办?
也有一些是像coding standard为Magento的1,称为ECG其中有大量的事情,应避免或不应该使用的方法。 让我们尝试创建一个列表,其中包含在代码中引发“错误”或“警告”的所有情况。 您将在下面找到所有可能的警告的列表。我会定期更新此帖子,并链接到给定和推荐的答案。 注意:请尽量避免重复的答案;) 下载:https : //github.com/magento-ecg/coding-standard 心电图闻 班级 的MySQL4 Mysql4类已过时。 重写资源模型时如何处理不推荐使用的“ Mysql4”类 将资源文件夹从Mysql4更改为Resource时,Magento 1.9模块奇怪地断开 对象实例化 在Magento中不建议使用直接对象实例化(类%s)。 protected $disallowedClassPrefixes = array( 'Mage_', 'Enterprise_', ); ... 的PHP 去 不鼓励使用goto。 ... 命名空间 未指定“'。$ exceptionClassName。'”类的命名空间。 ... 私人班级成员 检测到私人班级成员。 ... Var 检测到私人班级成员。 ... 性能 收款计数 不必要地加载了Magento数据集合。请改用getSize()方法。 如何检查集合中是否有物品? 全部提取 对于大型数据集,fetchAll()可能会使内存效率低下。 ... GetFirstItem getFirstItem()不会将集合加载的结果限制为一个项目。 GetFirstItem- …

3
Magento 1:性能优化以删除实体
我目前正在尝试改进有关性能的几个模块。 你们中有些人可能知道集合方法的用法,walk()这对于避免直接遍历产品非常有用。 最重要的是,感谢@Vinai,我们也可以使用collection delete()方法。 但是我注意到Magento 1本机文件并不总是使用这些方法中的任何一种进行删除。 一个我见过的最糟糕的代码是massDelete()从方法app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php,其中产品在删除之前的循环加载。 foreach ($productIds as $productId) { $product = Mage::getSingleton('catalog/product')->load($productId); Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product)); $product->delete(); } 因此,我进行了一些性能测试,添加了一些日志记录调用,以检查删除100个产品所花费的时间和内存使用情况。 测试1:walk方法 我用以下代码替换了上面粘贴的原始代码: $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->walk('delete'); 在我糟糕的开发服务器上的结果如下(基于10个测试的平均值): 原始代码:19.97秒,已使用15.84MB 自定义代码:17.12秒,已使用15.45MB 因此,对于100种产品的删除,我的自定义代码加快了3秒,而占用的内存少了0.4MB。 测试2:使用收集delete()方法 我用以下代码替换了原始代码: $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->delete(); 和记吹这里的结果: 原始代码:19.97秒,已使用15.84MB 自定义代码:1.24秒,已使用6.34MB 因此,对于100种产品的删除,我的自定义代码加快了18秒,而占用的内存减少了9MB。 如评论中所述,该方法似乎不会触发Magento事件(加载后,删除后),也不会触发索引/缓存刷新。 题 所以我的问题是:Magento核心团队为什么没有使用walk('delete')or事件更好的收集delete()方法而不是循环加载产品(我们都知道这是非常非常糟糕的做法)吗? 主要目标是在开发模块时要注意这些关键点:在某些特殊情况下,不能使用walk/收集delete()方法吗? …

2
如何正确禁用(模型)重写
有一个第三方扩展可以重写特定的Magento核心类。它是块,助手还是模型都没有关系,但在这种情况下,它是模型。现在我遇到这种重写是不好的,我想禁用它而不更改第三方扩展名。因此,我编写了一个依赖于第三方扩展的自定义扩展。禁用第三方重写的最佳方法是什么?我能想到的一个安全的方法是定义一个自定义重写,该自定义重写用于代替第三方重写: <global> <models> <custom_extension> <class>Custom_Extension_Model</class> </custom_extension> <mage_core> <rewrite> <sth>Custom_Extension_Model_Sth</sth> </rewrite> </mage_core> </models> </global> Sth.php,该类直接从Mage类扩展而来,因此禁用了第三方重写: class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth { } 这可行,但感觉不太好。考虑到观察者,可以通过将它们设置为来仅通过config.xml禁用它们disabled。通过重写是否可能发生这种情况?我尝试使用以下内容,并且可以正常工作: <global> <models> <mage_core> <rewrite> <sth></sth> </rewrite> </mage_core> </models> </global> 但是这样做安全吗?它适用于所有版本吗?我从来没有在野外看到过,这就是为什么我要问。

5
我应该将来自与我开发的扩展程序接口的第三方库的.php,.js,.html,.css文件放在哪里?
假设我要开发一个Magento扩展程序,该扩展程序可以与开放源代码图表程序包或图库或不属于该扩展程序本身的任何东西接口。下载(与扩展名分开)时,第三方库以其自己的单个.zip格式包含所有.php,.js,.html和.css。 我应该放在可怜的站点所有者上,谁希望将我的扩展程序与第3方lib一起安装,将原始第3方.zip分开并将它们放在.js在/ js中,.php在/ lib中的负担。 CSS在/皮肤等? 还是对于任何第3方.zip,都有一个公认的“垃圾场”,可以方便地按原样解压缩下载文件并完成它?

2
有模块时为什么要使用主题?
在我的自定义模块中,我添加了文件 Vendor/Theme/view/layout/default.xml 我正在使用自定义模块中的模板/块/布局来覆盖网站的许多全局模板。我还将附加我自己的全局样式,该样式存在于该view/web模块的目录中。 我应该为此使用主题吗?有一种设计模式优于另一种设计模式的理由吗?例如。用完app/design了app/code吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.