Magento'da basit bir 'Merhaba Dünya' modülünü nasıl oluşturabilirim?


305

Magento'da aşağıdakiler nasıl yapılabilir?

  • Bir denetleyici / görünüm / model yaklaşımı kullanarak bir "Merhaba Dünya" mesajı görüntüleyin. Yani, eğer gidersem http://example.com/myController'Merhaba Dünya' dizesini gösterirdi. Bu dizeyi web sitemin şablonu içinde gösterebilmek (örneğin, üstbilgi, altbilgi vb.) Bir bonus olacaktır.

  • Bu denetleyiciye (veya gerekirse yeni bir denetleyiciye), bir modelle etkileşime giren ve sorguyu gerçekleştiren Select * FROM articles where id='10've satırı (sütunları içeren id, title, content) denetleyiciye döndüren bir yöntemi nasıl eklerim ? Ardından, bu satırı görüntüleyecek bir görünüm eklemek için denetleyiciyi kullanın. Böylece http://example.com/myController/show_row(ya da buna benzer bir şey), bir görünümdeki satırı görüntüler. (Fantezi olmanıza gerek yok, sadece bir echo $row->id;veya benzer bir şey işe yarayacaktır.)

Magento'nun kod yapısı hakkında başka bilgiler de çok yardımcı olacaktır.


6
Görünüşe göre sistem ödülünüzü yeniden ele geçirmiyor.
Alan Storm

2
Henüz ödülünü açamıyorum çünkü 48 saat değil .. Ama en kısa zamanda
açacağım

Ah, sadece eski yazılara, özürlere uygulanan nimetlerin olduğunu bilmiyordum.
Alan Storm

3
Çocukken her zaman büyüler için bir çekim vardı; kodu aynı şekilde çalışır.
vol7ron

Yanıtlar:


539

Her şeyden önce, PDF / E-Kitabı PHP Architect'ten satın almanızı şiddetle tavsiye ederim . Bu 20 ABD doları, ancak bulabildiğim tek basit "Magento böyle çalışır" kaynağıdır. Ayrıca kendi web sitemde Magento öğreticileri yazmaya başladım .

