web-dev-qa-db-ja.com

Magentoで簡単な「Hello World」モジュールを作成するにはどうすればよいですか?

Magentoで次のことをどのように達成できますか?

  • コントローラー/ビュー/モデルのアプローチを使用して、「Hello World」メッセージを表示します。したがって、http://example.com/myControllerに移動すると、文字列「Hello World」が表示されます。私のウェブサイトのテンプレート(たとえば、ヘッダー、フッターなど)内でこの文字列を表示できることはボーナスです。

  • モデルと対話し、クエリSelect * FROM articles where id='10'を実行して行(列id, title, contentを含む)をコントローラーに返すメソッドを、このコントローラー(または必要に応じて新しいコントローラー)に追加するにはどうすればよいですか?次に、コントローラーを使用して、この行を表示するビューを組み込みます。したがって、http://example.com/myController/show_row(または同様のもの)に移動すると、ビュー内に行が表示されます。 (派手である必要はありません。echo $row->id;または同様の何かが機能します。)

Magentoのコード構造に関するその他の情報も非常に役立ちます。

300
Click Upvote

何よりもまず、 PDF/E-BookをPHP Architectから購入することを強くお勧めします 。それは20米ドルですが、私が見つけることができた唯一の単純な「Magentoの仕組み」リソースです。私も書き始めました 自分のウェブサイトでのマゼンタのチュートリアル

第二に、選択があり、経験豊富なプログラマーではない場合、または経験豊富なプログラマーにアクセスできない場合(理想的にはPHPandJava) 、別のカートを選択。 Magentoは十分に設計されていますが、他のプログラマーがモジュールを構築できるショッピングカートソリューションになるように設計されています。賢いがプログラマーではない人々に簡単に理解できるように設計されていません。

第三に、Magento MVCは Ruby on RailsDjangoCodeIgniterCakePHP などとは大きく異なります。MVC最近PHP開発者に人気のあるモデル。 Zend モデルに基づいていると思いますが、全体は非常にJava OOPに似ています。心配する必要のあるtwoコントローラーがあります。 module/frontNameコントローラー、そしてMVCコントローラー。

第4に、Magentoアプリケーション自体は、使用するモジュールシステムと同じものを使用して構築されているため、コアコードを確認することは学習に役立ちます。また、Magentoで行うことの多くは、既存のクラスをoverridingすることです。ここで取り上げているのは、creating新しい機能であり、オーバーライドすることではありません。そこにあるコードサンプルを見ているときは、このことに留意してください。

最初の質問から始めて、特定のURLに応答するようにコントローラー/ルーターをセットアップする方法を示します。これは小さな小説になります。モデル/テンプレート関連のトピックについては後で時間がありますが、今のところはありません。ただし、SQLの質問について簡単に説明します。

Magentoは EAV データベースアーキテクチャを使用します。可能な限り、システムが提供するモデルオブジェクトを使用して、必要な情報を取得してください。 SQLテーブルにすべて揃っていることは知っていますが、生のSQLクエリを使用してデータを取得することを考えないことが最善です。

最終免責事項。 Magentoを2〜3週間使用しているので、注意が必要です。これは、Stack Overflowを支援するのと同じくらい、私の頭の中でこれをまっすぐにするエクササイズです。

モジュールを作成する

Magentoへのすべての追加とカスタマイズは、モジュールを介して行われます。したがって、最初に行う必要があるのは、新しいモジュールを作成することです。次のような名前の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は、変更のための一意の名前空間です。会社の名前である必要はありませんが、推奨される慣例は私の名前です。 HelloWorldはモジュールの名前です。

アプリケーションキャッシュをクリアする

モジュールファイルが配置されたので、Magentoにそのことを知らせる必要があります(作業を確認します)。管理アプリケーションで

  1. [システム]-> [キャッシュ管理]に移動します
  2. [すべてのキャッシュ]メニューから[更新]を選択します
  3. [キャッシュ設定を保存]をクリックします

今、Magentoがモジュールについて知っていることを確認します

  1. [システム]-> [構成]に移動します。
  2. 詳細設定をクリックします
  3. 「モジュール出力を無効にする」設定ボックスで、「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

そして、構成ファイル内に、基本的に「空の」構成である以下を追加します。

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

ここで言うのは、「frontNameがhelloworldのURL ...

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

ここで設定したのは、module/frontNameコントローラーです。これは、モジュールのデフォルトのコントローラーおよびデフォルトのアクションです。コントローラまたはアクションを追加する場合、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と一致し、IndexControllerのアクションfooActionとは一致しません。 fooActionが必要な場合は、コントローラーIndexControllerで、このコントローラーを次のように明示的に呼び出す必要があります。http://example.com/magento/index.php/helloworld/index/fooこの動作は、MagentoにバンドルされているZend Frameworkの継承です。

これで、次の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

そのため、Magentoがどのようにコントローラーにディスパッチするかについての基本的なアイデアが得られるはずです。ここから、既存のMagentoコントローラークラスを調べて、モデルとテンプレート/レイアウトシステムの使用方法を確認することをお勧めします。

