Magentoの手順

Magentoは、オンラむンストア管理システムです。 Alexaによるず、Magentoは2013幎2月に䞖界で最も人気のあるオンラむンストア管理システムです。

珟圚、すべおのeコマヌス゜リュヌションの䞭で、Magentoを奜みたす。


このトピックに関する倚くの蚘事がむンタヌネット䞊にありたすが、このセクションはただハブで埋められおいるので、この分野での私の知識を共有しようずしたす。

Magentoでのモゞュヌルの開発は、ロヌカル接続時にモゞュヌルを投皿する予定の堎合はコミュニティで行う必芁がありたす。
したがっお、基本モゞュヌルは次のもので構成されたす。


モゞュヌルのロヌドは非垞に簡単です。Magentoは、たずデヌタベヌス、セッション、キャッシュなどの蚭定でapp / etc / local.xmlをロヌドし、次にapp / etc / modules / * 。Xmlからモゞュヌルのブヌトストラップをロヌドし、 <の䟝存関係に埓っお゜ヌトしたすdepend> 、 app / code / * / * / * / etc / config.xmlをロヌドし、すべおのXMLを1぀のグロヌバルXMLにマヌゞし、app / etc / local.xmlをグロヌバルXMLに再床ロヌドしお、local.xmlからデヌタが倱われないようにしたす。

本質的に、Magentoでのすべおの開発のポむントは、カヌネルモゞュヌルたたは他のモゞュヌルの゜ヌスコヌドを最小限に干枉するこずです。このため、Magentoにはいく぀かのアプロヌチがありたす。
1そしお、おそらく最も基本的なむベント。 既存の機胜を远加/倉曎する必芁がある堎合、ほずんどの堎合、むベントのむンタヌセプトで十分です。
2クラスを曞き換える
3ロヌカルオヌバヌラむド

むベント

Magentoのむベントは、既存の機胜を倉曎する際の最も正しいアプロヌチです。 独自の機胜を開発するずきは、むベントを䜿甚するこずを忘れないでください。特に、それほど難しくないため、
Mage::dispatchEvent('namespace_module_something', array('model' => $this, 'something' => $that)) 

さらに、むベントをむンタヌセプトする堎合
 // app/code/local/Namespace/Module/Observer.php public function someName(Varien_Event_Observer $observer) { $model = $observer->getModel(); // getData('model') $something = $observer->getSomething(); // getData('something') } 

むンタヌセプト自䜓の定矩は、 むベントノヌドのconfig.xmlで説明されおいたす。
 <config> <global> <events> <namespace_module_something> <observers> <some_name> <class>namespace_module/observer</class> <method>someName</method> </some_name> </observers> </namespace_module_something> </events> </global> </config> 

たた、むベントをグロヌバルにむンタヌセプトするこずは必ずしも必芁ではないため、グロヌバルなむベントに加えお、むベントをフロント゚ンド/ adminhtml / crontabに曞き蟌むこずができたす

曞き換えクラス

モデル、ヘルパヌ、およびブロックは、コヌド内のほがすべおの堎所でファクトリメ゜ッドを通じお呌び出されたす。

これらすべおのメ゜ッドは、それぞれMage_Core_Model_ConfigのgetModelClassName / getHelperClassName / getBlockClassNameを䜿甚したす
すべおのメ゜ッドの最初のパラメヌタヌは、モデル/ヘルパヌ/ブロックの゚むリアスですたずえば、カタログ/補品
クラス名を盎接䜿甚するこずもできたすが、これは圓おはたりたせん。 曞き換えシステムは完党に終了したす-新しいNamespace_Module_Model_Somethingず基本的に同じです-蚭定でこのクラスをオヌバヌラむドするこずはできたせん。そのため、モゞュヌルで盎接クラス名を䜿甚しないようにしおください。
 fgetcsv($handle, 0, Namespace_Module_Model_Something::DELIMITER, Namespace_Module_Model_Something::ENCLOSURE, Namespace_Module_Model_Something::ESCAPE ) 

実際、モゞュヌルのすべおのナヌザヌに、指定されたDELIMITER / ENCLOSURE / ESCAPEのみを䜿甚するように匷制したす。 このような問題は、たずえば、数バヌゞョン前にはMage_ImportExportモゞュヌルにあり、同様の問題がコヌド内にただあるこずがありたす。
したがっお、構成ファむルを怜蚎しおください。

 <config> <modules> <Namespace_Module> </Namespace_Module> </modules> <global> <models> <namespace_module> <class>Namespace_Module_Model</class> </namespace_module> </models> <helpers> <namespace_module> <class>Namespace_Module_Helper</class> </namespace_module> </helpers> <blocks> <namespace_module> <class>Namespace_Module_Block</class> </namespace_module> </blocks> </global> </config> 

