คำถามติดแท็ก 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
วิธีจัดการ config.php ใน Magento 2
ก่อนอื่นอาจเป็นคำถามที่ตอบแล้ว แต่ฉันไม่พบอะไรเกี่ยวกับเรื่องนั้น มันไม่ใช่ปัญหา แต่เป็นคำถามเกี่ยวกับวิธีที่ดีที่สุดในการจัดการไฟล์config.phpใน Magento 2 ที่ จริงแล้วเราconfig.phpไม่ได้ทำเวอร์ชัน (ตามค่าเริ่มต้นใน.gitignoreไฟล์M2 ) ดังนั้นจึงไม่ได้อยู่ในที่เก็บของเรา ปัญหาคือเมื่อมีคนติดตั้งโครงการเขาไม่มีไฟล์นี้ แต่เขามีฐานข้อมูลอยู่แล้วเขาจึงไม่สามารถเรียกใช้bin/magento setup:install ...เพื่อสร้างไฟล์ได้ เราตระหนักดีว่าการbin/magento setup:upgradeเพิ่มโมดูลที่ไม่ได้ประกาศไว้นั้นจะเกิดขึ้นconfig.phpหากไฟล์นั้นมีอยู่และbin/magento module:enableสามารถเพิ่มโมดูลได้ แต่เราต้องการหลีกเลี่ยงการเปิดใช้งานทุกครั้งที่เราปรับใช้หรือติดตั้งโครงการ คำถามของฉัน (s): - เราจะต้องเอาconfig.phpจาก.gitignoreรุ่นมันได้หรือไม่ - เราจะต้องเพิ่มมันเป็นครั้งแรกในพื้นที่เก็บข้อมูลและปล่อยให้มันเป็นใน.gitignoreภายหลังหรือไม่? - วิธีที่ดีที่สุดในการจัดการไฟล์นี้คืออะไร?

5
Magento2: แนวทางปฏิบัติที่ดีที่สุดในการแก้ไขไฟล์ css
pub/static/frontend/Magento/luma/en_US/css/styles-l.cssฉันต้องการที่จะแก้ไขไฟล์ 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ไฟล์ 2 ไฟล์จะถูกสร้างขึ้นใน pub / static ที่เกี่ยวข้องกับมัน 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
เป็นการดีที่จะยกตัวอย่างคลาส 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? ถ้าไม่ใช่จะเป็นวิธีที่ดีที่สุดในการบรรลุฟังก์ชั่นนี้? ฉันหมายถึงไฟล์ไหนดีกว่าที่จะแก้ไขหรือคลาสไหนดีกว่าที่จะเพิ่มที่ไหน ผู้ช่วยหรือไม่? คุณช่วยยกตัวอย่างเล็ก ๆ น้อย ๆ หรือให้ฉันดูไฟล์ที่ดีกว่าในการแก้ไข

1
มีเหตุผลที่ดีที่จะใส่รหัสเดียวกันทั้งในลองและจับบล็อก?
ในไฟล์: 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 ทุกอย่างทำงานได้ดี แต่เมื่อใช้ phpsniffer กับมาตรฐาน EcgM2ฉันได้รับคำเตือนนี้: ตรวจพบเมธอด LSD รุ่น () ในลูป ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร หมายเหตุ: คำเตือนเดียวกันจะปรากฏขึ้นหากฉัน "ดมกลิ่น" ไฟล์หลักที่ลิงก์ด้านบน นี่คือ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 …

