คำถามติดแท็ก model

โมเดลประกอบด้วยตรรกะทางธุรกิจส่วนใหญ่ในโมดูล Magento

4
วิธีการบันทึกและโหลดที่ไม่สอดคล้องในรูปแบบนามธรรม
ฉันเห็นว่าในแผนกพัฒนาของ Magento 2 repo วิธีการloadและsaveจากMagento\Framework\Model\AbstractModelชั้นเรียนเลิกใช้แล้ว แต่มีการเรียนการ gazillion ในหลักที่ขยายชั้นนี้และใช้และsave เมื่อสร้างโมดูลของตัวเองสำหรับส่วน CRUD ของเอนทิตีของฉันฉันทำตามแนวทางเดียวกันกับที่เป็นโมดูลหลัก แต่เนื่องจากวิธีการเหล่านี้เลิกใช้แล้วฉันจึงควรเตรียมพร้อมสำหรับอนาคต ฉันควรใช้อะไรแทนพวกเขา หรือฉันควรขยายอย่างอื่น?load

3
วิธีการใช้สัญญาบริการสำหรับโมดูลที่กำหนดเองใน Magento 2
เท่าที่เห็นในโพสต์นี้: เลิกบันทึกและวิธีการโหลดนามธรรมรุ่นsaveและloadวิธีการเลิกใช้ในวีโอไอพี 2 พัฒนาสาขา ดังนั้นแนวปฏิบัติที่ดีในขณะนี้คือการใช้สัญญาบริการเพื่อจัดการกับหน่วยงาน CRUD กระบวนการทีละขั้นตอนที่ฉันต้องทำเพื่อใช้สัญญาบริการสำหรับหน่วยงานโมดูลที่กำหนดเองของฉันคืออะไร หมายเหตุ: ฉันรู้ว่าอาจมีหลายพันวิธีในรุ่น CRUD ของฉันฉันแค่ขอวิธีการที่ชัดเจนตามที่ระบุไว้ที่นี่: http://devdocs.magento.com/guides/v2.0/extension-dev-guide /service-contracts/design-patterns.html : get save getList delete deleteById

1
ความขัดแย้งในส่วนคำสั่งที่มีชื่อคอลัมน์ที่ไม่ชัดเจน
บริบทเล็กน้อยสำหรับสิ่งนี้ ฉันต้องการขยายฟังก์ชั่นการส่งออกคำสั่งขาย (ผ่านทางกริด) เพื่อให้มีคอลัมน์มากขึ้น ฉันได้สร้างโมดูลซึ่งเพิ่มกริดใหม่สำหรับการส่งออกและยังเป็นโมเดลคอลเลกชันใหม่ซึ่งขยายไปถึงต้นฉบับ นี่ใช้ฟังก์ชัน _beforeLoad () เพื่อให้ฉันสามารถเข้าร่วมตารางที่ฉันต้องการ ปัญหาที่ฉันมีอยู่คือเมื่อเพิ่มตัวกรองจากกริด (the increment_id, วันที่สั่งซื้อ ฯลฯ ), ส่วนคำสั่งที่เพิ่มนี้ไม่ได้ขึ้นหน้าตารางและฉันได้รับปัญหาเกี่ยวกับชื่อคอลัมน์ที่ไม่ชัดเจน ตัวอย่างเช่นวันที่ increment_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 …
28 export  model 

