Özel bir uzantı nasıl yazılır?


143

Son zamanlarda serbest ve ticari uzantıyla ilgili birçok sorunum olduğu için, bu soruyu sormaya ve bir uzatma yazarken genellikle takip ettiğim adımlarla cevap vermeye karar verdim. Cevabı düzenlemek veya yeni bir tane eklemek için çekinmeyin.
Bir uzantı veya tema yüklerken çoğu durumda, ihtiyacım olan tüm ortamlarda çalışabilmesi için birkaç saat (bazen daha fazla, bazen daha az) harcamam gerekiyor:

  • dev: genellikle localhostprojenin bir alt klasörde olduğu yer
  • Preprod ve canlı

Bu, genişleme sağlayıcılarının uzantılarıyla bile oldu (en azından gerçekten gerçekten kızıncaya ve isimlerini buraya ekleyene kadar isimsiz kalmalı)
Yani, asıl soru şu: kaliteyi sağlamak için bir uzantı yazarken ne gibi düşünmeliyim? kodun kullanımı ve teknik ve teknik olmayan bir kişinin kullanmasını ve teknik bir kişinin değiştirmesini kolaylaştırması?


11
Görünen o ki, genişleme sağlayıcılarından biri bu soruyu beğenmedi ve reddetti. :)
Marius

