Questions tagged «model»

模型包含Magento模块中的大多数业务逻辑

4
抽象模型中不建议使用的保存和加载方法
我看到,在Magento的2回购的开发分支的方法load,并save从Magento\Framework\Model\AbstractModel阶级已被弃用。 但是核心中有大量的类可以扩展这个类并使用save和load。 在为实体的CRUD部分创建自己的模块时,我遵循与核心模块相同的准则。 但是,由于不赞成使用这些方法,所以我宁愿为将来做准备。 我应该用什么代替它们?还是我应该扩展其他内容?

3
如何在Magento 2中为自定义模块实施服务合同?
正如所看到的这篇文章:过时的保存和抽象模型load方法的save和load方法,Magento的2已被弃用发展分支。 因此,现在的优良作法是执行服务合同以处理CRUD实体。 为自定义模块实体实施服务合同时,我需要遵循哪些逐步过程? 注意:我知道我的CRUD模型中可能有成千上万种方法,我只是在要求以下明显的方法:http : //devdocs.magento.com/guides/v2.0/extension-dev-guide /service-contracts/design-patterns.html: get save getList delete deleteById

2
为了性能优化,可以绕过模型层的哪些部分
我目前看到的是,对于具有非常简单架构(大约5个字段)的数据库表,它以大约50次插入/秒的速率在我的本地开发环境(SSD驱动器)中插入新记录-这就是模型上没有观察者来填充关联表。 使用直接SQL,我看到了很大的改进-每秒大约1800次插入。我们正在考虑尝试优化模型的性能,但是我们当然不希望失去Magento核心为我们提供的所有出色的稳定性和灵活性。 我想知道是否有人以前走过这条路线,以及是否存在可以相对安全地绕过模型层的组件方面的轻松之举,从而可以显着提高性能。 像: 类名解析 保存事件之前和之后 活动派遣 交易次数 等等 更新:我撒谎,实际上有一些其他查询是从观察者或afterSave()触发的,当我检查数据库查询日志时会看到这些查询。使用Magento模型对一个完全简单的实体进行基准测试实际上可以使我获得〜300行/秒的速度-事务只有MySQL开销。

