Come posso creare un semplice modulo "Hello World" in Magento?


305

Come si può realizzare quanto segue in Magento?

  • Mostra un messaggio "Hello World" usando un approccio controller / view / model. Quindi, se ci andassi http://example.com/myController, mostrerei la stringa "Hello World". Essere in grado di mostrare questa stringa all'interno del modello del mio sito Web (ad esempio l'intestazione, il piè di pagina, ecc.) Sarà un bonus.

  • Come faccio ad aggiungere un metodo a questo controller (o un nuovo controller, se necessario), che interagisce con un modello, esegue la query Select * FROM articles where id='10'e restituisce la riga (contenente le colonne id, title, content) al controller? Quindi utilizzare il controller per includere una vista che visualizzerebbe questa riga. Quindi andare http://example.com/myController/show_row(o qualcosa di simile) visualizzerebbe la riga all'interno di una vista. (Non c'è bisogno di essere fantasiosi, solo uno echo $row->id;o qualcosa di simile funzionerebbe.)

Anche qualsiasi altra informazione sulla struttura del codice di Magento sarà molto utile.


6
Sembra che il sistema non riconosca la tua taglia.
Alan Storm,

2
Non riesco ancora ad aprire la generosità perché non ha 48 ore .. ma lo aprirò appena posso e lo assegnerò alla migliore risposta
Fai clic su Aggiorna

Ah, non sapevo che le taglie si applicavano solo a post più vecchi, scuse.
Alan Storm,

3
Da bambino, ha sempre avuto una gravità per i magenti; il suo codice funziona allo stesso modo.
vol7ron,

Risposte:


539

Innanzitutto, consiglio vivamente di acquistare il PDF / E-Book da PHP Architect . Sono $ 20, ma è l'unica risorsa semplice "Ecco come funziona Magento" che sono stato in grado di trovare. Ho anche iniziato a scrivere tutorial Magento sul mio sito web .

In secondo luogo, se hai una scelta e non sei un programmatore esperto o non hai accesso a un programmatore esperto (idealmente in PHP e Java), scegli un altro carrello . Magento è ben progettato, ma è stato progettato per essere una soluzione di carrello della spesa su cui altri programmatori possono costruire moduli. Non è stato progettato per essere facilmente compreso da persone intelligenti ma non programmatori.

Terzo, Magento MVC è molto diverso dal modello MVC di Ruby on Rails , Django , CodeIgniter , CakePHP , ecc. Che è popolare tra gli sviluppatori PHP in questi giorni. Penso che sia basato sul modello Zend e il tutto è molto simile a Java OOP. Ci sono due controller di cui devi preoccuparti. Il controller module / frontName e quindi il controller MVC.

In quarto luogo, l'applicazione Magento stessa è costruita utilizzando lo stesso sistema di moduli che utilizzerai, quindi cercare il codice di base è una tattica di apprendimento utile. Inoltre, molto di ciò che farai con Magento è la sostituzione di classi esistenti. Quello che sto trattando qui è la creazione di nuove funzionalità, non la sostituzione. Tienilo a mente quando stai guardando gli esempi di codice là fuori.

Inizierò con la tua prima domanda, mostrandoti come impostare un controller / router per rispondere a un URL specifico. Questo sarà un piccolo romanzo. Potrei avere più tempo per gli argomenti relativi al modello / modello, ma per ora no. Tuttavia, parlerò brevemente alla tua domanda SQL.

Magento utilizza un'architettura di database EAV . Quando possibile, provare a utilizzare gli oggetti modello forniti dal sistema per ottenere le informazioni necessarie. So che è tutto lì nelle tabelle SQL, ma è meglio non pensare di afferrare i dati utilizzando query SQL non elaborate, altrimenti impazzirai.

Dichiarazione di non responsabilità finale. Sto usando Magento da circa due o tre settimane, quindi avvertimento emptor. Questo è un esercizio per farmi capire bene quanto lo è per aiutare Stack Overflow.

Crea un modulo

