Bagaimana cara menulis ekstensi khusus?


143

Karena saya memiliki banyak masalah akhir-akhir ini dengan ekstensi gratis dan komersial, saya memutuskan untuk mengajukan pertanyaan ini dan menjawabnya dengan langkah-langkah yang biasanya saya ikuti ketika menulis ekstensi. Jangan ragu untuk mengedit jawaban atau menambahkan yang baru.
Dalam sebagian besar kasus ketika memasang ekstensi atau tema, saya harus menghabiskan beberapa jam (kadang-kadang lebih, kadang-kadang kurang) untuk membuatnya berfungsi pada semua lingkungan yang saya butuhkan:

  • dev: biasanya di localhostmana proyek berada dalam subfolder
  • preprod & hidup

Ini telah terjadi bahkan dengan ekstensi dari penyedia ekstensi besar (yang harus tetap tanpa nama setidaknya sampai saya benar-benar marah dan menambahkan nama mereka di sini)
Jadi pertanyaan utamanya adalah .. langkah apa yang harus saya pertimbangkan ketika menulis ekstensi untuk memastikan kualitas kode dan membuatnya lebih mudah bagi orang teknis dan non-teknis untuk menggunakannya dan bagi orang teknis untuk mengubahnya?


11
Tampaknya salah satu penyedia ekstensi besar tidak menyukai pertanyaan ini dan menurunkannya. :)
Marius