2
เลเยอร์ส่วนใดของโมเดลเลเยอร์สามารถถูกบายพาสเพื่อให้เกิดประโยชน์สูงสุดในการเพิ่มประสิทธิภาพ
ขณะนี้ฉันเห็นว่าสำหรับตารางฐานข้อมูลที่มีสคีมาง่าย ๆ (ประมาณ 5 ฟิลด์) มันเป็นการแทรกเร็กคอร์ดใหม่ด้วยอัตราที่ต่ำกว่า ~ 50 แทรก / วินาทีในสภาพแวดล้อมการพัฒนาท้องถิ่นของฉัน (ไดรฟ์ SSD) - ไม่มีผู้สังเกตการณ์ในรูปแบบการเติมตารางที่เกี่ยวข้อง การใช้ SQL โดยตรงฉันเห็นการปรับปรุงค่อนข้างดี - ประมาณ 1800 เม็ดต่อวินาที เรากำลังคิดเกี่ยวกับการพยายามเพิ่มประสิทธิภาพการทำงานของแบบจำลองของเรา แต่แน่นอนว่าเราไม่ต้องการสูญเสียความเสถียรและความยืดหยุ่นที่ดีซึ่งแกนหลักของวีโอไอพีให้เราทั้งหมด ฉันสงสัยว่ามีใครบางคนไปเส้นทางนี้มาก่อนหรือไม่และมีชัยชนะอย่างง่าย ๆ ในแง่ของส่วนประกอบของเลเยอร์โมเดลที่สามารถข้ามได้ค่อนข้างปลอดภัยซึ่งจะให้ประสิทธิภาพที่ดีขึ้นอย่างมาก สิ่งที่ชอบ: การจำแนกชื่อคลาส ก่อนและหลังบันทึกเหตุการณ์ เหตุการณ์ยื้อ การทำธุรกรรม เป็นต้น UPDATE: ฉันโกหกจริง ๆ แล้วมีข้อสงสัยเพิ่มเติมบางอย่างที่ทำให้ผู้สังเกตการณ์หรือ afterSave () ของที่ฉันเห็นเมื่อฉันตรวจสอบบันทึกการสืบค้นฐานข้อมูล การเปรียบเทียบกับเอนทิตี้เรียบง่ายจริง ๆ ให้ฉัน ~ 300 แถว / วินาทีกับรุ่น Magento - …

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
IdentityInterface ใน Magento2 คืออะไร
ฉันเห็นว่ามีโมเดลมากมายใน Magento 2 ที่ใช้งานMagento\Framework\DataObject\IdentityInterfaceได้ อินเตอร์เฟซนี้มีวิธีเดียวที่เรียกว่าการใช้งานของวิธีการที่มักจะกลับมาgetIdentities return [self::CACHE_TAG . '_' . $this->getId()]; ตัวอย่างสามารถพบได้ที่นี่ สิ่งนี้ใช้ทำอะไร?

2
วิธีที่ดีที่สุดในการโหลดโมเดลที่กำหนดเองใน Magento 2
เพราะมันยากสำหรับฉันที่จะหาวิธีที่ถูกต้องด้านล่างคุณจะได้พบกับแนวปฏิบัติที่ดีที่สุดที่ฉันสร้างขึ้นมา สนุกแก้ไขภาษาอังกฤษของฉันถ้าจำเป็นและบอกฉันฉันผิดถ้าฉันเป็น :) แก้ไข: ... และฉันพบว่าฉันผิดในบางแง่มุม ดังนั้นฉันจึงอัพเดทโพสต์ต้นฉบับหลังจากคำตอบของราฟาเอลช่วยให้ฉันเข้าใจมากขึ้น ขอบคุณเขา! แนวคิดที่ใช้ด้านล่าง : มันจะง่ายขึ้นสำหรับคุณที่จะเข้าใจรหัสและคำอธิบายด้านล่างหากคุณพอใจกับแนวคิดเหล่านี้: การฉีดขึ้นอยู่กับ (เป็นทุก ๆ $this->variableตัวแปรในรหัสจะถูกฉีด) สัญญาบริการและพื้นที่เก็บข้อมูล โรงงาน บริบท : เพื่อให้มีบริบทมากขึ้นลองจินตนาการว่าเรามีโมดูลที่สร้างอย่างถูกต้องด้วย: คลาสบล็อก CustomBlock ที่มีเมธอด getCustomModel($id) , เมธอดนี้ส่งคืนออบเจกต์ CustomModel โดยอิงจาก id ที่ส่งเป็น param ประเภท CustomModel สอดคล้องกับรูปแบบใน \Vendor\Module\Model\CustomModel โมเดลนี้มาพร้อมกับโมเดลทรัพยากร (ใน \Vendor\Module\Model\ResourceModel\CustomModel ) และด้วยที่เก็บ (ใน\Vendor\Module\Model\CustomModelRepository) คำถาม : แนวปฏิบัติที่ดีที่สุดในการปล่อยให้ทุกสิ่งโหลดวัตถุ CustomModel คืออะไร คุณไม่สามารถใช้load()จากวัตถุ CustomModel เนื่องจากวิธีนี้เลิกใช้แล้ว แนวปฏิบัติที่ดีบอกว่าคุณต้องใช้ …

1
อะไรคือวิธีปฏิบัติที่ดีที่สุดใน Magento 2 สำหรับการสร้างความสัมพันธ์แบบหลายต่อหลายคน?
ฉันดูรอบแกนกลางและเห็นตัวอย่างของความสัมพันธ์แบบหลายต่อหลายถึงหลายแบบ แต่ฉันไม่เห็นคำตอบที่ชัดเจนเกี่ยวกับเรื่องนี้ ตัวอย่างเช่นสมมติว่าเราสร้างโมเดลใหม่และเราต้องการมีความสัมพันธ์แบบหลายต่อหลายกับตารางผลิตภัณฑ์ที่มีอยู่ ดังนั้นเราจึงมี Model - Stockist ใหม่ของเราและเราสร้าง 2 ตารางดังกล่าวหนึ่งรายการเพื่อเก็บชื่อ Stockist และอีกรายการหนึ่งเพื่อจัดเก็บความสัมพันธ์แบบหลายต่อหลายกับผลิตภัณฑ์ คลาสการตั้งค่าที่ถูกตัดทอน: $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, …