Tutte le aggiunte e le personalizzazioni a Magento vengono eseguite tramite moduli. Quindi, la prima cosa che devi fare è creare un nuovo modulo. Creare un file XML nel app/modulesnome come segue

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>

MyCompanyName è uno spazio dei nomi univoco per le tue modifiche, non deve essere il nome della tua azienda, ma è la convenzione consigliata il mio magento. HelloWorldè il nome del tuo modulo.

Cancella la cache dell'applicazione

Ora che il file del modulo è a posto, dovremo far sapere a Magento (e controllare il nostro lavoro). Nell'applicazione admin

  1. Vai su Sistema-> Gestione cache
  2. Seleziona Aggiorna dal menu Tutta la cache
  3. Fai clic su Salva impostazioni cache

Ora, ci assicuriamo che Magento sia a conoscenza del modulo

  1. Vai su Sistema-> Configurazione
  2. Fai clic su Avanzate
  3. Nella casella di impostazione "Disabilita output moduli", cerca il tuo nuovo modulo denominato "MyCompanyName_HelloWorld"

Se riesci a vivere con il rallentamento delle prestazioni, potresti voler disattivare la cache dell'applicazione durante lo sviluppo / apprendimento. Niente è più frustrante quindi dimenticare di svuotare la cache e chiedersi perché le modifiche non vengono visualizzate.

Imposta la struttura della directory

Successivamente, dovremo impostare una struttura di directory per il modulo. Non avrai bisogno di tutte queste directory, ma non c'è nulla di male nel configurarle tutte adesso.

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

E aggiungi un file di configurazione

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

e all'interno del file di configurazione, aggiungere quanto segue, che è essenzialmente una configurazione "vuota".

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

Semplificando troppo le cose, questo file di configurazione ti permetterà di dire a Magento quale codice vuoi eseguire.

Installazione del router

Successivamente, dobbiamo configurare i router del modulo. Questo farà sapere al sistema che stiamo gestendo qualsiasi URL sotto forma di

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

Quindi, nel tuo file di configurazione, aggiungi la seguente sezione.

<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>

Quello che stai dicendo qui è "qualsiasi URL con frontName di helloworld ...

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

dovrebbe utilizzare il controller frontName MyCompanyName_HelloWorld ".

Quindi, con la configurazione di cui sopra in atto, quando carichi la pagina di helloworld sopra, otterrai una pagina 404. Questo perché non abbiamo creato un file per il nostro controller. Facciamolo adesso.

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

Ora prova a caricare la pagina. Progresso! Invece di un 404, otterrai un'eccezione PHP / Magento

Controller file was loaded but class does not exist

Quindi, apri il file che abbiamo appena creato e incolla il seguente codice. Il nome della classe deve essere basato sul nome fornito nel router.

<?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";
    }
}

Quello che abbiamo appena impostato è il controller module / frontName. Questo è il controller predefinito e l'azione predefinita del modulo. Se vuoi aggiungere controller o azioni, devi ricordare che la prima parte dell'albero di un URL Magento è immutabile, andranno sempre cosìhttp://example.com/magento/index.php/frontName/controllerName/actionName

Quindi se vuoi abbinare questo url

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

Dovrai avere un FooController, che puoi fare in questo modo:

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';
    }
}

Si prega di notare che IndexController del controller predefinito e Action Index Index dell'azione possono implicitamente ma devono essere espliciti se qualcosa viene dopo di esso. Quindi http://example.com/magento/index.php/helloworld/foocorrisponderà al controller FooController e all'azione indexAction e NON all'azione fooAction di IndexController. Se vuoi avere un fooAction, nel controller IndexController devi chiamare questo controller esplicitamente in questo modo: http://example.com/magento/index.php/helloworld/index/fooperché la seconda parte dell'URL è e sarà sempre controllerName. Questo comportamento è un'eredità di Zend Framework in bundle in Magento.

Ora dovresti essere in grado di colpire i seguenti URL e vedere i risultati delle tue dichiarazioni echo

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