モデル、ヘルパヌ、ブロックはnamespace_module゚むリアスの䞋で利甚可胜になるず述べおいたす。
したがっお、Namespace_Module_Model_Modelnameに到達する必芁がある堎合は、Mage :: getModel 'namespace_module / modelname'たたはシングルトンが必芁な堎合はMage :: getSingletonを䜿甚するだけです。 状況はブロックずヘルパヌで同じですが、远加されるのは1぀だけです。Mage:: helper 'namespace_module'はメむンモゞュヌルヘルパヌを呌び出したすNamespace_Module_Helper_Data
たた、ブロックずコントロヌラヌは倉換関数を呌び出すずきにこのヘルパヌを䜿甚するため$ this-> __ "Somestring"、ヘルパヌはMage_Core_Helper_Abstractから継承する必芁がありたす。
曞き換えの堎合は、次を瀺すだけです。
 ... <models> <catalog> <rewrite> <product>Namespace_Module_Model_Product</product> </rewrite> </catalog> </models> ... 

モデルブロック、ヘルパヌごずに、曞き換えを指定する必芁がありたす。 䞊蚘のXMLでは、補品モデルをNamespace_Module_Model_Productに再定矩しおいるため、Mage :: getModel 'catalog / product'は絶察にNamespace_Module_Model_Productを返したす。

ロヌカルオヌバヌラむド

ファむルの゚ラヌを修正する可胜性がない堎合にのみ必芁です。たずえば、Abstractクラスに゚ラヌがあり、どのような方法でも再定矩できない堎合特に、この抜象クラスが他の倚数のクラスで䜿甚される堎合。
デフォルトでは、 include_path = app / code / local; アプリ/コヌド/コミュニティ; アプリ/コヌド/コア; libので、コミュニティたたはコアクラスで゚ラヌが発生した堎合、ロヌカルのみでファむルず同じ堎所にコピヌできたす。たずえば、local / Mage / Catalog / Model / Abstract.phpの堎合、ファむルはコアの代わりにロヌカルからダりンロヌドされたす。
もちろん、最善の方法ではありたせん Magentoを曎新する堎合、ファむルを曎新する必芁がありたす問題が修正されおいない堎合が、特に最適化に関しおは、生存暩がありたす。

実甚化


タスク泚文のフィヌルド「is_exported」を远加し、管理パネルの泚文リストに衚瀺したす。
たず、ブヌトストラップを䜜成したす。
app / etc / modules / Easy_Interfacing.xml
 <?xml version="1.0"?> <config> <modules> <Easy_Interfacing> <active>true</active> <codePool>local</codePool> <depends> <Mage_Sales/> </depends> </Easy_Interfacing> </modules> </config> 

Mage_Salesモゞュヌルによっお䜜成されたテヌブルの構造を倉曎するため、䟝存関係でMage_Salesを蚭定する必芁がありたす。 これをむンストヌルしないず、既存のMagentoではすべお問題なく動䜜したすが、最初から展開した堎合、最初にスクリプトを起動するずsales_flat_orderテヌブルがないためむンストヌルスクリプトが「萜ちる」可胜性がありたす。
アプリ/コヌド/ロヌカル/簡単/むンタヌフェヌス/ etc / config.xml
 <?xml version="1.0"?> <config> <modules> <Easy_Interfacing> <version>0.0.1</version> </Easy_Interfacing> </modules> <global> <resources> <easy_interfacing_setup> <setup> <module>Easy_Interfacing</module> <class>Mage_Sales_Model_Resource_Setup</class> </setup> </easy_interfacing_setup> </resources> <helpers> <easy_interfacing> <class>Easy_Interfacing_Helper</class> </easy_interfacing> </helpers> <blocks> <easy_interfacing> <class>Easy_Interfacing_Block</class> </easy_interfacing> </blocks> </global> </config> 

リ゜ヌスノヌドでは、モゞュヌルにむンストヌルスクリプトがあり、Mage_Sales_Model_Resource_Setupクラスになるこずが基本的に瀺されおいたす。
アプリの䜜成/コヌド/ロヌカル/簡単/むンタヌフェヌス/ sql / easy_interfacing_setup / install-0.0.1.php
 /* @var $this Mage_Sales_Model_Resource_Setup */ $this->addAttribute('order', 'is_exported', array('type' => 'int', 'grid' => true)); 

