Làm thế nào để viết một phần mở rộng tùy chỉnh?


143

Bởi vì gần đây tôi có rất nhiều vấn đề với tiện ích mở rộng miễn phí và thương mại, tôi đã quyết định đặt câu hỏi này và trả lời nó bằng các bước tôi thường làm khi viết tiện ích mở rộng. Hãy thoải mái chỉnh sửa câu trả lời hoặc thêm một câu hỏi mới.
Trong hầu hết các trường hợp khi cài đặt tiện ích mở rộng hoặc chủ đề tôi phải dành vài giờ (đôi khi nhiều hơn, đôi khi ít hơn) để làm cho nó hoạt động trên tất cả các môi trường tôi cần:

  • dev: thường là localhostnơi dự án nằm trong thư mục con
  • tiền sản xuất và sống

Điều này đã xảy ra ngay cả với các tiện ích mở rộng từ các nhà cung cấp tiện ích mở rộng lớn (ít nhất vẫn không có tên cho đến khi tôi thực sự nổi điên và thêm tên của họ vào đây)
Vì vậy, câu hỏi chính là ... tôi nên xem xét các bước khi viết tiện ích mở rộng để đảm bảo chất lượng của mã và làm cho một người kỹ thuật và phi kỹ thuật dễ dàng sử dụng nó hơn và cho một người kỹ thuật để thay đổi nó?


11
Có vẻ như một trong những nhà cung cấp tiện ích mở rộng lớn không thích câu hỏi này và đã đánh giá thấp nó. :)
Marius

