แรกและสำคัญที่สุดผมขอแนะนำให้คุณซื้อรูปแบบไฟล์ PDF / E-Book จาก PHP สถาปนิก มันคือ US $ 20 แต่เป็นทรัพยากรเดียวที่ตรงไปตรงมา "นี่คือวิธีการทำงานของ Magento" ที่ฉันหาได้ ผมได้เริ่มต้นยังเขียนบทเรียนวีโอไอพีที่เว็บไซต์ของตัวเอง
ประการที่สองถ้าคุณมีทางเลือกและไม่ได้เป็นโปรแกรมเมอร์ที่มีประสบการณ์หรือไม่ต้องมีการเข้าถึงโปรแกรมเมอร์ที่มีประสบการณ์ (นึกคิดใน PHP และ Java) รับรถเข็นอีก Magento ได้รับการออกแบบมาอย่างดี แต่ได้รับการออกแบบให้เป็นโซลูชันตะกร้าสินค้าที่โปรแกรมเมอร์คนอื่นสามารถสร้างโมดูลได้ มันไม่ได้ออกแบบมาเพื่อให้เข้าใจได้ง่ายโดยคนที่ฉลาด แต่ไม่ใช่โปรแกรมเมอร์
ประการที่สาม Magento MVC นั้นแตกต่างจากRuby on Rails , Django , CodeIgniter , CakePHPเป็นต้นและรูปแบบ MVC ที่เป็นที่นิยมของนักพัฒนา PHP ในปัจจุบัน ฉันคิดว่ามันเป็นไปตามโมเดลZendและสิ่งทั้งหมดนั้นเหมือน Java OOP มาก มีสองตัวควบคุมที่คุณต้องกังวล ตัวควบคุมโมดูล / frontName และจากนั้นตัวควบคุม MVC
ประการที่สี่แอปพลิเคชั่น Magento นั้นถูกสร้างขึ้นโดยใช้ระบบโมดูลเดียวกับที่คุณใช้ดังนั้นการกระตุ้นรอบรหัสหลักจึงเป็นวิธีการเรียนรู้ที่มีประโยชน์ นอกจากนี้สิ่งที่คุณจะทำกับวีโอไอพีมากมายคือการเอาชนะคลาสที่มีอยู่ สิ่งที่ฉันครอบคลุมในที่นี้คือการสร้างฟังก์ชั่นใหม่ไม่ใช่การเอาชนะ ระลึกไว้เสมอเมื่อคุณดูตัวอย่างโค้ดที่นั่น
ฉันจะเริ่มต้นด้วยคำถามแรกของคุณแสดงวิธีตั้งค่าคอนโทรลเลอร์ / เราเตอร์เพื่อตอบกลับ URL เฉพาะ นี่จะเป็นนิยายเล็ก ๆ ฉันอาจมีเวลาในภายหลังสำหรับหัวข้อ / แม่แบบที่เกี่ยวข้อง แต่ตอนนี้ฉันไม่มี อย่างไรก็ตามฉันจะถามคำถาม SQL ของคุณสั้น ๆ
Magento ใช้สถาปัตยกรรมฐานข้อมูลEAV เมื่อใดก็ตามที่เป็นไปได้พยายามใช้โมเดลวัตถุที่ระบบจัดเตรียมไว้เพื่อรับข้อมูลที่คุณต้องการ ฉันรู้ว่ามันมีอยู่ในตาราง SQL แต่ก็เป็นการดีที่สุดที่จะไม่นึกถึงการใช้ข้อมูลโดยใช้คำสั่ง SQL แบบ raw หรือคุณจะเป็นบ้า
ข้อจำกัดความรับผิดชอบสุดท้าย ฉันใช้ Magento ประมาณสองหรือสามสัปดาห์ดังนั้น caveat emptor นี่คือแบบฝึกหัดเพื่อให้ตรงนี้ในหัวของฉันเท่าที่จะช่วย Stack Overflow
สร้างโมดูล
การเพิ่มเติมและการปรับแต่งไปยังวีโอไอพีนั้นกระทำผ่านโมดูล ดังนั้นสิ่งแรกที่คุณต้องทำคือสร้างโมดูลใหม่ สร้างไฟล์ XML ในapp/modules
ชื่อดังนี้
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 เป็น namespace ที่ไม่ซ้ำกันสำหรับการปรับเปลี่ยนของคุณมันไม่จำเป็นต้องเป็นชื่อ บริษัท ของคุณ HelloWorld
เป็นชื่อของโมดูลของคุณ
ล้างแคชแอปพลิเคชัน
ตอนนี้ไฟล์โมดูลอยู่ในตำแหน่งแล้วเราจะต้องแจ้งให้ Magento ทราบเกี่ยวกับมัน (และตรวจสอบงานของเรา) ในแอปพลิเคชันผู้ดูแลระบบ
- ไปที่ระบบ -> การจัดการแคช
- เลือกรีเฟรชจากเมนู All Cache
- คลิกบันทึกการตั้งค่าแคช
ตอนนี้เราต้องแน่ใจว่า Magento รู้เกี่ยวกับโมดูล
- ไปที่ System-> Configuration
- คลิกขั้นสูง
- ในกล่องตั้งค่า "ปิดการใช้งานโมดูลเอาท์พุท" ให้มองหาโมดูลใหม่ของคุณชื่อ "MyCompanyName_HelloWorld"
หากคุณสามารถใช้ชีวิตด้วยประสิทธิภาพที่ช้าลงคุณอาจต้องปิดแอปพลิเคชันแคชในขณะที่กำลังพัฒนา / เรียนรู้ ไม่มีอะไรน่าผิดหวังไปกว่านี้แล้วลืมลบแคชและสงสัยว่าทำไมการเปลี่ยนแปลงของคุณจึงไม่ปรากฏ
ตั้งค่าโครงสร้างไดเรกทอรี
ต่อไปเราจะต้องตั้งค่าโครงสร้างไดเรกทอรีสำหรับโมดูล คุณไม่ต้องการไดเรกทอรีทั้งหมด แต่ไม่มีอันตรายใด ๆ ในการตั้งค่าทั้งหมด
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
และเพิ่มไฟล์กำหนดค่า
touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml
และภายในไฟล์กำหนดค่าให้เพิ่มรายการต่อไปนี้ซึ่งโดยพื้นฐานแล้วเป็นการกำหนดค่า "blank"
<?xml version="1.0"?>
<config>
<modules>
<MyCompanyName_HelloWorld>
<version>0.1.0</version>
</MyCompanyName_HelloWorld>
</modules>
</config>
ไฟล์การกำหนดค่านี้จะทำให้คุณบอก Magento ได้ว่าคุณต้องการเรียกใช้รหัสใด
การตั้งค่าเราเตอร์
ต่อไปเราต้องตั้งค่าเราเตอร์ของโมดูล วิธีนี้จะทำให้ระบบทราบว่าเรากำลังจัดการ URL ใด ๆ ในรูปแบบของ
http://example.com/magento/index.php/helloworld
ดังนั้นในไฟล์กำหนดค่าของคุณให้เพิ่มหัวข้อต่อไปนี้
<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>
สิ่งที่คุณพูดที่นี่คือ "URL ใด ๆ ที่มีชื่อหน้าของ helloworld ...
http://example.com/magento/index.php/helloworld
ควรใช้ตัวควบคุม frontName MyCompanyName_HelloWorld "
ดังนั้นด้วยการกำหนดค่าข้างต้นเมื่อคุณโหลดหน้า helloworld ด้านบนคุณจะได้รับหน้า 404 นั่นเป็นเพราะเรายังไม่ได้สร้างไฟล์สำหรับตัวควบคุมของเรา มาทำกันเถอะ
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
ตอนนี้ลองโหลดหน้า ความคืบหน้า! แทนที่จะเป็น 404 คุณจะได้รับข้อยกเว้น PHP / Magento
Controller file was loaded but class does not exist
ดังนั้นเปิดไฟล์ที่เราเพิ่งสร้างขึ้นและวางในรหัสต่อไปนี้ ชื่อของคลาสจะต้องเป็นไปตามชื่อที่คุณให้ไว้ในเราเตอร์ของคุณ
<?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";
}
}
สิ่งที่เราเพิ่งตั้งค่าคือตัวควบคุมโมดูล / ชื่อหน้า นี่คือตัวควบคุมเริ่มต้นและการกระทำเริ่มต้นของโมดูล หากคุณต้องการเพิ่มตัวควบคุมหรือการกระทำคุณต้องจำไว้ว่าต้นไม้ส่วนแรกของ Magento URL นั้นไม่เปลี่ยนรูปพวกเขาจะไปทางนี้เสมอhttp://example.com/magento/index.php/frontName/controllerName/actionName
ดังนั้นหากคุณต้องการจับคู่ URL นี้
http://example.com/magento/index.php/helloworld/foo
คุณจะต้องมี FooController ซึ่งคุณสามารถทำได้ดังนี้:
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';
}
}
โปรดทราบว่าตัวควบคุมเริ่มต้น IndexController และการกระทำเริ่มต้น indexAction สามารถโดยปริยาย แต่จะต้องมีความชัดเจนหากมีอะไรบางอย่างเกิดขึ้นหลังจากนั้น ดังนั้นhttp://example.com/magento/index.php/helloworld/foo
จะจับคู่คอนโทรลเลอร์ FooController และแอ็คชั่น indexAction และไม่ใช่แอคชั่น fooAction ของ IndexController หากคุณต้องการมี fooAction ในตัวควบคุม IndexController คุณต้องเรียกคอนโทรลเลอร์นี้อย่างชัดเจนเช่นนี้:
http://example.com/magento/index.php/helloworld/index/foo
เพราะส่วนที่สองของ url คือและจะเป็น controllerName เสมอ พฤติกรรมนี้เป็นสิ่งที่สืบทอดมาจาก Zend Framework ที่รวมอยู่ใน Magento
ตอนนี้คุณควรจะสามารถกด URL ต่อไปนี้และดูผลลัพธ์ของคำสั่ง 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
ดังนั้นควรให้แนวคิดพื้นฐานเกี่ยวกับวิธีการที่วีโอไอพีส่งไปยังคอนโทรลเลอร์ จากที่นี่ฉันแนะนำให้ poking ที่คลาสตัวควบคุม Magento ที่มีอยู่เพื่อดูว่าควรใช้แบบจำลองและระบบแม่แบบ / เค้าโครงอย่างไร