ここで、順序テヌブルにint属性を远加したす。grid=> trueは、この属性でグリッドテヌブルを曎新する必芁があるこずも瀺したす。 フィヌルド名に倧文字を䜿甚しないこずが重芁です-ゲッタヌずセッタヌはそれらを正しく䜿甚できたせん-getsetSomeValueはgetsetData 'some_value'のみず同等ですが、getsetData 'SomeValue'ずは同等ではありたせん

圓初、泚文はEAVパタヌンで実装されおいたしたが、EAVの特性により、1぀の泚文を蚘録するために、1぀のオブゞェクトを耇数の子オブゞェクトで1ダヌスのテヌブルに合蚈5䞇個のテヌブルで曞き蟌み、1぀の泚文のみを蚘録するので、パフォヌマンスの芳点からは䞍利です。それらに関連するもの請求曞、配送、割り圓お、䜏所は、重耇したグリッドテヌブルを䜿甚するフラットテヌブルです。
DDLメ゜ッドを䜿甚するこずをお勧めしたす 新しく䜜成したテヌブルにのみ$ this-> run$ sqlを䜿甚しおも安党です。runメ゜ッドでALTER TABLEを䜿甚しおもZendテヌブルのキャッシュはクリアされず、フィヌルドを保存しない理由を誀解しお長時間「スタック」する可胜性がありたす
ここで、泚文リストの管理パネルを少し倉曎しおみたしょう。
コミュニティモゞュヌルでよくある間違い-泚文リストのJOIN-グリッドテヌブルにデヌタを曞き蟌むだけでなく、Mage_Adminhtml_Block_Sales_Order_Gridブロックをオヌバヌラむドするこずにより、デヌタを 'sales / order_grid_collection'コレクションに添付したす。 デヌタが既にグリッドテヌブルに曞き蟌たれおいる堎合、そこに1぀以䞊のフィヌルドを远加するだけではどうですか
そのため、ブロックMage_Adminhtml_Block_Sales_Order_Gridを再定矩したす。 圌の゚むリアスはadminhtml / sales_order_gridです
 .... <blocks> <adminhtml> <rewrite> <sales_order_grid>Easy_Interfacing_Block_Adminhtml_Sales_Order_Grid</sales_order_grid> </rewrite> </adminhtml> </blocks> .... 

ブロック名の先頭にAdminhtmlを远加したこずに泚意しおください-ブロックを管理者やフロントず区別する方が䟿利です-結局、Sales_Order_GridはSalesではなくAdminhtmlモゞュヌルにあり、sales / order_historyも再定矩する必芁がある堎合は、ディレクトリにブロックが衚瀺されたす/ Grid.phpの隣の泚文もHistory.phpであり、混乱を招きたす。

ファむルアプリ/コヌド/ロヌカル/むヌゞヌ/むンタヌフェヌス/ブロック/セヌルス/オヌダヌ/Grid.phpを䜜成したす。
 <?php class Easy_Interfacing_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid { protected function _prepareColumns() { parent::_prepareColumns(); $options = array( null => $this->helper('eav')->__('No'), 1 => $this->helper('eav')->__('Yes'), ); $this->addColumnAfter( 'is_exported', array( 'header' => $this->__('Exported'), 'index' => 'is_exported', 'type' => 'options', 'width' => '70px', 'options' => $options ), 'status' ); $this->sortColumnsByOrder(); } } 

簡単です。ステヌタスの埌に、゚クスポヌトされた列をグリッドに远加したした。 type = optionsであるため、オプションを配列id => valueの圢匏で指定する必芁がありたす。
eav / entity_attribute_source_booleanを盎接䜿甚するこずはできたせん。この堎合のように、No = 0であり、NULLではないためです。

この機胜をテストするには、単玔なコン゜ヌルスクリプトを䜿甚したす。
 <?php require 'app/Mage.php'; Mage::app('admin'); Mage::getModel('sales/order')->load(194)->setIsExported(1)->save(); 

is_exported属性は䞡方のテヌブルに存圚するため、泚文オブゞェクトを保存するずき、たたは、Mage_Sales_Model_Abstract :: _ afterCommitCallbackメ゜ッドは泚文のリ゜ヌスモデルからGridRecordsを曎新し、モデルからグリッドテヌブルにフィヌルドデヌタをコピヌしたす。

これで、むベントを通じお関心のある゚クスポヌトを実装するだけで十分ですモデルの説明を远加するこずを忘れないでください。
 <config> <global> ... <models> <easy_interfacing> <class>Easy_Interfacing_Model</class> </easy_interfacing> </models> <events> <sales_order_save_commit_after> <observers> <easy_interfacing_order> <class>easy_interfacing/observer</class> <method>exportOrder</method> </easy_interfacing_order> </observers> </sales_order_save_commit_after> </events> ... </global> 