1
Cá nhân, tuyệt đối không có thử nghiệm với Wyomind, nhưng họ mã hóa mã của họ và vẫn là "đối tác cao cấp" :( (chẳng hạn)
sv3n

Câu trả lời:


186

Đây là những gì tôi thường làm:

  1. Luôn luôn phát triển với error_reporting.
  2. Luôn luôn phát triển với isDeveloperModethiết lập để true. Chỉ cần thêm SetEnv MAGE_IS_DEVELOPER_MODE 1vào httpd.conftệp của bạn (hoặc tệp tương ứng cho Nginx hoặc một cái gì đó khác)
  3. Nếu tiện ích mở rộng được liên kết với chức năng cốt lõi, hãy thêm phần phụ thuộc vào tệp khai báo <depends><Mage_Catalog /></depend>
  4. Nếu mô-đun dành cho cộng đồng sử dụng, hãy sử dụng communitylàm codepool để cung cấp cho các nhà phát triển cơ hội ghi đè một số lớp mà không sửa đổi mã trực tiếp
  5. Đặt các tệp thiết kế lối vào của bạn app/design/frontend/base/default để làm cho chúng có sẵn cho tất cả các chủ đề.
  6. Đặt tệp thiết kế quản trị của bạn vào app/design/adminhtml/default/defaultvà không thay đổi chủ đề quản trị viên. Tôi có thể muốn thay đổi nó trong một trong các mô-đun của tôi.
  7. Tiền tố tên tập tin bố trí của bạn và tên thư mục mẫu với tên công ty để dễ dàng cách ly chúng hơn. easylife_articles.xmlapp/design/.../easylife_articles
  8. Đặt tài nguyên tĩnh của bạn (JavaScript, CSS và hình ảnh) vào một thư mục tương tự như các tệp mẫu easylife_articles/images/doh.png
  9. Đính kèm một tệp văn bản đơn giản với cách gỡ cài đặt tiện ích mở rộng: Những tệp nào cần được xóa, những bảng nào cần được loại bỏ, những cài đặt cấu hình nào cần được xóa khỏi core_config_databảng.
  10. Không viết các truy vấn trực tiếp trong các mô hình, khối hoặc người trợ giúp, hãy sử dụng mô hình tài nguyên cho điều đó.
  11. Không viết truy vấn bằng cách sử dụng tên bảng trực tiếp Select * from sales_flat_order where .... Sử dụng a Zend_Selectvà biến đổi tên bảng bằng cách sử dụng ->getTable('sales/order').
  12. Sử dụng url cơ sở để bao gồm jscác tệp trong mẫu. Sai <script type="text/javascript" src="../js/some.js"></script> . Đúng <script type="text/javascript" src="<?php echo Mage::getBaseUrl('js').'some.js'?>"></script>
  13. Không viết lại các lớp trừ khi cần thiết. Sử dụng các trình quan sát và nếu không thể sử dụng các phương thức của trình trợ giúp nhận làm tham số và thể hiện của một lớp mà bạn muốn ghi đè. Sai : Ghi đè Mage_Catalog_Model_Productđể thêm phương thức getProductArticles(). Phải rồi . Trong trợ giúp của bạn thêm getProductArticles(Mage_Catalog_Model_Product $product)
  14. Nếu bạn ghi đè các lớp, hãy đặt một danh sách của chúng trong một readme.txttệp
  15. Sử dụng đường dẫn quản trị mặc định cho phần quản trị của mô-đun. URL quản trị sai articles/adminhtml_articles/index . URL quản trị viên phải admin/articles/index
  16. Thêm ACL cho phần quản trị của bạn. Tôi có thể muốn hạn chế quyền truy cập vào một số quản trị viên.
  17. Không thêm khung JavaScript khác (jQuery, MooTools, v.v.) nếu không cần thiết. Viết mã cho bạn trong nguyên mẫu.
  18. Làm cho bạn mẫu HTML W3C hợp lệ (cái này dành cho các nhà phát triển OCD như tôi).
  19. Không đặt hình ảnh trong mediathư mục. Sử dụng skin. Các media thư mục thường được không phiên bản và điều này làm cho nó khó khăn hơn để di chuyển các trang web để các môi trường khác nhau.
  20. Kiểm tra phần mở rộng của bạn với danh mục phẳng và tắt. Để không tăng gấp đôi thời gian phát triển, hãy sử dụng Chaos Monkey .
  21. Kiểm tra phần mở rộng của bạn với bộ đệm onvà bộ đệm off.
  22. Tránh sử dụng chữ hoa trong tên mô-đun và tên lớp. Nếu không được kiểm tra đúng cách, điều này có thể gây ra sự cố trên các hệ điều hành khác nhau. Đây là một khuyến nghị, không phải là "phải".
  23. Gửi các sự kiện trong mã của bạn để giúp các nhà phát triển dễ dàng thay đổi chức năng hơn.
  24. Thực hiện theo các tiêu chuẩn mã hóa tương tự mà Magento sử dụng và nhận xét mã của bạn.
  25. Không sử dụng các thẻ ngắn PHP ( <? $this->doSomething() ?>). Sử dụng thẻ đầy đủ ( <?php $this->doSomething()?>). Cũng không sử dụng thẻ echo ngắn. ( <?="D'oh";?>). Sử dụng ( <?php echo "D'oh";?>)
  26. Dịch văn bản của bạn bằng cách sử dụng $this->__và thêm tệp dịch ngôn ngữ với văn bản của bạn ( app/local/en_US/Easylife_Articles.csv) ít nhất là cho en_USngôn ngữ. Không phải tất cả các trang web được xây dựng bằng tiếng Anh và việc xác định các văn bản để dịch là tốn thời gian.
  27. Nếu bạn bán một đề nghị mở rộng ít nhất là hỗ trợ cơ bản. Hoặc ít nhất là trả lời các e-mail hỗ trợ mà bạn nhận được.
  28. Không thực hiện cuộc gọi liên tục đến máy chủ của bạn thông qua tiện ích mở rộng để xác thực giấy phép. Một lần, lúc cài đặt là quá đủ (tôi cũng không thích cách tiếp cận này, nhưng tốt hơn là thực hiện cuộc gọi mọi lúc). (Lấy cảm hứng từ câu hỏi này )
  29. Phát triển với nhật ký được kích hoạt và thỉnh thoảng hãy xem var/log/system.logtệp. Các lỗi được liệt kê ở đây không được hiển thị ngay cả khi bật chế độ nhà phát triển. Nếu có ít nhất một lỗi, bạn sẽ có một tệp nhật ký lớn sau một vài tháng chạy tiện ích mở rộng.
  30. Nếu tiện ích mở rộng của bạn ảnh hưởng đến quá trình thanh toán hoặc đơn hàng theo một cách nào đó, hãy đảm bảo rằng tiện ích này hoạt động với đa vận chuyển hoặc nếu nó không hoạt động với đa vận chuyển, hãy đảm bảo rằng nó không ảnh hưởng đến nó.
  31. Không thay thế thanh Thông báo quản trị mặc định (hoặc URL nguồn cấp dữ liệu). Nếu tôi quan tâm đến những gì bạn cung cấp, tôi sẽ đăng ký nhận bản tin của bạn. Hãy để tôi xem Magento nói gì. Nó quan trọng hơn với tôi.
  32. Nếu bạn mã hóa các tệp mã của mình bằng Ioncube (hoặc một cái gì đó khác) ... tốt ... tôi chỉ ghét bạn và tôi hy vọng doanh nghiệp của bạn phá sản

Đó là những gì cho đến nay. Tôi sẽ thêm nhiều hơn ngay khi tôi nghĩ về một cái gì đó khác.


Tôi đồng ý với bạn, đó chắc chắn là một khởi đầu tốt. Chắc chắn, bạn cũng sẽ hiểu rằng không phải lúc nào cũng có thể bao gồm tất cả các loại cấu hình và sự cố khác nhau, ít nhất là nó sẽ làm giảm loại có thể. Hầu hết các vấn đề tôi gặp với các tiện ích mở rộng khác hoặc mọi người gặp gỡ với tôi là do xung đột với ghi đè.
Sylvain Rayé

2
@ Marius, chắc chắn 1+ từ tôi. Nó bao gồm hầu hết các trường hợp và kịch bản những gì chúng ta đang phải đối mặt trong quá trình phát triển.
liyakat

4
@ColinM. Trước hết, thật vinh dự khi có bình luận của bạn ở đây. :). Tôi đồng ý có một sự khác biệt, tôi sẽ sửa đổi câu trả lời, nhưng tôi vẫn nghĩ rằng cả hai nên tránh, ít nhất là cho đến khi PHP 5.3 trở thành "PHP 4 mới". Tôi có nghĩa là nó vẫn được sử dụng trên quy mô lớn.
Marius