1
Secara pribadi, absolutly tidak ada masalah dengan Wyomind, tetapi mereka mengenkripsi kode mereka dan masih "mitra premium" :( (hanya sebagai contoh)
sv3n

Jawaban:


186

Inilah yang biasanya saya lakukan:

  1. Selalu berkembang dengan error_reportingterus.
  2. Selalu berkembang dengan isDeveloperModeset ke true. Cukup tambahkan SetEnv MAGE_IS_DEVELOPER_MODE 1ke httpd.conffile Anda (atau file yang sesuai untuk Nginx atau yang lainnya)
  3. Jika ekstensi ditautkan ke fungsionalitas inti, tambahkan ketergantungan pada file deklarasi <depends><Mage_Catalog /></depend>
  4. Jika modul ini untuk penggunaan komunitas, gunakan communitysebagai codepool untuk memberi para pengembang kesempatan untuk menimpa beberapa kelas tanpa memodifikasi kode secara langsung
  5. Masukkan file desain frontend Anda app/design/frontend/base/default untuk membuatnya tersedia untuk semua tema.
  6. Masukkan file desain admin Anda app/design/adminhtml/default/defaultdan jangan mengubah tema admin. Saya mungkin ingin mengubahnya di salah satu modul saya.
  7. Awali nama file tata letak Anda dan nama folder templat dengan nama perusahaan agar lebih mudah mengisolasinya. easylife_articles.xmldanapp/design/.../easylife_articles
  8. Masukkan sumber daya statis Anda (JavaScript, CSS, dan gambar) dalam folder yang sama dengan file templat easylife_articles/images/doh.png
  9. Lampirkan file teks sederhana dengan cara mencopot pemasangan ekstensi: File apa yang perlu dihapus, tabel apa yang perlu dihapus, pengaturan konfigurasi apa yang perlu dihapus dari core_config_datatabel.
  10. Jangan menulis kueri secara langsung dalam model, blok atau pembantu, gunakan model sumber daya untuk itu.
  11. Jangan menulis kueri menggunakan nama tabel secara langsung Select * from sales_flat_order where .... Gunakan a Zend_Selectdan ubah nama tabel menggunakan ->getTable('sales/order').
  12. Gunakan url dasar untuk memasukkan jsfile dalam templat. Salah <script type="text/javascript" src="../js/some.js"></script> . Baik <script type="text/javascript" src="<?php echo Mage::getBaseUrl('js').'some.js'?>"></script>
  13. Jangan menulis ulang kelas kecuali diperlukan. Gunakan pengamat dan jika itu tidak mungkin untuk menggunakan metode pembantu yang menerima sebagai parameter dan contoh kelas yang ingin Anda timpa. Salah : Override Mage_Catalog_Model_Productuntuk menambahkan metode getProductArticles(). Benar . Di pembantu Anda tambahkan getProductArticles(Mage_Catalog_Model_Product $product)
  14. Jika Anda menimpa kelas, letakkan daftar mereka di readme.txtfile
  15. Gunakan jalur admin default untuk bagian admin modul Anda. URL admin salah articles/adminhtml_articles/index . URL admin yang tepat admin/articles/index
  16. Tambahkan ACL untuk bagian admin Anda. Saya mungkin ingin membatasi akses ke beberapa administrator.
  17. Jangan menambahkan kerangka kerja JavaScript lain (jQuery, MooTools, dll.) Jika tidak perlu. Tulis kode Anda dalam prototipe.
  18. Jadikan Anda templat HTML W3C valid (ini untuk pengembang OCD seperti saya).
  19. Jangan letakkan gambar di mediafolder. Gunakan skin. The media folder biasanya tidak diversi dan ini membuat lebih sulit untuk memindahkan website untuk lingkungan yang berbeda.
  20. Uji ekstensi Anda dengan katalog datar hidup dan mati. Agar tidak menggandakan waktu pengembangan, gunakan Chaos Monkey .
  21. Uji ekstensi Anda dengan cache ondan cache off.
  22. Hindari menggunakan huruf besar dalam nama modul dan kelas. Jika tidak diuji dengan benar, ini dapat menyebabkan masalah pada OS yang berbeda. Ini lebih merupakan rekomendasi, bukan 'keharusan'.
  23. Kirim acara dalam kode Anda untuk memudahkan pengembang mengubah fungsionalitasnya.
  24. Ikuti standar pengkodean yang sama yang digunakan Magento dan komentar kode Anda.
  25. Jangan gunakan tag pendek PHP ( <? $this->doSomething() ?>). Gunakan tag lengkap ( <?php $this->doSomething()?>). Juga, jangan gunakan tag gema pendek. ( <?="D'oh";?>). Gunakan ( <?php echo "D'oh";?>)
  26. Terjemahkan teks Anda menggunakan $this->__dan tambahkan file terjemahan lokal dengan teks Anda ( app/local/en_US/Easylife_Articles.csv) setidaknya untuk en_USbahasa. Tidak semua situs web dibuat dalam bahasa Inggris dan identifikasi teks untuk diterjemahkan membutuhkan waktu.
  27. Jika Anda menjual penawaran ekstensi, setidaknya dukungan dasar. Atau setidaknya jawab email dukungan yang Anda terima.
  28. Jangan melakukan panggilan konstan ke server Anda melalui ekstensi Anda untuk validasi lisensi. Sekali, saat instalasi lebih dari cukup (saya juga tidak suka pendekatan ini, tetapi lebih baik daripada melakukan panggilan sepanjang waktu). (Terinspirasi oleh pertanyaan ini )
  29. Kembangkan dengan log yang diaktifkan dan sesekali lihat var/log/system.logfile tersebut. Kesalahan yang tercantum di sini tidak ditampilkan bahkan dengan mode pengembang aktif. Jika setidaknya ada satu kesalahan Anda berakhir dengan file log besar setelah beberapa bulan menjalankan ekstensi.
  30. Jika ekstensi Anda memengaruhi proses checkout atau pesanan dengan cara tertentu, pastikan ekstensi itu berfungsi dengan banyak pengiriman, atau jika ekstensi tidak berfungsi dengan banyak pengiriman, pastikan ekstensi tidak memengaruhinya.
  31. Jangan mengganti bilah Pemberitahuan Admin default (atau URL umpan). Jika saya tertarik dengan apa yang Anda tawarkan, saya akan berlangganan buletin Anda. Biarkan saya melihat apa yang dikatakan Magento. Itu lebih penting bagi saya.
  32. Jika Anda mengenkripsi file kode Anda dengan Ioncube (atau sesuatu yang lain) ... well ... Aku hanya membencimu dan saya harap bisnis Anda bangkrut

Itulah yang sejauh ini. Saya akan menambahkan lebih banyak segera setelah saya memikirkan sesuatu yang lain.


Saya setuju dengan Anda, ini pasti awal yang baik. Yang pasti, Anda juga akan memahami bahwa tidak selalu mungkin untuk mencakup semua jenis konfigurasi dan masalah yang berbeda, setidaknya itu akan mengurangi yang mungkin. Sebagian besar masalah yang saya temui dengan ekstensi lain atau orang yang bertemu dengan saya disebabkan oleh konflik dengan penimpaan.
Sylvain Rayé

2
@ Marius, tentu 1+ dari saya. Ini mencakup sebagian besar kasus dan skenario yang sedang kita hadapi dalam pengembangan.
liyakat

4
@ColinM. Pertama-tama adalah suatu kehormatan memiliki komentar Anda di sini. :) Saya setuju ada perbedaan, saya akan memodifikasi jawabannya, tetapi saya masih berpikir bahwa keduanya harus dihindari, setidaknya sampai PHP 5.3 menjadi "PHP 4 baru". Maksud saya masih digunakan dalam skala besar.
Marius