İkincisi, bir seçeneğiniz varsa ve deneyimli bir programcı değilseniz veya deneyimli bir programlayıcıya (ideal olarak PHP ve Java'da) erişiminiz yoksa , başka bir sepet seçin . Magento iyi tasarlanmış, ancak diğer programcıların üzerine modüller inşa edebileceği bir alışveriş sepeti çözümü olarak tasarlanmıştır. Akıllı, ancak programcı olmayan insanlar tarafından kolayca anlaşılmak üzere tasarlanmamıştır.

Üçüncüsü, Magento MVC, Ruby on Rails , Django , CodeIgniter , CakePHP , vs.'den çok farklı . Bu gün PHP geliştiricileri arasında popüler olan MVC modeli. Bence Zend modeline dayanıyor ve her şey Java OOP benzeri. Endişelenmeniz gereken iki kontrolör var. Modül / frontName denetleyicisi ve ardından MVC denetleyicisi.

Dördüncüsü, Magento uygulamasının kendisi, kullanacağınız aynı modül sistemi kullanılarak üretilmiştir, bu nedenle çekirdek kodun etrafında gezinmek yararlı bir öğrenme taktiği. Ayrıca, Magento ile yapacağınız şeylerin çoğu mevcut sınıfları geçersiz kılıyor . Burada ele aldığım , geçersiz kılmak değil, yeni işlevsellik yaratmak . Kod örneklerine bakarken bunu aklınızda bulundurun.

İlk sorunuzla başlayacağım, size belirli bir URL'ye yanıt vermek için bir denetleyici / yönlendirici nasıl ayarlayacağınızı göstereceğim. Bu küçük bir roman olacak. Model / şablonla ilgili konular için daha sonra zamanım olabilir ama şimdilik yapmıyorum. Ancak, kısaca SQL sorunuzla konuşacağım.

Magento bir EAV veritabanı mimarisi kullanır . Mümkün olduğunda, ihtiyacınız olan bilgileri almak için sistemin sağladığı model nesnelerini kullanmayı deneyin. Hepsini SQL tablolarında biliyorum, ama en iyisi ham SQL sorguları kullanarak veri yakalamayı düşünmemek, yoksa delirirsiniz.

Son feragatname. Magento'yu yaklaşık iki ya da üç haftadır kullanıyorum, bu yüzden uyarı emptoru. Bu, Stack Overflow'a yardımcı olduğu kadar bunu kafamda düz tutmak için bir egzersiz.

Bir modül oluşturun

Magento'ya yapılan tüm eklemeler ve özelleştirmeler modüller aracılığıyla yapılır. Yani, yapmanız gereken ilk şey yeni bir modül oluşturmak. app/modulesAşağıdaki şekilde adlandırılmış bir XML dosyası oluşturun

cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
<?xml version="1.0"?>
<config>
     <modules>
        <MyCompanyName_HelloWorld>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompanyName_HelloWorld>
     </modules>
</config>

ŞirketimAdı, değişiklikleriniz için benzersiz bir ad alanıdır, şirketinizin adı olmak zorunda değildir, ancak önerilen kural benim eflatunumdur. HelloWorldmodülünüzün adıdır.

Uygulama önbelleğini temizleme

Şimdi modül dosyası yerinde olduğuna göre, Magento'ya bunu bildirmemiz (ve çalışmalarımızı kontrol etmemiz) gerekecek. Yönetici uygulamasında

  1. Sistem-> Önbellek Yönetimi'ne gidin
  2. Tüm Önbellek menüsünden Yenile'yi seçin
  3. Önbellek ayarlarını kaydet'i tıklayın

Şimdi, Magento'nun modülü bildiğinden emin oluyoruz

  1. Sistem-> Yapılandırma'ya gidin
  2. Gelişmiş'i tıklayın
  3. "Modül çıkışını devre dışı bırak" ayar kutusunda, "ŞirketimAdı_HelloWorld" adlı yeni modülünüzü arayın

Performansın yavaşlamasıyla yaşayabiliyorsanız, geliştirme / öğrenme sırasında uygulama önbelleğini kapatmak isteyebilirsiniz. Önbelleği temizlemeyi unutmak ve değişikliklerinizin neden görünmediğini merak etmekten daha sinir bozucu bir şey yoktur.

Dizin yapısını ayarlayın

Ardından, modül için bir dizin yapısı ayarlamamız gerekecek. Tüm bu dizinlere ihtiyacınız olmayacak, ancak hepsini kurmanın hiçbir zararı yok.

mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

Ve bir yapılandırma dosyası ekleyin

touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml

ve yapılandırma dosyasının içine, esasen "boş" bir yapılandırma olan aşağıdakileri ekleyin.

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompanyName_HelloWorld>
            <version>0.1.0</version>
        </MyCompanyName_HelloWorld>
    </modules>
</config>

İşleri aşırı basitleştiren bu yapılandırma dosyası, Magento'ya hangi kodu çalıştırmak istediğinizi söylemenizi sağlar.

Yönlendiriciyi ayarlama

Sonra, modülün yönlendiricilerini ayarlamamız gerekiyor. Bu, sisteme herhangi bir URL’yi

http://example.com/magento/index.php/helloworld

Bu nedenle, yapılandırma dosyanıza aşağıdaki bölümü ekleyin.

<config>
<!-- ... -->
    <frontend>
        <routers>
            <!-- the <helloworld> tagname appears to be arbitrary, but by
            convention is should match the frontName tag below-->
            <helloworld>
                <use>standard</use>
                <args>
                    <module>MyCompanyName_HelloWorld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>
    </frontend>
<!-- ... -->
</config>

Burada söylediğiniz şey "helloworld'ün ön adıyla herhangi bir URL ...

http://example.com/magento/index.php/helloworld

"FrontName denetleyicisi MyCompanyName_HelloWorld" kullanmalıdır.

Dolayısıyla, yukarıdaki yapılandırma uygulandığında, yukarıdaki dünya sayfasını yüklediğinizde 404 sayfası alırsınız. Bunun nedeni, denetleyicimiz için bir dosya oluşturmadığımızdır. Şimdi yapalım.

touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

Şimdi sayfayı yüklemeyi deneyin. İlerleme! 404 yerine bir PHP / Magento istisnası elde edersiniz

Controller file was loaded but class does not exist

Bu nedenle, az önce oluşturduğumuz dosyayı açın ve aşağıdaki kodu yapıştırın. Sınıfın adının, yönlendiricinizde sağladığınız adı temel alması gerekir.

<?php
class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
    }
}