4
@Marius, điểm của bạn rất hữu ích. Cho đến khi tôi tập trung nghiêm túc vào từng điểm, nhưng ở số 32 tôi chỉ cười lớn. +1 đặc biệt cho điểm # 32
MTM

1
If you encrypt your code files with Ioncube (or something else)...well...I just hate you and I hope your business goes bankruptTôi cảm thấy như vậy. Có một số công ty không cung cấp phiên bản cập nhật, bạn sẽ phải trả tiền cho họ, điều đó thực sự làm tôi bực mình và không hiểu tại sao họ lại muốn bán cùng một sản phẩm (để kiếm tiền? Rõ ràng). Tôi không mua sản phẩm của họ nữa. Bạn biết tôi nói về ai.
Adarsh ​​Khatri

31

Tôi là một fan hâm mộ lớn của việc sử dụng modman để tôi có thể phát triển và kiểm soát nguồn chỉ phần mở rộng của mình và giữ nguyên các tệp và cấu trúc thư mục. Nó cũng làm cho thử nghiệm trên các cài đặt khác nhau chạy trơn tru hơn.

Ồ và một mẹo lớn luôn cố gắng cài đặt tiện ích mở rộng được đóng gói cục bộ của bạn trên bản cài đặt magento sạch trước khi tải nó lên Magento Connect, tôi đã bỏ lỡ các tệp rất nhiều lần trong trình quản lý gói.


3
Cuộc gọi tốt về 'cài đặt tiện ích mở rộng đóng gói của bạn tại địa phương'. Tôi nghĩ điều này nằm trong danh mục: 'Thử nghiệm phần mở rộng chết tiệt của bạn từ trên xuống dưới'.
Marius

Tôi cũng đã bị bắt bởi điều này trước đây. Hãy chắc chắn rằng bạn đã kiểm tra gói trên bản cài đặt sạch không giống với gói bạn đã đóng gói!
Joseph Leedy

22