1
Şahsen absolutly Wyomind ile hiçbir prob, ama onların kodunu şifrelemek ve "prim ortakları" :( (sadece örneğin) hala
sv3n

Yanıtlar:


185

İşte genelde yaptığım şey:

  1. Her zaman üzerinde geliştirin error_reporting.
  2. Her zaman isDeveloperModeayarlanmış olarak geliştir true. Sadece eklemek SetEnv MAGE_IS_DEVELOPER_MODE 1senin için httpd.confdosya (veya ilgili dosyanın Nginx için veya başka bir şey)
  3. Uzantı çekirdek bir işlevselliğe bağlıysa, bildirim dosyasına bağımlılığı ekleyin <depends><Mage_Catalog /></depend>
  4. Modül topluluk kullanımı communityiçinse, geliştiricilere kodu doğrudan değiştirmeden bazı sınıfları geçersiz kılma şansı vermek için kodlayıcı olarak kullanın
  5. app/design/frontend/base/default Tüm temalar için hazır olması için ön tasarım dosyalarınızı yerleştirin .
  6. Yönetici tasarım dosyalarınızı yerleştirin app/design/adminhtml/default/defaultve yönetici temasını değiştirmeyin. Modüllerinden birinde değiştirmek isteyebilirim.
  7. Düzen dosya adlarınızı ve şablon klasör adınızı şirket adınızla birlikte kullanarak bunları daha kolay izole edin. easylife_articles.xmlveapp/design/.../easylife_articles
  8. Statik kaynaklarınızı (JavaScript, CSS ve görüntüler) şablon dosyalarıyla aynı klasöre yerleştirin. easylife_articles/images/doh.png
  9. Uzantının nasıl kaldırılacağıyla ilgili basit bir metin dosyası ekleyin: Hangi dosyaların kaldırılması, hangi tabloların bırakılması, hangi yapılandırma ayarlarının core_config_datatablodan kaldırılması gerekir ?
  10. Sorguları doğrudan modellere, bloklara veya yardımcılara yazmayın, bunun için bir kaynak modeli kullanın.
  11. Doğrudan tablo adlarını kullanarak sorgu yazmayın Select * from sales_flat_order where .... A kullanın Zend_Selectve tablo adlarını kullanarak dönüştürün ->getTable('sales/order').
  12. jsŞablonu içermek için temel URL'yi kullanın . Yanlış <script type="text/javascript" src="../js/some.js"></script> . Sağ <script type="text/javascript" src="<?php echo Mage::getBaseUrl('js').'some.js'?>"></script>
  13. Gerekli olmadıkça sınıfları yeniden yazmayın. Gözlemciyi kullanın ve parametre olarak alınan yardımcı yöntemleri ve geçersiz kılmak istediğiniz bir sınıfın örneğini kullanmak mümkün değilse. Yanlış : Mage_Catalog_Model_ProductYöntemi eklemek için geçersiz kıl getProductArticles(). Doğru . Yardımcınıza ekleyin getProductArticles(Mage_Catalog_Model_Product $product)
  14. Sınıfları geçersiz kılarsanız, bunların bir listesini bir readme.txtdosyaya yerleştirin.
  15. Modülünüzün yönetici bölümü için varsayılan yönetici yolunu kullanın. Yanlış yönetici URL'si articles/adminhtml_articles/index . Sağ yönetici URL'si admin/articles/index
  16. Yönetici bölümleriniz için ACL ekleyin. Bazı yöneticilere erişimi kısıtlamak isteyebilirim.
  17. Gerekmiyorsa başka bir JavaScript çerçevesi (jQuery, MooTools, vb.) Eklemeyin. Prototipte size kodu yazın.
  18. HTML W3C şablonunu geçerli kılar (bu, kendim gibi OCD geliştiricileri içindir).
  19. Görüntüleri mediaklasöre koymayın . Kullanın skin. media Klasör genellikle sürüm ve bu zor farklı ortamlara web sitesini taşımak için yapar değildir.
  20. Uzantınızı düz katalogla açıp kapatın. Geliştirme süresini iki katına çıkarmamak için, Kaos Maymunu kullanın .
  21. Uzantınızı önbellek onve önbellekle test edin off.
  22. Modülde ve sınıf adlarında büyük harf kullanmaktan kaçının. Doğru bir şekilde test edilmezse, bu durum farklı işletim sistemlerinde sorunlara neden olabilir. Bu bir öneri, bir 'zorunluluk' değil.
  23. Geliştiricilerin işlevselliğini değiştirmelerini kolaylaştırmak için kodunuzdaki olayları gönderin.
  24. Magento'nun kullandığı kodlama standartlarını takip edin ve kodunuzu yorumlayın.
  25. PHP kısa etiketleri ( <? $this->doSomething() ?>) kullanmayın. Tam etiketleri kullanın ( <?php $this->doSomething()?>). Ayrıca henüz kısa yankı etiketlerini kullanmayın. ( <?="D'oh";?>). Kullanın ( <?php echo "D'oh";?>)
  26. Metinlerinizi çevirin $this->__ve yerel çeviri dosyasını app/local/en_US/Easylife_Articles.csven azından en_USdil için metinlerinizle ( ) ekleyin . Tüm web siteleri İngilizce dilinde değildir ve çevrilecek metinlerin belirlenmesi zaman alıcıdır.
  27. Bir uzatma teklifi satıyorsanız, en azından temel destek. Veya en azından aldığınız destek e-postalarına cevap verin.
  28. Lisans doğrulama için uzantınız üzerinden sunucularınıza sürekli arama yapmayın. Bir zamanlar, kurulumda fazlasıyla yeterli (Ben de bu yaklaşımı sevmiyorum, ama her zaman arama yapmaktan daha iyidir). ( Bu sorudan ilham aldı )
  29. Kayıt aktif hale geldiğinde geliştir ve zaman zaman var/log/system.logdosyaya bak . Burada listelenen hatalar, geliştirici modu açık olsa bile gösterilmez. En az bir hata varsa, uzantıyı birkaç ay çalıştırdıktan sonra büyük bir günlük dosyasıyla sonuçlanır.
  30. Uzantınız ödeme işlemini veya siparişleri bir şekilde etkilerse, çoklu gönderimde çalıştığından emin olun veya çoklu gönderimde çalışmaması gerekiyorsa, etkilememesini sağlayın.
  31. Varsayılan Yönetici Bildirim çubuğunu (veya besleme URL'sini) değiştirmeyin. Ne teklif etmeniz gerektiğiyle ilgileniyorsam bülteninize abone olacağım. Magento'nun ne söyleyeceğini göreyim. Benim için daha önemli.
  32. Kod dosyalarınızı Ioncube (veya başka bir şey) ile şifrelerseniz ... iyi ... Sadece senden nefret ediyorum ve umarım işiniz iflas eder

Şimdiye kadar olan buydu. Başka bir şey düşündüğümde daha fazlasını ekleyeceğim.


Sana katılıyorum, kesinlikle iyi bir başlangıç. Elbette, her türlü konfigürasyon ve konuyu kapsamanın her zaman mümkün olmadığını da anlayacaksınız, en azından olası olanı azaltacaktır. Başka uzantılarla tanıştığım sorunların çoğu veya benimkiyle tanıştığım insanlar, üzerine yazma ile çelişkiden kaynaklanıyor.
Sylvain Rayé 23:13

2
Marius, benden 1+ emin. @ Vakaların çoğunu ve geliştirme aşamasında karşılaştığımız senaryoyu kapsıyor.
liyakat

4
@ColinM. Her şeyden önce yorumunuzu burada almaktan onur duyuyorum. :). Bir fark olduğunu kabul ediyorum, cevabı değiştireceğim, ama yine de her ikisinden de kaçınılması gerektiğini düşünüyorum, en azından PHP 5.3 "yeni PHP 4" olana kadar. Demek istediğim hala geniş bir ölçekte kullanılıyor.
Marius

4
@Marius, puanlarınız çok faydalı. # 31'e kadar Cidden her noktaya odaklanmıştım, ama # 32'ye yüksek sesle bir kahkaha atmıştı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 bankruptBen de aynı hissediyorum. Güncelleştirilmiş sürüm sunmayan bazı şirketler var, onlar için para ödemeniz gerekecek, bu benim için gerçekten sinir bozucu ve neden tekrar tekrar aynı ürünü satmak istediklerini anlamıyorlar (açıkça para kazanmak için). Sadece artık ürünlerini almıyorum. Kimden bahsettiğimi biliyorsun.
Adarsh ​​Khatri

31

Modman'ı kullanmanın büyük bir hayranıyım; böylece kontrolü yalnızca uzantımı geliştirip kaynaklayabilir ve çekirdek dosyaları ve klasör yapısını değiştirmeden bırakabilirim. Ayrıca, farklı kurulumlarda yapılan testlerin daha sorunsuz çalışmasını sağlar.

Ah ve büyük bir ipucu, Magento Connect'e yüklemeden önce daima paketli uzantınızı yerel olarak temiz bir Magento kurulumuna yüklemeye çalışın. Paket yöneticisinde dosyaları çok özledim.


3
'Paketlenmiş uzantınızı yerel olarak yükleyin' hakkında iyi çağrı yapın. Bunun kategoriye girdiğini düşünüyorum: 'Tanrının lanet olası uzantısını yukarıdan aşağıya test et'.
Marius

Bunu daha önce de yakaladım. Paketi, paketlediğinizle aynı olmayan temiz bir kurulumda test ettiğinizden emin olun !
Joseph Leedy

22

Andreas von Studnitz ve Dr. Nikolai Krambrock, Meet Magento DE 2014'te kod kalitesi hakkında iyi bir sunum yaptı. Genel kod kalitesi ile Magento'ya özgü kod kalitesi arasında ayrım yapıyorlar. Kısacası, aşağıdaki genel kurallar vardır:

  • Yapı elemanlarının kullanımı - tıpkı sınıflar ve yöntemler gibi - orta sınıflardaki sınıflara yerleştirilmelidir. Yapının bu unsurları yalnızca yapılanma için kullanıldığında anlamlıdır. Bu nedenle orta büyüklükte olmaları gerekir. Sınıflar için 100-200 Kod Satırını ve 3-20 Kod Satırını metod olarak kullanmak kabul edilir.
  • "If" veya "while" kullanımı nedeniyle kod girintilidir. 3'ten fazla girintiler varsa, bunları düzeltmek daha iyidir. Çok fazla girinti, kodun karmaşıklığının kanıtıdır ve bu nedenle bunlardan kaçınılmalıdır.
  • Ölü Koddan kaçınılmalı ve silinmelidir. Statik analizler eğer varsa onu bulmanıza yardımcı olur.

Daha da önemlisi, Magento'ya özgü kurallar:

  • Modüller bağımsız çalışmalıdır. Sadece diğer modüllere çok az bağımlılık göstermeli ve şablonlara bağımlı olmamalıdırlar. Çözüm, şablon dosyalarına ve şablonun ek işlevlerini kapsayan bir modüle uyum sağlamak yerine düzen güncellemelerini (temel / varsayılan) kullanmaktır.
  • Magento'da güncelleme yeteneğini sürdürmek için ana modüllere ve harici modüllere ait bilgisayarlardan kaçınılmalıdır. Daha iyi bir yol, bunun yerine yeniden yazarların veya gözlemcinin kullanılmasıdır.
  • Değişiklikler için, veritabanında veya yöneticide doğrudan değişiklik yapmak yerine kurulum komut dosyalarını kullanmak daha iyidir. Onlar sayesinde değişiklikler sadece bir defa yapılmalı.

İşte daha fazla ayrıntı ve sunumun bir videosu: http://www.code4business.de/code-quality-magento/


1
Ancak, gönderdiğiniz bağlantının ingilizce bir sürümü olsaydı daha iyi olurdu.
Marius

Bu sunumun İngilizce versiyonu yakında yazılacak. Sizi güncel tutacağım ve İngilizce sürüm yayınlanır yayınlanmaz yeni linki paylaşacağım.
user3743859

Sunumun İngilizce versiyonu şuan çevrimiçi. İşte bunun için link: code4business.de/code-quality-magento
user3743859

ha? Hala Almanca. Ama daha 2 hafta önce MeetMagentRo'da İngilizce olarak bu sunuma katıldım. Harika şeyler.
Marius

18

Uzantınızı satarsanız veya başkalarıyla paylaşırsanız, insan tarafından okunabilen bir kod yazmayı düşünün.

  1. yöntemi çok karmaşık hale getirme
  2. DOC bloklarını yöntemlerine ekle *
  3. $productIdsyerine uygun değişken isimleri kullanın.$ids
  4. Metodları için aynı, public function myOnProductSaveMethod() {...}diyor ki ... hiçbir şey, ama tryDisableInternetOnProductSave()istediği planlanan bir ipucu verecek
  5. mantıklı olan yerlerde ipucu kullanın someMethod(Varien_Data_Db_Collection $collection)
  6. sihirli sayılardan ve karakterlerden kaçınmak **
  7. Eğer modeller gözlemci tarafından daha erişilebilir olmasını sağlamak için set set $_eventPrefixözelliğini (ve $_eventObject) kullanıyorsanız,
  8. sistem yapılandırma alanları eklerseniz
    • varsayılan değerleri config.xml
    • <validate>alanlara düğüm eklesystem.xml
    • ACL kaynakları eklemek adminhtml.xml
  9. yararsız / reklam yapan birinci sınıf menü girişlerini yönetici arka uçlarına eklemeyin - üst çubuğa veya yapılandırma bölümlerine
  10. Tüm denetleyici eylemleri için ACL kaynakları ekleyin (katliamlar da var!)
  11. Sorgularınızın DB tablo önekleriyle çalışmasını sağlayın
  12. (hayır) geriye dönük uyumluluk hakkında düşün (bu gerçekten görüşe dayalıdır)
    • Mysql4sınıfları desteklemiyor
    • kullanımdan kaldırılan yöntemleri kullanmayın
  13. istisnanızın her durumda beklendiği gibi çalışmasını sağlayın - UnitTests ekleyin (örneğin, PhpUnit)
  14. David Manners'a ek olarak ... composer.jsonkonuşlandırmayı kolaylaştırmak için bir de ekleyin
  15. PHP5.6 EOL olduğundan, PHP7 kodunuzu yazın. Giriş declare(strict_types=1);ve çıkış türlerinizi kullanın ve tanımlayın
  16. Magento2: Statik kod ile kodunuzu kontrol gibi araçlar analiz phpstan . Burada sihirli yöntemler için destek . (En son 2.1 / 2.2 için önce 2.3 ile çalışır) - phpstan 0.8.5 gerektirir)