Quindi, questo dovrebbe darti un'idea di base su come Magento spedisce a un controller. Da qui ho consigliato di cercare le classi di controller Magento esistenti per vedere come utilizzare i modelli e il sistema modello / layout.


4
Grazie, è molto utile Ti preghiamo di considerare di aggiungere alcune informazioni sull'uso del modello / database e delle visualizzazioni in modo che la tua risposta possa essere completa
Fai clic per votare il

7
assicurati che l'app / code / local / MyCompanyName / HelloWorld / etc / config.xml abbia lo stesso caso dell'xml che si trova in etc / modules (MyCompanyName_HelloWorld NOT mycompanyname_helloworld) altrimenti ci saranno voci nel backend!
Moak,

8
Ho solo un piccolo commento sulla risposta perfetta di Alan: "Quello che abbiamo appena impostato è il controller module / frontName. Questo NON è il controller MVC." È esattamente lo stesso tipo di controller di FooController. Nell'indice ZF l'azione in IndexController viene chiamata per impostazione predefinita, pertanto richiedendo example.com/magento/index.php/helloworld chiamerà IndexController :: indexAction () nel modulo helloworld. Quindi chiamando ... / helloworld / foo proverà a trovare FooController nel modulo helloworld e chiamerà indexAction () su di esso. Per attivare IndexController :: fooAction () è necessario richiedere: ... / helloworld / index / foo.
Matus Zeman,

2
assicurati di leggere la risposta di @Matus Zeman per capire perché fooAction non è stato trovato su IndexController, è solo una cosa "normale" MVC / router Zend Framework e hai utilizzato l'URL errato, quindi dovresti rimuovere "Questo NON è il Controller MVC "parte sulla tua risposta.
regilero,

2
@ hypervisor666 Attiva la "modalità sviluppatore" (google it). Con la modalità sviluppatore attiva, Magento si arresta in modo anomalo in caso di errori nei file XML.
Alan Storm

39

Ho lottato con Magento nell'ultimo mese o giù di lì e sto ancora cercando di capirlo. Quindi questo è il caso del cieco che guida il cieco. C'è poco in termini di documentazione e il forum / wiki è nella migliore delle ipotesi caotico. Non solo, ma ci sono diverse soluzioni obsolete o tutt'altro che ottimali. Non sono sicuro se hai un progetto o stai solo cercando di capirlo, ma probabilmente è più facile se hai iniziato a modificare la funzionalità esistente invece di creare qualcosa di completamente nuovo. Per questo andrei sicuramente con gli "Articoli consigliati per gli sviluppatori" nel wiki. Il nuovo metodo di pagamento è stato un vero colpo d'occhio.

Per il debug consiglio vivamente di usare FirePHP e di guardare il tuo sorgente HTML quando qualcosa va storto. Il metodo di debug dell'eco ole non funziona molto bene.

L'architettura generale è così complessa, che anche se la capissi completamente, avrei bisogno di scrivere un libro per coprirlo. Il meglio che posso fare è darti consigli che vorrei che qualcuno mi avesse dato quando ho iniziato ...

Stai lontano dai file core. Non modificarli, scrivi invece il tuo modulo e sostituisci ciò di cui hai bisogno.

Magento utilizza file di configurazione costituiti da XML per decidere cosa deve fare. Per far funzionare le tue cose invece delle funzionalità di base hai bisogno dell'xml corretto. Sfortunatamente non esiste una guida su come costruire il tuo XML; devi guardare esempi e fare dei test seri. A complicare le cose, il contenuto di questi file è ampiamente sensibile al maiuscolo / minuscolo. Tuttavia, se li padroneggi, puoi ignorare qualsiasi parte della funzionalità di base che rende un sistema molto potente.

Magento usa metodi come Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper')restituire gli oggetti di alcune classi. Li trova per impostazione predefinita nel suo spazio dei nomi principale. Se si desidera che utilizzi il proprio, è necessario sovrascriverli nel config.xmlfile.

Il nome delle tue classi deve corrispondere alla cartella in cui si trovano.