3
วิธีแสดง HTML ด้วย AJAX ใน Magento 2
ฉันพยายามค้นหาวิธีที่ดีที่สุดในการแสดง HTML ผ่าน AJAX ใน Magento 2 วิธีที่ 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); } /** * …

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(); } ซึ่งสามารถนำไปสู่ผลลัพธ์NULLถ้าคีย์extension_attributesไม่ได้ตั้งค่าก่อน ในทางปฏิบัติฉันต้องการคนแรก วิธีนี้ทำให้ฉันมั่นใจได้เสมอว่าจะได้รับอินสแตนซ์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) เท่าที่ผมรู้ว่า approch _prepareCollection()ดีที่สุดในการทำเช่นนี้จะผ่านชั้นตารางบล็อกและวิธีการที่จะไปมี วิธีการของฉันมีลักษณะเช่นนี้: protected function _prepareCollection() { // Get and set our collection for …

1
Magento 2 - ธุรกรรมฐานข้อมูลสำหรับวัตถุโมเดล / ทรัพยากรหลายรุ่น?
หากฉันมีลอจิกที่เกี่ยวข้องกับการอัปเดตวัตถุหลายรุ่นซึ่งจะอัปเดตบางตารางในฐานข้อมูลวิธีการทำธุรกรรมฐานข้อมูลเพื่อให้แน่ใจว่ามีความสมบูรณ์ของข้อมูล

3
การปฏิบัติตาม ECG: จะทำอย่างไร?
มีบางอย่างเช่นcoding standardสำหรับMagento 1 ที่เรียกว่าECGควรหลีกเลี่ยงสิ่งต่าง ๆ มากมายหรือวิธีการที่ไม่ควรใช้ ลองสร้างรายการที่ครอบคลุมทุกกรณีที่มีการโยน "ข้อผิดพลาด" หรือ "คำเตือน" ในรหัสของคุณ ด้านล่างคุณจะพบรายการพร้อมคำเตือนที่เป็นไปได้ทั้งหมด ฉันจะอัปเดตโพสต์นี้เป็นระยะและเชื่อมโยงไปยังคำตอบที่ได้รับและ upvoted หมายเหตุ:โปรดพยายามหลีกเลี่ยงคำตอบที่ซ้ำกัน;) ดาวน์โหลด: https://github.com/magento-ecg/coding-standard คลื่นไฟฟ้าหัวใจ Sniffs การเรียนการสอน Mysql4 คลาส Mysql4 ล้าสมัยแล้ว วิธีจัดการคลาส“ Mysql4” ที่เลิกใช้แล้วเมื่อเขียนโมเดลทรัพยากรใหม่ โมดูล Magento 1.9 ผิดปกติเมื่อเปลี่ยนโฟลเดอร์ทรัพยากรจาก Mysql4 เป็น Resource การเริ่มต้นวัตถุ การทำให้อินสแตนซ์ของวัตถุโดยตรง (คลาส% s) ไม่ได้รับการสนับสนุนใน Magento protected $disallowedClassPrefixes = array( 'Mage_', 'Enterprise_', ); ... PHP ไปที่ …

3
Magento 1: การปรับปรุงประสิทธิภาพเพื่อลบเอนทิตี
ฉันกำลังพยายามปรับปรุงสองโมดูลเกี่ยวกับประสิทธิภาพ บางท่านอาจรู้จักการใช้walk()วิธีการในการรวบรวมซึ่งมีประโยชน์มากในการหลีกเลี่ยงการวนซ้ำผ่านผลิตภัณฑ์โดยตรง ยิ่งไปกว่านั้นและขอบคุณ @Vinai เราสามารถใช้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'); และผลลัพธ์ของฉันมีดังต่อไปนี้บนเซิร์ฟเวอร์ dev ของฉันเส็งเคร็ง (โดยเฉลี่ยจากการทดสอบ 10 ครั้ง): รหัสเดิม: 19.97 วินาทีใช้ 15.84MB รหัสที่กำหนดเอง: …

2
วิธีการปิดใช้งานการเขียนซ้ำ (รุ่น) อย่างถูกต้อง
มีส่วนขยายของบุคคลที่สามซึ่งเขียนคลาส Magento core เฉพาะใหม่ มันไม่สำคัญว่าจะเป็นบล็อคตัวช่วยหรือโมเดล แต่ในกรณีนี้มันเป็นโมเดล ตอนนี้ฉันพบว่าการเขียนซ้ำนี้ไม่ดีและฉันต้องการปิดการใช้งานโดยไม่เปลี่ยนนามสกุลของบุคคลที่สาม ดังนั้นฉันเขียนส่วนขยายที่กำหนดเองซึ่งขึ้นอยู่กับส่วนขยายของบุคคลที่สาม วิธีที่ดีที่สุดในการปิดการใช้งานการเขียนซ้ำของบุคคลที่สามคืออะไร สิ่งที่ปลอดภัยที่ฉันคิดได้คือการกำหนดการเขียนซ้ำแบบกำหนดเองซึ่งใช้แทนการเขียนโดยบุคคลที่สาม: <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 จาก lib บุคคลที่สามที่เชื่อมต่อกับส่วนขยายที่ฉันพัฒนาได้อย่างไร
สมมติว่าฉันต้องการพัฒนาส่วนขยายของวีโอไอพีที่เชื่อมต่อกับแพคเกจการสร้างแผนภูมิโอเพนซอร์สหรือแกลเลอรี่ภาพหรือสิ่งที่ไม่ได้เป็นส่วนหนึ่งของส่วนขยายนั้น เมื่อดาวน์โหลด (แยกต่างหากจากส่วนขยาย) lib ของบุคคลที่สามจะมาพร้อมกับ. zip เดี่ยวพร้อมด้วย. php, .js, .html และ. css ทั้งหมด ฉันจะวางบนเจ้าของไซต์ที่ไม่ดีที่ประสงค์จะติดตั้งส่วนขยายของฉันร่วมกับ lib ของบุคคลที่สามภาระในการดึงบุคคลที่สามที่เป็นต้นฉบับ. zip และทำให้พวกเขาวาง. js ใน / js, .php in / lib, CSS ใน / ผิวหนัง ฯลฯ ? หรือมี "พื้นที่การทุ่มตลาด" ที่ยอมรับกันทั่วไปสำหรับไฟล์. zip ของบุคคลที่สามที่หนึ่งสามารถคลายการดาวน์โหลดตามที่สะดวกและทำได้ด้วยหรือไม่

2
ทำไมต้องใช้ชุดรูปแบบเมื่อคุณมีโมดูล?
ภายในโมดูลที่กำหนดเองของฉันฉันได้เพิ่มไฟล์ Vendor/Theme/view/layout/default.xml ซึ่งฉันใช้เพื่อแทนที่ templating ทั่วโลกของไซต์จำนวนมากด้วยเทมเพลต / บล็อก / เลย์เอาต์จากโมดูลที่กำหนดเอง ฉันกำลังแนบสไตล์ของตัวเองทั่วโลกที่มีอยู่ในview/webไดเรกทอรีในโมดูลนั้น ฉันควรจะใช้ชุดรูปแบบสำหรับสิ่งนี้แทนหรือไม่? มีข้อโต้แย้งที่ดีสำหรับรูปแบบการออกแบบหนึ่งมากกว่าอีกรูปแบบหนึ่งหรือไม่? เช่น. ใช้app/designมากกว่าapp/codeหรือไม่

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