532
Alan Storm

私は先月かそこらの間Magentoと格闘してきましたが、まだ解明しようとしています。これがブラインドを導くブラインドの例です。文書化の方法はほとんどなく、フォーラム/ wikiはせいぜい混oticとしているだけです。それだけでなく、時代遅れのソリューションや最適化にはほど遠いソリューションがいくつかあります。プロジェクトがあるのか​​、それとも理解しようとしているのかはわかりませんが、完全に新しいものを作成するのではなく、既存の機能の変更から始めた方がおそらく簡単です。そのためには、wikiの「開発者向けの推奨記事」に間違いなく行きます。新しい支払い方法の1つは、目を見張るものでした。

デバッグについては FirePHPを使用 をお勧めします。何か問題が発生した場合はHTMLソースを確認します。 ole echoデバッグメソッドは、実際にはそれほどうまく機能しません。

一般的なアーキテクチャは非常に複雑なため、完全に理解できたとしても、それをカバーする本を書く必要があります。私ができる最善のことは、私が最初に始めたときに誰かが私に与えてくれたことをあなたにアドバイスすることです...

コアファイルには近づかないでください。それらを変更せずに、独自のモジュールを作成し、必要なものをオーバーライドします。

Magentoは、XMLで構成される構成ファイルを使用して、必要な処理を決定します。コア機能とは対照的に独自のものを実行できるようにするには、正しいxmlが必要です。残念ながら、XMLの作成方法に関するガイドはありません。例を見て、いくつかの深刻なテストを行う必要があります。物事を複雑にするために、これらのファイルのコンテンツは大部分が大文字と小文字を区別します。ただし、これらをマスターすれば、非常に強力なシステムを実現する基本機能の一部をオーバーライドできます。

Magentoは、Mage::getModel('mymodel')Mage::getSingleton('mysingleton')Mage::helper('myhelper')などのメソッドを使用して、特定のクラスのオブジェクトを返します。コア名前空間でデフォルトでこれらを見つけます。独自のものを使用する場合は、config.xmlファイルでこれらをオーバーライドする必要があります。

クラスの名前は、クラスが入っているフォルダーに対応している必要があります。

Magentoのオブジェクトの多くは、最終的にVarien_Objectと呼ばれるものを拡張します。これは汎用クラス(スイスアーミーナイフのようなもの)であり、その目的は、独自のメソッド/変数をオンザフライで定義できるようにすることです。たとえば、あるメソッドから別のメソッドにデータを渡すために、それが栄光化された配列として使用されていることがわかります。

開発中は、キャッシュが無効になっていることを確認してください。 magentoを耐え難いほど遅くしますが、それはあなたの頭のトラウマ(あなたの机の上でそれを叩くから)の多くを救います。

$thisが頻繁に使用されていることがわかります。表示するファイルに応じて異なるクラスを意味します。 get_class($this)は、特にFirePHPと組み合わせた場合の友達です。

紙に書き留めてください。たくさん。あなたがそれらに遭遇した後1-2日を必要とするつもりである無数の小さなファクトイドがあります。

Magentoはオブジェクト指向が大好きです。メソッドをトレースすると、5〜10の異なるクラスが表示されることに驚かないでください。

デザイナーズガイドを読む こちら 。これは主にグラフィックデザイナーを対象としていますが、モジュールからの出力がどこで、なぜ終わるのかを理解する必要があります必要です。そのため、管理パネルの開発者セクションで「テンプレートパスヒント」をオンにすることを忘れないでください。

他にもありますが、これが論文になる前にここでやめます。

38

Mage2Gen をお勧めします。これは定型文の生成に役立ち、コアビジネスロジックに集中できます。それは単に物事をスピードアップするのに役立ちます。

2
Sajid

Magentoモジュールは、特定のストア機能を作成するために必要なブロック、コントローラー、ヘルパー、およびモデルを含むディレクトリのグループです。これは、Magentoプラットフォームのカスタマイズの単位です。ユーザーエクスペリエンスと店頭の外観に影響を与えるサポートロジックを備えた複数の機能を実行するMagentoモジュールを作成できます。これらのインストール、削除、または無効化を可能にするライフサイクルがあります。マーチャントとエクステンション開発者の両方の観点から、モジュールはMagentoプラットフォームの中心的なユニットです。

モジュールの宣言

構成ファイルを使用してモジュールを宣言する必要があります。 Magento 2として、モジュールのetcディレクトリで構成モジュールを検索します。そこで、構成ファイルmodule.xmlを作成します。

コードは次のようになります。

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

モジュールの登録モジュールは、Magento Component Registrarクラスを使用してMagento 2システムに登録する必要があります。ここで、モジュールのルートディレクトリにregistration.phpファイルを作成します。

app/code/Cloudways/Mymodule/registration.php

コードは次のようになります。

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

モジュールステータスの確認上記の手順を実行すると、簡単なモジュールが作成されます。次のコマンドラインを使用して、モジュールのステータスと、モジュールが有効か無効かを確認します。

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

完全なプロセスを完了したら、フィードバックを共有してください

0