Yeni ayarladığımız modül / frontName denetleyicisidir. Bu, varsayılan denetleyici ve modülün varsayılan eylemidir. Denetleyiciler veya eylemler eklemek istiyorsanız, Magento URL'sinin ilk bölümünün değişmez olduğunu ve her zaman bu şekilde gideceklerini hatırlamanız gerekir.http://example.com/magento/index.php/frontName/controllerName/actionName

Bu URL ile eşleşmek istiyorsanız

http://example.com/magento/index.php/helloworld/foo

Bu şekilde yapabileceğiniz bir FooController'a sahip olmanız gerekir:

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo 'Foo Index Action';
    }

    public function addAction(){
        echo 'Foo add Action';
    }

    public function deleteAction(){
        echo 'Foo delete Action';
    }
}

Varsayılan denetleyici IndexController ve varsayılan eylem indexAction'ın örtük olarak olabileceğini, ancak bir şey geldikten sonra açık olması gerektiğini lütfen unutmayın. Böylece http://example.com/magento/index.php/helloworld/fooFooController kontrolörü ve indexAction eylem eylemiyle eşleşecek ve IndexController eylem eylemiyle eşleşmeyecektir. Bir fooAction'a sahip olmak istiyorsanız, IndexController denetleyicisinde bu denetleyiciyi bu şekilde açıkça çağırmanız gerekir: http://example.com/magento/index.php/helloworld/index/fooçünkü url'nin ikinci kısmı her zaman controllerName'dir ve her zaman controllerName olacaktır. Bu davranış, Magento içinde paketlenmiş Zend Framework kalıtımdır.

Artık aşağıdaki URL'lere ulaşabilmeniz ve yankı ifadelerinizin sonuçlarını görebilmeniz gerekir

http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete

Yani, bu size Magento'nun bir denetleyiciye nasıl gönderildiğine dair temel bir fikir vermelidir. Buradan, modellerin ve şablon / düzen sisteminin nasıl kullanılması gerektiğini görmek için mevcut Magento denetleyici sınıflarına bakmanızı tavsiye ederim.


4
Teşekkürler, bu çok faydalı. Lütfen yanıtınızı tamamlamak için model / veritabanı ve görünümleri kullanma hakkında biraz bilgi eklemeyi düşünün
Upvote

7
app / code / local / MyCompanyName / HelloWorld / etc / config.xml dosyasının etc / modules konumunda bulunan xml ile aynı durumda olduğundan emin olun (MyCompanyName_HelloWorld NOT mycompanyname_helloworld) aksi takdirde arka uçtaki girişler olacaktır!
Moak

8
Alan'ın mükemmel cevabı hakkında sadece küçük bir yorumum var: "Yeni ayarladığımız modül / frontName denetleyicisi. Bu MVC denetleyicisi DEĞİL." FooController ile tamamen aynı tipte bir kontrolördür. ZF dizininde IndexController'daki eylem varsayılan olarak çağrılır, bu nedenle istekte bulunan example.com/magento/index.php/helloworld , helloworld modülünde IndexController :: indexAction () öğesini çağırır. Böylece ... / helloworld / foo çağrısı, helloworld modülünde FooController'ı bulmaya ve bunun üzerinde indexAction () öğesini çağırmaya çalışacaktır. IndexController :: fooAction () 'ı tetiklemek için: / helloworld / index / foo.
Matus Zeman