Andreas von Studnitz và Tiến sĩ Nikolai Krambrock đã trình bày tốt về chất lượng mã trên Meet Magento DE 2014. Họ phân biệt giữa chất lượng mã chung và chất lượng mã cụ thể của Magento. Tóm lại, có các quy tắc chung sau:

  • Việc sử dụng các thành phần cấu trúc - giống như các lớp và phương thức - nên được sắp xếp ở giữa các lớp. Những yếu tố của cấu trúc chỉ có ý nghĩa khi chúng được sử dụng để cấu trúc. Do đó, chúng phải có kích thước trung bình. Nó được coi là sử dụng 100-200 dòng mã cho các lớp và 3-20 dòng mã cho các phương thức.
  • Do sử dụng "if" hoặc "while", mã được thụt vào. Nếu có nhiều hơn 3 vết lõm, tốt hơn là sửa lại chúng. Quá nhiều vết lõm là bằng chứng cho sự phức tạp của mã và do đó, nên tránh.
  • Mã chết nên tránh và xóa. Phân tích tĩnh giúp tìm thấy nó nếu một người tồn tại.

Điều quan trọng hơn nữa là các quy tắc dành riêng cho Magento:

  • Các mô-đun nên hoạt động độc lập. Họ chỉ nên có ít sự phụ thuộc vào các mô-đun khác và không phụ thuộc vào các mẫu. Một giải pháp là sử dụng các cập nhật bố cục (cơ sở / mặc định) thay vì thích ứng với các tệp mẫu và một mô-đun bao gồm các chức năng bổ sung của mẫu.
  • Để duy trì khả năng cập nhật trong các bản hack lõi Magento và các bản hack của các mô-đun bên ngoài nên tránh. Một cách tốt hơn là sử dụng các nhà văn hoặc người quan sát thay thế.
  • Để thay đổi, tốt hơn là sử dụng tập lệnh thiết lập thay vì thay đổi trực tiếp của cơ sở dữ liệu hoặc của quản trị viên. Nhờ họ thay đổi phải được thực hiện chỉ một lần.

Dưới đây là một số chi tiết và video của bài thuyết trình: http://www.code4business.de/code-quality-magento/


1
Nhưng nếu bạn có một phiên bản tiếng Anh của liên kết bạn đã đăng sẽ còn tốt hơn nữa.
Marius

Một phiên bản tiếng Anh của bài trình bày này sẽ sớm được viết. Tôi sẽ giữ cho bạn hiện tại và tôi sẽ chia sẻ liên kết mới ngay khi phiên bản tiếng Anh được xuất bản.
dùng3743859

Một phiên bản tiếng Anh của bài thuyết trình đang trực tuyến. Đây là liên kết đến nó: code4business.de/code-quality-magento
user3743859

Huh? Nó vẫn bằng tiếng Đức. Nhưng tôi chỉ tình cờ tham dự buổi thuyết trình bằng tiếng Anh này tại MeetMagentRo khoảng 2 tuần trước. Công cụ tuyệt vời.
Marius

18

Nếu bạn bán tiện ích mở rộng của mình hoặc chia sẻ nó với những người khác, hãy nghĩ về việc viết mã có thể đọc được.

  1. đừng làm cho phương pháp quá phức tạp
  2. thêm khối DOC vào phương thức của bạn *
  3. sử dụng tên biến thích hợp, như $productIdsthay vì$ids
  4. tương tự đối với các phương thức, public function myOnProductSaveMethod() {...}nói ... không có gì, nhưng tryDisableInternetOnProductSave()sẽ đưa ra gợi ý muốn lên kế hoạch
  5. sử dụng gợi ý loại mà nó có ý nghĩa someMethod(Varien_Data_Db_Collection $collection)
  6. tránh số ma thuật và chuỗi **
  7. nếu bạn sử dụng các mô hình đặt thuộc $_eventPrefixtính (và $_eventObject) để làm cho chúng dễ tiếp cận hơn với người quan sát
  8. nếu bạn thêm các trường cấu hình hệ thống
    • đặt giá trị mặc định trong config.xml
    • thêm <validate>các nút vào các trường trongsystem.xml
    • thêm tài nguyên ACL vào adminhtml.xml
  9. không thêm các mục trình đơn cấp một vô dụng / quảng cáo trong phần phụ trợ quản trị - không nằm trong topbar cũng như trong các phần cấu hình
  10. thêm tài nguyên ACL cho tất cả các hành động của bộ điều khiển (quá khối lượng!)
  11. đảm bảo truy vấn của bạn hoạt động với tiền tố bảng DB
  12. suy nghĩ về (không) khả năng tính toán lạc hậu (đây thực sự là ý kiến)
    • không hỗ trợ Mysql4các lớp học
    • không sử dụng các phương pháp không dùng nữa
  13. đảm bảo ngoại lệ của bạn hoạt động như mong đợi trong mọi trường hợp - thêm UnitTests (ví dụ PhpUnit)
  14. ngoài David Manners ... hãy thêm composer.jsonvào để giúp triển khai dễ dàng hơn
  15. vì PHP5.6 là EOL, hãy viết mã của bạn cho PHP7. Sử dụng declare(strict_types=1);và xác định các loại đầu vào và đầu ra của bạn
  16. Magento2: kiểm tra mã của bạn bằng các công cụ phân tích mã tĩnh như phpstan . Hỗ trợ cho các phương pháp ma thuật ở đây . (cam kết mới nhất hoạt động với 2.3, trước đó cho 2.1 / 2.2 - taht yêu cầu phpstan 0.8.5)