4
@Marius, poin Anda sangat membantu. Hingga # 31 saya benar-benar fokus pada setiap poin, tetapi pada # 32 saya hanya tertawa keras. +1 khusus untuk poin # 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 bankruptSaya merasakan hal yang sama. Ada beberapa perusahaan yang tidak menawarkan versi terbaru, Anda harus membayar untuk mereka, itu benar-benar membuat saya frustrasi dan tidak mengerti mengapa mereka ingin menjual produk yang sama berulang-ulang (untuk menghasilkan uang? Tentu saja). Saya hanya tidak membeli produk mereka lagi. Anda tahu siapa yang saya bicarakan.
Adarsh ​​Khatri

31

Saya penggemar berat menggunakan modman sehingga saya dapat mengembangkan dan mengontrol sumber hanya ekstensi saya dan membiarkan file inti dan struktur folder tidak berubah. Hal ini juga membuat pengujian di berbagai instalasi berjalan lebih lancar.

Oh dan satu tip besar selalu mencoba untuk menginstal ekstensi paket Anda secara lokal pada instalasi magento yang bersih sebelum mengunggahnya ke Magento Connect, saya telah kehilangan file berkali-kali di manajer paket.


3
Panggilan bagus tentang 'instal ekstensi paket Anda secara lokal'. Saya pikir ini termasuk dalam kategori: 'Uji ekstensi sialan Anda dari atas ke bawah'.
Marius

Saya juga pernah terjebak oleh hal ini sebelumnya. Pastikan Anda menguji paket pada instalasi bersih yang tidak sama dengan paket yang Anda gunakan!
Joseph Leedy

22

Andreas von Studnitz dan Dr. Nikolai Krambrock memberikan presentasi yang baik tentang kualitas kode pada Meet Magento DE 2014. Mereka membedakan antara kualitas kode umum dan kualitas kode khusus Magento. Singkatnya, ada aturan umum berikut:

  • Penggunaan elemen-elemen struktur - seperti halnya kelas dan metode - harus diatur dalam kelas-kelas perampas menengah. Elemen-elemen struktur ini hanya masuk akal ketika mereka digunakan untuk penataan. Karena itu mereka harus berukuran sedang. Itu dianggap menggunakan 100-200 Lines of Code untuk kelas dan 3-20 Lines of Code untuk metode.
  • Karena penggunaan "jika" atau "sementara" kode ini indentasi. Jika ada lebih dari 3 indentasi, lebih baik untuk merevisinya. Terlalu banyak lekukan adalah bukti kompleksitas kode dan oleh karena itu, harus dihindari.
  • Kode Mati harus dihindari dan dihapus. Analisis statis membantu menemukannya jika ada.

Yang lebih penting adalah aturan khusus Magento:

  • Modul harus bekerja secara independen. Mereka seharusnya hanya memiliki sedikit ketergantungan pada modul lain dan tidak ada ketergantungan pada templat. Solusi adalah menggunakan pembaruan tata letak (basis / default) alih-alih adaptasi ke file templat dan modul yang mencakup fungsi tambahan templat.
  • Untuk mempertahankan kemampuan pembaruan di Magento, peretasan inti dan peretasan modul eksternal harus dihindari. Cara yang lebih baik adalah dengan menggunakan penulisan ulang atau pengamat.
  • Untuk perubahan, lebih baik menggunakan skrip pengaturan daripada perubahan langsung dari database atau admin. Berkat mereka perubahan harus dilakukan hanya sekali saja.

Berikut ini beberapa detail dan video presentasi: http://www.code4business.de/code-quality-magento/


1
Tetapi jika Anda memiliki versi bahasa Inggris dari tautan yang Anda poskan akan lebih baik.
Marius

Versi bahasa Inggris dari presentasi ini akan segera ditulis. Saya akan terus memberi tahu Anda dan saya akan membagikan tautan baru segera setelah versi bahasa Inggris diterbitkan.
user3743859

Versi bahasa Inggris dari presentasi sedang online sekarang. Berikut tautannya: code4business.de/code-quality-magento
user3743859

Hah? Itu masih dalam bahasa Jerman. Tapi saya kebetulan menghadiri presentasi ini dalam bahasa Inggris di MeetMagentRo sekitar 2 minggu yang lalu. Hal yang bagus.
Marius

18

