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/modules
nome 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
- Vai su Sistema-> Gestione cache
- Seleziona Aggiorna dal menu Tutta la cache
- Fai clic su Salva impostazioni cache
Ora, ci assicuriamo che Magento sia a conoscenza del modulo
- Vai su Sistema-> Configurazione
- Fai clic su Avanzate
- 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/foo
corrisponderà 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/foo
perché 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.