1
列名不明确的where子句冲突
对此有一点背景。我想扩展销售订单导出功能(通过网格)以具有更多列。我创建了一个模块,该模块添加了用于导出的新网格以及扩展原始模型的新集合模型。这使用_beforeLoad()函数,因此我可以联接所需的表。 我遇到的麻烦是,当添加了来自网格的过滤器(increment_id,订购日期等)时,此添加的where子句没有为表添加前缀,并且我遇到了列名不明确的问题。例如,在crement_id上,where子句中存在问题: SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table` LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id` 在连接到_addColumnFilterToCollection()函数中的其他表之前,添加了where子句。 protected function _addColumnFilterToCollection($column) { if ($this->getCollection()) { $field = ( $column->getFilterIndex() …
28 export  model 

3
有没有理由比服务合同更喜欢$ model-> load()?
我知道在Magento 2的模块之间工作的首选方法是使用服务合同。 因此,如果要加载产品,请使用产品存储库: $product = $productRepository->getById($id); 通过合同返回的实例Magento\Catalog\Api\Data\ProductInterface。 但是我也可以改用旧方法,直接调用域层: $product = $productFactory->create()->load($id); 在任何情况下这是必要还是有用的? devdocs说(突出显示): 一个模块可以直接调用另一个模块。在大多数情况下,不建议使用这种紧密耦合的解决方案,但有时是不可避免的。 [...] 您调用另一个模块的域层代码的策略在很大程度上取决于系统的独特配置和需求。 来源:http : //devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html 关于一个相关问题的评论说: 使用存储库将为您提供一个产品数据模型(Api/Data/Product),该模型是转换为精简DTO的产品模型。需要考虑的东西,因为它们完全不同 但据我所见,正常情况下对象是相同的,只是每个phpDoc的返回类型不同(Magento\Catalog\Api\Data\ProductInterface/ Magento\Catalog\Model\Product)

3
什么是Magento2中的IdentityInterface
我看到Magento 2中的许多模型都实现了Magento\Framework\DataObject\IdentityInterface。 该接口有一个称为getIdentities 的方法return [self::CACHE_TAG . '_' . $this->getId()];。该方法的实现通常返回。 可以在此处找到示例 这是做什么用的?

2
在Magento 2中加载自定义模型的最佳方法
由于我很难找到正确的方法,因此您可以在下面找到我制定的最佳实践。享受,如果需要,请更正我的英语,如果我是我,我就说我错了。:) 编辑: ...,我发现我在某些方面是错误的。因此,在Raphael的答案帮助我了解了更多信息之后,我更新了原始帖子。多亏他! 以下使用的概念: 如果您熟悉以下概念,将更容易理解以下代码和说明: 注入依赖性(因为$this->variable代码中的每个变量都被注入) 服务合同和资料库 厂 内容: 只是为了获得更多的上下文,假设我们有一个可以正确构造的模块: 包含方法的块类CustomBlock getCustomModel($id), 此方法根据在参数中传递的ID返回CustomModel对象, CustomModel类型对应于 \Vendor\Module\Model\CustomModel 此模型带有其资源模型(在中\Vendor\Module\Model\ResourceModel\CustomModel) 及其存储库(在中\Vendor\Module\Model\CustomModelRepository)。 问题: 让所有内容加载CustomModel对象的最佳实践是什么? 由于不建议使用load()此方法,因此不能使用CustomModel对象中的。 优良作法是您必须使用CustomModel服务合同。服务合同是数据接口(例如CustomModelInterface)和服务接口(例如CustomModelRepositoryInterface)。所以我的方块看起来像这样: / ** @var SlideRepositoryInterface * / 受保护的$ slideRepository; / ** * CustomBlock构造函数 * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / 公共功能__construct( ... CustomModelRepositoryInterface $ customModelRepository ... …

1
Magento 2中创建多对多关系的最佳实践方法是什么?
我环顾了核心,并看到了几个模型之间多对多关系的一些示例,但是我看不到对此的明确答案。 例如,假设我们创建了一个新模型,并且希望与现有产品表建立多对多关系。 因此,我们有了新的模型-库存商,我们这样创建了2个表,一个表用于存储库存商名称,另一个用于存储与产品的多对多关系。 安装程序类的截断版本: $table = $setup->getConnection() ->newTable($installer->getTable('stockist')) ->addColumn('stockist_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Stockist Id') ->addColumn('name', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, null, ['nullable' => false], 'Stockist Name'); $table = $installer->getConnection() ->newTable($installer->getTable('stockist_product')) ->addColumn( 'entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'nullable' => false, 'primary' => true], …

1
使用Zend Framework的SQL模型时的SQL注入漏洞
连接表时,我使用Zend Framework的SQL模型。例如,我修改了我的实际代码,但我想您会明白的: $this->getSelect()->join( array('sections' => $sectionsTableName), 'main_table.banner_id = pages.banner_id', array() ) ->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url) ->group('main_table.banner_id'); 该页面加载了ajax,并且$ section参数作为GET参数(www.example.com/controllerName/index/display/3?paremeter1=example&section=www.example2.com)发送。 如果有人执行以下操作,这就是问题所在: www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) 这样,用户可以转储整个数据库。不会显示数据,但是SQL仍会执行转储,这可能导致sql重载。 问题: 防止这种情况的最佳方法是什么? 现在,我为以前的客户感到担忧。使用此代码是否可以采取更大的风险措施,例如延迟或更改表?我猜不是因为您不能在SELECT中放入除SELECT之外的任何其他语句,所以DELETE将产生sql语法错误。我对吗? 更新: 我的示例不是对SQL注入的正确说明,因为存在'符号围绕$ sections,因此将无法进行注入。无论如何,当期望整数值并且不过滤整数输入时,这都是可能的。见下面我的评论。

3
高效的集合调用,筛选和加载
现在,我正在重用foreach循环中嵌套的许多集合。是否可以将这些内容上移几级?目前,Im不得不一遍又一遍地重新加载具有51k +个实体的集合,这大大降低了运行速度。特别是kitinventory集合。 <?php class Codespace_Module_Helper_Item extends other_one{ function functionOne($collection){ ... $data = $collection->getData(); foreach($data as $item){ $this->_functionTwo($item); } ... } function _functionTwo($item){ $model = Mage::getModel('catalog/product'); $id = $model->getIdBySku($item['sku']); $inventoryStatus = Mage::getResourceSingleton('catalog/product')->getAttributeRawValue($id, 'product_inventory_status', 1); $invStatus = $model->getResource()->getAttribute('product_inventory_status')->getSource()->getOptionText($inventoryStatus); if ($invStatus && $id) { if ($invStatus !== 'Z') { $stockItem = Mage::getModel('cataloginventory/stock_item'); $stockItem->setData(array()); …


4
Magento-自定义(非eav)模型,按多个字段加载
我有一个自定义模型和资源模型。我想使用多个字段来加载模型的单个实例。 该模型具有以下字段: id tag_name custom_name group_name 我想基于tag_name,custom_name和group_name而不是id加载此模型。 目前,我正在为每个字段使用集合和addFilter。这行得通,但我想知道Magento中是否有针对此类事物的标准策略? 编辑 核心magento在这种情况下似乎不使用集合,而是在资源模型中使用直接sql查询。 一个例子是: loadByAccountAndDate() 在 Mage_Paypal_Model_Resource_Report_Settlement 当收集似乎是更简洁的方式时,就编写的代码量而言,这是否有原因? 我只是不知道为什么magento选择这样做
15 collection  model 


1
使用Magento的ORM插入特定的ID字段
有没有一种方法可以使用Magento的简单ORM(Mage_Core_Model_Abstract和Mage_Core_Model_Resource_Abstract)插入具有特定主键的模型行? 例如,如果我针对空的Magento系统运行以下命令 Mage::getModel('core/website')->setData(array ( 'website_id' => 2, 'code' => 'foo', 'name' => 'Main Website', 'sort_order' => 0, 'default_group_id' => 1, 'is_default' => 1, )); 我希望表中有一个新条目core_website。但是,Magento在这里默默无闻。 深入研究资源,看来我在数据库资源类中对此感到不满 #File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) { //update stuff here } else { //insert stuff here } 因为模型有一个ID(即我要插入一个特定的ID),并且由于_useIsObjectNew将其硬编码为false,所以我的保存请求始终被路由到该insert路径。 有没有办法用默认的Magento型号强制插入?(无重写/类替换)。 是的,可以选择使用原始SQL,但是事件功能会丢失。
14 model 

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文件上实例化模型类是否正确? 如果不是,那么实现此功能的最佳方法是什么?我的意思是,哪个文件最好编辑,哪个类最好添加,在哪里?帮手 您能提供一个例子还是让我看看哪些文件最好编辑。

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.