* Khối DOC:

Nếu bạn kiểm tra mã Magento-1 của mình bằng PHP_CodeSniffer cho tiêu chuẩn PSR2 hoặc PHPMD, bạn có thể muốn thêm dòng này (nơi có ý nghĩa) ...

  • đến lớp
    • @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
    • @phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - tài sản thừa kế
    • @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
    • @SuppressWarnings(PHPMD.CamelCaseClassName)
    • @SuppressWarnings(PHPMD.CamelCasePropertyName) - tài sản thừa kế
  • phương pháp
    • @SuppressWarnings(PHPMD.CamelCaseMethodName) - phương pháp kế thừa
    • @SuppressWarnings(PHPMD.StaticAccess)- nếu bạn sử dụng Mage::hoặc các cuộc gọi tĩnh khác

** Thường được sử dụng:

  • ID cửa hàng quản trị
    • 0 > Mage_Core_Model_App::ADMIN_STORE_ID
  • sản phẩm status
    • 1 > Mage_Catalog_Model_Product_Status::STATUS_ENABLED
    • 2> Mage_Catalog_Model_Product_Status::STATUS_DISABLED (không 0như mong đợi)
  • sản phẩm type
    • simple > Mage_Catalog_Model_Product_Type::TYPE_SIMPLE
    • bundle > Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
    • configurable > Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE
    • grouped > Mage_Catalog_Model_Product_Type::TYPE_GROUPED
    • virtual > Mage_Catalog_Model_Product_Type::TYPE_VIRTUAL
  • sản phẩm visibity
    • 1 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE
    • 2 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
    • 3 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH
    • 4 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH

Tương tự cho thứ tự SQL ASCso với Zend_Db_Select::SQL_ASC (ví dụ) .

Nói rằng "nó không cần thiết vì nó sẽ không bao giờ thay đổi" ? Ví dụ thực ID cho catalog_productthuộc tính thay đổi trong khoảng từ Magento 1.5 và 1.9 từ 10đến 4, vì vậy điều này có thể phá vỡ gia hạn của bạn:

$collection->addFieldToFilter('entity_type_id', 10)

Sử dụng điều này thay vì thêm một truy vấn, nhưng bạn sẽ an toàn ...

$entityTypeId = Mage::getModel('eav/config')
    ->getEntityType(Mage_Catalog_Model_Product::ENTITY)
    ->getEntityTypeId();

$collection->addFieldToFilter('entity_type_id', $entityTypeId)

8

@marius, liên quan đến Tiêu chuẩn mã hóa (điểm 24 trong danh sách của bạn).

Tôi thích sử dụng PHP_CodeSniffer cùng với EQP ECG CS để tự động thực thi các tiêu chuẩn này.

Sử dụng PHP_CodeSniffer bạn không phải lo lắng về việc quên những thứ như thay thế array()bằng [], tránh sử dụng is_null, để lại các biến cục bộ không sử dụng hoặc thậm chí là một phương thức không có khối PHPDoc.

PHP_CodeSniffer sẽ luôn cho bạn biết về nó.


Đã đồng ý! Cách làm có thể: magento.stackexchange.com/questions/178640/ Kẻ
sv3n

Tôi nghĩ không có cách nào để định cấu hình cả CS trong PHPStorm (đối với những người sử dụng PHPStorm) nhưng bạn luôn có thể sử dụng thiết bị đầu cuối để kiểm tra CS trong mã của mình. Ngoài ra còn có các công cụ như grumphp github.com/phpro/grumphp giúp một chút.
diazwatson

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.