Jika Anda menjual ekstensi Anda atau membagikannya kepada orang lain, pikirkan tentang menulis kode yang dapat dibaca manusia.

  1. jangan membuat metode terlalu rumit
  2. tambahkan blok DOC ke metode Anda *
  3. gunakan nama variabel yang tepat, seperti $productIdsbukan$ids
  4. sama untuk metode, public function myOnProductSaveMethod() {...}mengatakan ... tidak ada, tetapi tryDisableInternetOnProductSave()akan memberikan petunjuk keinginan yang direncanakan
  5. gunakan petunjuk tipe yang masuk akal someMethod(Varien_Data_Db_Collection $collection)
  6. hindari angka ajaib dan string **
  7. jika Anda menggunakan model, atur $_eventPrefixproperti (dan $_eventObject) agar lebih mudah diakses oleh pengamat
  8. jika Anda menambahkan bidang konfigurasi sistem
    • atur nilai default di config.xml
    • tambahkan <validate>node ke bidang dalamsystem.xml
    • tambahkan sumber daya ACL ke adminhtml.xml
  9. jangan tambahkan entri menu tingkat pertama yang tidak berguna / iklan di admin backend - baik di topbar maupun di bagian config
  10. tambahkan sumber daya ACL untuk semua aksi pengontrol (juga massactions!)
  11. memastikan kueri Anda berfungsi dengan awalan tabel DB
  12. pikirkan (tidak) keterbelakangan ke belakang (ini benar-benar berdasarkan pendapat)
    • jangan mendukung Mysql4kelas
    • jangan gunakan metode yang sudah usang
  13. pastikan ekstensi Anda berfungsi seperti yang diharapkan dalam setiap kasus - tambahkan UnitTests (PhpUnit misalnya)
  14. selain David Manners ... tambahkan composer.jsonjuga untuk membuat penempatan lebih mudah
  15. karena PHP5.6 adalah EOL, tulis kode Anda untuk PHP7. Gunakan declare(strict_types=1);dan tentukan tipe input dan output Anda
  16. Magento2: periksa kode Anda dengan alat analisis kode statis seperti phpstan . Dukungan untuk metode ajaib di sini . (komit terbaru bekerja dengan 2.3, sebelumnya untuk 2.1 / 2.2 - yang memerlukan phpstan 0.8.5)

* Blok DOC:

Jika Anda memeriksa kode Magento-1 Anda dengan PHP_CodeSniffer untuk standar PSR2 atau PHPMD, Anda mungkin ingin menambahkan baris ini (yang masuk akal) ...

  • ke kelas
    • @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
    • @phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - properti yang diwarisi
    • @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
    • @SuppressWarnings(PHPMD.CamelCaseClassName)
    • @SuppressWarnings(PHPMD.CamelCasePropertyName) - properti yang diwarisi
  • untuk metode
    • @SuppressWarnings(PHPMD.CamelCaseMethodName) - metode yang diwariskan
    • @SuppressWarnings(PHPMD.StaticAccess)- jika Anda menggunakan Mage::atau panggilan statis lainnya

** Sering digunakan:

  • ID toko admin
    • 0 > Mage_Core_Model_App::ADMIN_STORE_ID
  • produk status
    • 1 > Mage_Catalog_Model_Product_Status::STATUS_ENABLED
    • 2> Mage_Catalog_Model_Product_Status::STATUS_DISABLED (tidak 0seperti yang diharapkan)
  • produk 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
  • produk 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

Sama untuk urutan SQL ASCvs Zend_Db_Select::SQL_ASC (misalnya) .

Mengatakan "itu bukan keharusan karena itu tidak akan pernah berubah" ? Misalnya ID entitas untuk catalog_productatribut yang diubah di suatu tempat antara Magento 1.5 dan 1.9 dari 10menjadi 4, jadi ini dapat merusak ekstensi Anda:

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

Menggunakan ini sebagai gantinya menambahkan satu permintaan, tetapi Anda akan aman ...

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

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

8

@marius, tentang Standar Pengkodean (poin 24 dalam daftar Anda).

Saya suka menggunakan PHP_CodeSniffer bersama dengan EQP dan ECG CS untuk secara otomatis menegakkan standar ini.

Menggunakan PHP_CodeSniffer Anda tidak perlu khawatir tentang melupakan hal-hal seperti mengganti array()dengan [], hindari menggunakan is_null, meninggalkan variabel lokal yang tidak terpakai atau bahkan metode tanpa blok PHPdoc.

PHP_CodeSniffer akan selalu memberi tahu Anda tentang hal itu.


Sepakat! Kemungkinan caranya
sv3n

Saya pikir tidak ada cara untuk mengkonfigurasi kedua CS di PHPStorm (bagi mereka yang menggunakan PHPStorm) tetapi Anda selalu dapat menggunakan terminal untuk memeriksa CS dalam kode Anda. Juga ada alat-alat seperti grumphp github.com/phpro/grumphp yang sedikit membantu.
diazwatson

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.