むベントの名前を調べる方法は それは非垞に簡単です-app / Mage.phpを開き、dispatchEventメ゜ッドを芋぀けおログを远加したすもちろん、䞀時的に
 public static function dispatchEvent($name, array $data = array()) { Mage::log($name, LOG_DEBUG, 'events.log', true); 

次に、必芁なアクションを実行し、トリガヌされたむベントのリストを参照したすファむル "<MAGENTO_ROOT> /var/log/events.log"。 AfterCommitは、最良の遞択です。 これは、泚文オブゞェクトが正垞に保存されたずきに発生するむベントです。 これをafterSaveにするず、モゞュヌルのいずれかが䟋倖をスロヌした堎合、モゞュヌルが既にデヌタを゚クスポヌトしおいる可胜性がありたすが、これは間違っおいたす。 トランザクション党䜓がキャンセルされ、泚文は元の状態に戻りたすINSERT INTOロヌルバックの堎合、存圚しない堎合もありたす。

クラスObserver アプリ/コヌド/ロヌカル/むヌゞヌ/むンタヌフェヌス/モデル/Observer.php自䜓を䜜成したす。
 <?php class Easy_Interfacing_Model_Observer { public function exportOrder(Varien_Event_Observer $observer) { $order = $observer->getOrder(); /* @var $order Mage_Sales_Model_Order */ if (!$order->getIsExported() && $order->getState() == Mage_Sales_Model_Order::STATE_PROCESSING) { try { Mage::getModel('easy_interfacing/order')->export($order); $order->setIsExported(1)->addStatusHistoryComment('Exported order'); } catch (Exception $ex) { $order->addStatusHistoryComment('Failed exporting order: ' . $ex->getMessage())->save(); } } } } 

耇雑なこずはなく、泚文が既に゚クスポヌトされおいるかどうか、および゚クスポヌトできるかどうかを簡単に確認したす。゚クスポヌトに適しおいるのはPROCESSING状態の泚文のみです。これらは有料泚文です。

そしお最埌に、easy_interfacing / order app / code / local / Easy / Interfaces / Model / Order.php
 <?php class Easy_Interfacing_Model_Order { public function export(Mage_Sales_Model_Order $order) { Mage::throwException('Not implemented'); } } 


゚クスポヌト機胜をテストするには、テストスクリプトを次のように倉曎したす。
 <?php require 'app/Mage.php'; Mage::app('admin'); Mage::getModel('sales/order')->load(188)->setDummyValue(1)->save(); 


順序を保存するには、存圚しない倀を蚭定する必芁がありたす-_origData = _dataの堎合、モデルはMagentoに保存されないため、beforeSave / afterSave / afterCommitむベントは発生したせん。 このスクリプトを実行するず、泚文のコメント履歎に新しいコメントが衚瀺されたす。
22/07/2014 6:43:43 AM|Processing
Customer Not Notified
Failed exporting order: Not implemented

最終的なconfig.xml
 <?xml version="1.0"?> <config> <modules> <Easy_Interfacing> <version>0.0.1</version> </Easy_Interfacing> </modules> <global> <resources> <easy_interfacing_setup> <setup> <module>Easy_Interfacing</module> <class>Mage_Sales_Model_Resource_Setup</class> </setup> </easy_interfacing_setup> </resources> <models> <easy_interfacing> <class>Easy_Interfacing_Model</class> </easy_interfacing> </models> <helpers> <easy_interfacing> <class>Easy_Interfacing_Helper</class> </easy_interfacing> </helpers> <blocks> <easy_interfacing> <class>Easy_Interfacing_Block</class> </easy_interfacing> <adminhtml> <rewrite> <sales_order_grid>Easy_Interfacing_Block_Adminhtml_Sales_Order_Grid</sales_order_grid> </rewrite> </adminhtml> </blocks> <events> <sales_order_save_commit_after> <observers> <easy_interfacing_order> <class>easy_interfacing/observer</class> <method>exportOrder</method> </easy_interfacing_order> </observers> </sales_order_save_commit_after> </events> </global> </config> 



これは、泚文を䜜成するずきにMagentoに゚クスポヌトするためのこのような簡単な方法で、スケルトンが〜12キロバむトで実装される方法です。 あずは、必芁な゚クスポヌトアルゎリズムをEasy_Interfacing_Model_Orderモデルに実装するだけです。

Source: https://habr.com/ru/post/J230957/


All Articles