2
fooAction'ın IndexController'da neden bulunmadığını anlamak için @Matus Zeman'ın yanıtını okuduğunuzdan emin olun, bu sadece 'normal' Zend Framework MVC / yönlendirici bir şeydir ve kötü url'yi kullandığınızdan, "Bu DEĞİL MVC denetleyicisi "bölümü.
regilero

2
@ hypervisor666 "Geliştirici modu" nu açın (google it). Geliştirici modu açıkken Magento, XML dosyalarındaki hatalarda çökecektir.
Alan Storm

39

Magento ile son bir aydır güreştim ve hala anlamaya çalışıyorum. Yani bu körlere giden kör olaydır. Belgelendirme yolunda çok az şey var ve forum / wiki en iyi ihtimalle kaotik. Sadece bu değil, aynı zamanda eski ya da en uygun olandan birkaç çözüm var. Bir projeniz olup olmadığından ya da sadece anlamaya çalıştığınızdan emin değilim, ancak tamamen yeni bir şey yaratmak yerine mevcut işlevselliği değiştirmeye başladıysanız muhtemelen daha kolay. Bunun için kesinlikle wiki "Geliştiriciler için önerilen makaleler" ile gitmek istiyorum. Yeni ödeme yöntemi, gerçek bir göz açıcıydı.

Hata ayıklama için FirePHP kullanmanızı ve bir şeyler ters gittiğinde HTML kaynağınıza bakmanızı kesinlikle öneririm . Ole echo hata ayıklama yöntemi gerçekten o kadar iyi çalışmıyor.

Genel mimari o kadar karmaşık ki, tamamen anlasam bile, onu kapsayacak bir kitap yazmam gerekiyordu. Yapabileceğim en iyi şey, ilk başladığımda birisinin bana vermiş olmasını dilerdim ...

Temel dosyalardan uzak durun. Bunları değiştirmeyin, bunun yerine kendi modülünüzü yazın ve ihtiyacınız olanı geçersiz kılın.

Magento, ne yapması gerektiğine karar vermek için XML'den oluşan yapılandırma dosyalarını kullanır. Temel işlevlerin aksine kendi öğelerinizi çalıştırmasını sağlamak için doğru xml'ye ihtiyacınız var. Ne yazık ki XML oluşturmak için nasıl bir kılavuz yoktur; örneklere bakmanız ve ciddi testler yapmanız gerekir. İşleri karmaşıklaştırmak için, bu dosyaların içeriği büyük / küçük harfe duyarlıdır. Ancak bunlarda uzmanlaşırsanız, çok güçlü bir sistem sağlayan temel işlevlerin herhangi bir bölümünü geçersiz kılabilirsiniz.

Magento yöntemleri gibi kullanır Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')bazı sınıflar nesneleri geri dönmek için. Bunları varsayılan olarak çekirdek ad alanında bulur. Kendinizinkini kullanmasını istiyorsanız, config.xmldosyanızda bunları geçersiz kılmanız gerekir .

Sınıflarınızın adı, içinde bulundukları klasöre karşılık gelmelidir.

Magento'daki birçok nesne eninde sonunda a adında bir şeyi genişletir Varien_Object. Bu genel amaçlı bir sınıftır (bir tür İsviçre çakısı gibi) ve hayatta amacı, kendi yöntemlerinizi / değişkenlerinizi anında tanımlamanıza izin vermektir. Örneğin, verileri bir yöntemden diğerine aktarmak için yüceltilmiş bir dizi olarak kullanıldığını göreceksiniz.