1
SQL injections ช่องโหว่เมื่อใช้โมเดล SQL ของ Zend Framework
เมื่อเข้าร่วมตารางฉันใช้โมเดล SQL ของ Zend Framework เช่นฉันปรับเปลี่ยนรหัสจริงของฉัน แต่ฉันคิดว่าคุณจะได้รับคะแนน: $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 …

3
การรวบรวมการกรองและการโหลดที่มีประสิทธิภาพ
ตอนนี้ฉันกำลังใช้คอลเลกชันจำนวนมากที่ซ้อนกันอยู่ภายในลูปด้านหน้า เป็นไปได้ไหมที่จะย้ายสิ่งต่าง ๆ เหล่านี้ขึ้นมาสองสามระดับ? ปัจจุบันฉันถูกบังคับให้โหลดคอลเล็กชันที่มีเอนทิตี 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) { …

2
ทำไมคุณภาพเยี่ยมถึงใช้ทรัพยากรและการเก็บแบบจำลอง mysql4
จุดประสงค์ของการใช้ทั้งสองรุ่นนี้คืออะไร ทรัพยากร Mysql4 เหตุใดเราไม่สามารถใช้โมเดลทรัพยากรสำหรับคอลเลกชันทั้งหมด ทำไมเราใช้ MySql4 สำหรับโมดูลง่าย ๆ บางคนอธิบาย

4
Magento รุ่นที่กำหนดเอง (ไม่ใช่ eav), โหลดได้หลายช่อง
ฉันมีโมเดลที่กำหนดเองและโมเดลของทรัพยากร ฉันต้องการโหลดอินสแตนซ์เดียวของโมเดลโดยใช้มากกว่า 1 ฟิลด์ โมเดลมีฟิลด์ต่อไปนี้: id tag_name custom_name group_name ฉันต้องการโหลดโมเดลนี้โดยยึดตาม tag_name, custom_name และ group_name แทนที่จะเป็น id ขณะนี้ฉันกำลังใช้คอลเล็กชันและ addFilter สำหรับแต่ละฟิลด์ ใช้งานได้ แต่ฉันสงสัยว่ามีกลยุทธ์มาตรฐานสำหรับสิ่งประเภทนี้ใน Magento หรือไม่? แก้ไข Core magento ดูเหมือนจะไม่ใช้คอลเลกชันสำหรับสถานการณ์นี้ แต่ใช้การสอบถาม sql โดยตรงในโมเดลทรัพยากร ตัวอย่างของสิ่งนี้คือ: loadByAccountAndDate() ใน Mage_Paypal_Model_Resource_Report_Settlement มีเหตุผลสำหรับสิ่งนี้เมื่อคอลเลกชันดูเหมือนจะเป็นวิธีที่กระชับมากขึ้นในแง่ของจำนวนรหัสที่จะเขียน ฉันไม่รู้ว่าทำไมวีโอไอพีถึงเลือกทำแบบนี้
15 collection  model 


1
ใช้ ORM ของวีโอไอพีเพื่อแทรกฟิลด์ ID ที่ระบุ
มีวิธีใช้ ORM ( Mage_Core_Model_AbstractและMage_Core_Model_Resource_Abstract) แบบง่ายของ Magento เพื่อแทรกแถวแบบจำลองด้วยคีย์หลักที่เฉพาะเจาะจงหรือไม่ ตัวอย่างเช่นถ้าฉันวิ่งระบบต่อไปนี้กับระบบ 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ตาราง อย่างไรก็ตามวีโอไอพีไม่ได้ทำอะไรที่นี่อย่างเงียบ ๆ ขุดลงไปในทรัพยากรดูเหมือนว่าฉันตกหลุมนี้ในชั้นเรียนทรัพยากรฐานข้อมูล #File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) { //update stuff here } else …
14 model 

4
เป็นการดีที่จะยกตัวอย่างคลาส getModel บนเทมเพลต phtml หรือไม่?
นี่เป็นคำถามเกี่ยวกับวิธีปฏิบัติในการเขียนโปรแกรมที่ดีใน 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? ถ้าไม่ใช่จะเป็นวิธีที่ดีที่สุดในการบรรลุฟังก์ชั่นนี้? ฉันหมายถึงไฟล์ไหนดีกว่าที่จะแก้ไขหรือคลาสไหนดีกว่าที่จะเพิ่มที่ไหน ผู้ช่วยหรือไม่? คุณช่วยยกตัวอย่างเล็ก ๆ น้อย ๆ หรือให้ฉันดูไฟล์ที่ดีกว่าในการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.