Molti oggetti in Magento alla fine estendono qualcosa chiamato a Varien_Object. Questa è una classe di uso generale (un po 'come un coltellino svizzero) e il suo scopo nella vita è quello di permetterti di definire i tuoi metodi / variabili al volo. Ad esempio, lo vedrai usato come un array glorificato per passare i dati da un metodo a un altro.

Durante lo sviluppo, assicurarsi che la memorizzazione nella cache sia disabilitata. Renderà il magento tremendamente lento, ma ti farà risparmiare un sacco di traumi cranici (dal battere sulla tua scrivania).

Vedrai di $thisessere usato molto. Significa una classe diversa a seconda del file che vedi. get_class($this)è tuo amico, soprattutto in combinazione con FirePHP.

Annota le cose sulla carta. Un sacco. Ci sono innumerevoli piccoli factoidi di cui avrai bisogno 1-2 giorni dopo averli incontrati.

Magento ama OO. Non stupirti se tracciare un metodo ti porta attraverso 5-10 classi diverse.

Leggi la guida del designer qui . È pensato principalmente per i progettisti grafici, ma è necessario per capire dove e perché finirà l'output del modulo. Per questo non dimenticare di attivare "Suggerimenti percorso modello" nella sezione sviluppatore del pannello di amministrazione.

C'è di più, ma mi fermerò qui prima che questo si trasformi in una tesi.


Per favore pubblica altro se puoi, tutte le informazioni sono molto utili :)
Fai clic su Aggiorna

Misa, probabilmente dovresti registrarti qui su StackOverflow, se
perdessi i

Grazie! Questo è molto utile Ner
Ner,

2

Preferirò raccomandare Mage2Gen , questo ti aiuterà a generare il boilerplate e puoi concentrarti solo sulla logica aziendale principale. aiuta solo ad accelerare le cose.


0

Un modulo Magento è un gruppo di directory che contiene blocchi, controller, helper e modelli necessari per creare una specifica funzione di archivio. È l'unità di personalizzazione nella piattaforma Magento. I moduli Magento possono essere creati per eseguire più funzioni con logica di supporto per influenzare l'esperienza dell'utente e l'aspetto del negozio. Ha un ciclo di vita che consente di installarli, eliminarli o disabilitarli. Dal punto di vista sia dei commercianti che degli sviluppatori di estensioni, i moduli sono l'unità centrale della piattaforma Magento.

Dichiarazione del modulo

Dobbiamo dichiarare il modulo usando il file di configurazione. Come Magento 2 cerca il modulo di configurazione nella directory etc del modulo. Quindi ora creeremo il file di configurazione module.xml.

Il codice sarà simile al seguente:

<?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>

Registrazione del modulo Il modulo deve essere registrato nel sistema Magento 2 utilizzando la classe Registrar Magento Component. Ora creeremo il file registration.php nella directory principale del modulo:

app/code/Cloudways/Mymodule/registration.php

Il codice sarà simile al seguente:

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

Verifica lo stato del modulo Dopo aver seguito i passaggi precedenti, avremmo creato un modulo semplice. Ora controlleremo lo stato del modulo e se è abilitato o disabilitato utilizzando la seguente riga di comando:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Condividi il tuo feedback dopo aver completato il processo


0

Stavo cercando di creare il mio modulo da magaplaza ciao tutorial mondiale, ma qualcosa è andato storto. Ho importato il codice di questo modulo https://github.com/astorm/magento2-hello-world da github e ha funzionato. da quel modulo, ho creato una sottocategoria di categorie ajax seleziona il menu a discesa. Dopo averlo installato nella directory aap / code dell'installazione di magento2 segui questo URL. Http://www.example.com/hello_mvvm/hello/world Puoi scaricare il suo codice da qui https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns e posizionalo nella tua cartella aap / code. di eseguire questi comandi ...

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

Ora puoi controllare la funzionalità del modulo con il seguente URL http: // {{www.example.com}} / hello_mvvm / hello / world


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.