Geliştirme sırasında önbelleğe almanın devre dışı bırakıldığından emin olun. Magento'yu dayanılmaz derecede yavaşlatacak, ancak size çok fazla kafa travması kazandıracak (masanızda vurmaktan).

$thisÇok kullanıldığını göreceksiniz . Gördüğünüz dosyaya bağlı olarak farklı bir sınıf anlamına gelir. get_class($this)arkadaşınız, özellikle FirePHP ile birlikte.

Bir şeyleri kağıda not edin. Çok. Onlarla karşılaştıktan 1-2 gün sonra ihtiyaç duyacağınız sayısız küçük factoid var.

Magento OO'yu seviyor. Bir yöntemi izlemek sizi 5-10 farklı sınıfa götürürse şaşırmayın.

Tasarımcının kılavuzunu buradan okuyun . Çoğunlukla grafik tasarımcıları içindir, ancak modülünüzden çıktının nerede ve neden sonuçlanacağını anlamanız gerekir . Bunun için yönetici panelinin geliştirici bölümünde "Şablon yolu ipuçları" nı açmayı unutmayın.

Dahası var, ama bu bir teze dönüşmeden önce burada duracağım.


Mümkünse lütfen daha fazla mesaj gönderin, tüm bilgiler çok yardımcı olur :)
Upvote

Misa, eğer muhtemelen çerezinizi kaybetmişseniz Stackoverflow'a kayıt olmalısınız, tüm temsilciniz gitmiş olacaktı;)
Upvote Oyla

Teşekkür ederim! Bu çok yardımcı. Ner
Ner


0

Magento Modülü, belirli bir mağaza özelliği oluşturmak için gereken blokları, denetleyicileri, yardımcıları ve modelleri içeren bir grup dizindir. Magento platformundaki özelleştirme birimidir. Magento Modülleri, kullanıcı deneyimini ve mağaza görünümünü etkilemek için destek mantığı ile birden fazla işlev gerçekleştirmek üzere oluşturulabilir. Yüklenmelerini, silinmelerini veya devre dışı bırakılmalarını sağlayan bir yaşam döngüsüne sahiptir. Hem tüccarlar hem de uzantı geliştiricileri açısından, modüller Magento platformunun merkezi birimidir.

Modül Beyanı

Modülü yapılandırma dosyasını kullanarak bildirmeliyiz. Magento 2 olarak modülün etc dizinindeki yapılandırma modülünü arayın. Şimdi, module.xml yapılandırma dosyasını oluşturacağız.

Kod şöyle görünecektir:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Modülün Kaydı Modül , Magento Bileşen Kayıt Şirketi sınıfı kullanılarak Magento 2 sistemine kaydedilmelidir. Şimdi module root dizininde registration.php dosyasını oluşturacağız:

app/code/Cloudways/Mymodule/registration.php

Kod şöyle görünecektir:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Modül Durumunu Kontrol Edin Yukarıdaki adımları uyguladıktan sonra basit bir modül oluşturmuş oluruz. Şimdi modülün durumunu ve aşağıdaki komut satırını kullanarak etkinleştirilip etkinleştirilmediğini kontrol edeceğiz:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

İşlemi tamamladıktan sonra geri bildiriminizi paylaşın


0

Modülümü magaplaza merhaba dünya öğreticisinden yapmaya çalışıyordum, ancak bir şeyler ters gitti. Bu modülün kodunu github'dan https://github.com/astorm/magento2-hello-world ithal ettim ve işe yaradı. bu modül, ben bir kategori alt kategorileri ajax seçin açılan çıkış modülü oluşturdu. Magento2 kurulumunuzun aap / kod dizinine kurduktan sonra bu URL'yi takip edin .. http://www.example.com/hello_mvvm/hello/world Kodunu buradan indirebilirsiniz https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns ve aap / code klasörünüze yerleştirin. bu komutları çalıştırmaktan ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Artık modül işlevselliğini şu URL ile kontrol edebilirsiniz: http: // {{www.example.com}} / hello_mvvm / hello / world


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.