* DOC blokları:

Magento-1 kodunuzu PSR2 standardı veya PHPMD için PHP_CodeSniffer ile kontrol ediyorsanız, belki bu satırları eklemek isteyebilirsiniz (mantıklı olduğu yer) ...

  • sınıflara
    • @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
    • @phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - kalıtsal özellikler
    • @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
    • @SuppressWarnings(PHPMD.CamelCaseClassName)
    • @SuppressWarnings(PHPMD.CamelCasePropertyName) - kalıtsal özellikler
  • yöntemlere
    • @SuppressWarnings(PHPMD.CamelCaseMethodName) - kalıtsal yöntemler
    • @SuppressWarnings(PHPMD.StaticAccess)- Mage::veya başka bir statik arama kullanıyorsanız

** Sık kullanılan:

  • yönetici mağaza kimliği
    • 0 > Mage_Core_Model_App::ADMIN_STORE_ID
  • ürün status
    • 1 > Mage_Catalog_Model_Product_Status::STATUS_ENABLED
    • 2> Mage_Catalog_Model_Product_Status::STATUS_DISABLED ( 0beklendiği gibi değil )
  • ürün 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
  • ürün 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

SQL sipariş ASCvs aynı Zend_Db_Select::SQL_ASC (örneğin) .

Diyen "her zamankinden asla değişmeyecek çünkü o gereği yok" ? Örneğin için varlık kimliği catalog_productniteliklerinden Magento 1.5 ve 1.9 arasında bir yerde değişmiş 10için 4, bu nedenle bu uzantıyı kırabilir:

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

Bunun yerine bir sorgu ekler, ancak güvende olursunuz ...

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

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

8

@marius, Kodlama Standartları ile ilgili (listenizdeki 24 numaralı nokta).

Bu standartları otomatik olarak uygulamak için EQP ve ECG CS ile birlikte PHP_CodeSniffer kullanmayı seviyorum .

Kullanılması PHP_CodeSniffer değiştirmekte gibi şeyler unutmaya endişe gerekmez array()ile []kullanmaktan kaçının is_null, kullanılmamış yerel değişkenleri veya PHPDoc bloğu olmadan bile bir yöntemi bırakın.

PHP_CodeSniffer her zaman size bundan bahsedecektir .


Kabul! Olası nasıl yapılır: magento.stackexchange.com/questions/178640/…
sv3n

Her iki CS'yi de PHPStorm'da (PHPStorm kullananlar için) yapılandırmanın bir yolu olmadığını düşünüyorum ancak kodunuzdaki CS'yi kontrol etmek için her zaman terminali kullanabilirsiniz. Ayrıca biraz yardımcı olan grumphp github.com/phpro/grumphp gibi araçlar var .
diazwatson

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.