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


305

Magentoで以下を実現するにはどうすればよいですか?

  • コントローラ、ビュー、モデルのアプローチを使用して「Hello World」メッセージを表示します。だから、私がhttp://example.com/myControllerそれに行った場合、文字列「Hello World」が表示されます。この文字列を自分のWebサイトのテンプレート(ヘッダー、フッターなど)内に表示できると、さらに便利です。

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

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


6
システムが報奨金を調整していないようです。
アランストーム

2
賞金は48時間前ではまだ開けません。ただし、できる限り早く開き、ベストアンサーに賞金を授与します
Upvote

ああ、私は報酬が古い投稿にのみ適用されることを知らなかった、謝罪。
アランストーム

3
子供の頃、彼は常にマジェントに引力を与えていました。彼のコードは同じように動作します。
vol7ron

回答:


539

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

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

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

第4に、Magentoアプリケーション自体は、使用するのと同じモジュールシステムを使用して構築されているため、コアコードを調べることは、学習に役立つ方法です。また、Magentoで行うことの多くは、既存のクラスをオーバーライドすることです。ここで取り上げるのは、オーバーライドするのではなく、新しい機能を作成することです。そこにあるコードサンプルを見るときは、このことを覚えておいてください。

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

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

最後の免責事項。Magentoを2週間から3週間使用しているため、注意が必要です。これは、Stack Overflowを支援するのと同じくらい、頭の中でこれをまっすぐにするための練習です。

モジュールを作成する

Magentoへのすべての追加とカスタマイズは、モジュールを通じて行われます。したがって、最初に行う必要があるのは、新しいモジュールを作成することです。app/modules次のようにnamedでXMLファイルを作成します

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

ここで設定したのは、モジュール/ 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、次のように明示的にこのコントローラを呼び出す必要があります。URL の2番目の部分は、現在も、これも常にcontrollerNameであるためです。この動作は、MagentoにバンドルされているZend Frameworkの継承です。

これで、次のURLにアクセスして、エコーステートメントの結果を確認できるようになります。

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コントローラークラスを突いて、モデルとテンプレート/レイアウトシステムの使用方法を確認することをお勧めします。


4
ありがとう、これはとても役に立ちます。回答を完成させるために、モデル/データベースとビューの使用に関する情報を追加することを検討してください
Upvote

7
app / code / local / MyCompanyName / HelloWorld / etc / config.xmlがetc / modules(MyCompanyName_HelloWorld NOT mycompanyname_helloworldではない)にあるxmlと同じケースになっていることを確認してください。そうでない場合、バックエンドのエントリに存在します。
モーク

8
Alanの完全な回答についての小さなコメントがあります。「セットアップしたのはモジュール/ frontNameコントローラーです。これはMVCコントローラーではありません。」FooControllerとまったく同じタイプのコントローラーです。ZFでは、IndexControllerのインデックスアクションがデフォルトで呼び出されるため、example.com / magento / index.php / helloworld をリクエストすると、helloworldモジュールのIndexController :: indexAction()が呼び出されます。したがって、... / helloworld / fooを呼び出すと、helloworldモジュールでFooControllerが検索され、その上でindexAction()が呼び出されます。IndexController :: fooAction()をトリガーするには、リクエストする必要があります:... / helloworld / index / foo。
Matus Zeman

2
@Matus Zemanからの応答を読んで、IndexControllerでfooActionが見つからなかった理由を理解していることを確認してください。これは単なる「通常の」Zend Framework MVC /ルーターのものであり、不正なURLを使用したため、「これはMVCコントローラー」の部分をご回答ください。
regilero

2
@ hypervisor666「開発者モード」をオンにします(Google it)。開発者モードがオンの場合、MagentoはXMLファイルのエラーでクラッシュします。
アランストーム2013年

39

私は先月かそこらの間Magentoと格闘してきました、そして私はまだそれを理解しようとしています。だから、これはブラインドをリードするブラインドのケースです。ドキュメンテーションの方法がほとんどなく、フォーラム/ウィキはせいぜい無秩序です。それだけでなく、時代遅れであるか、最適とはほど遠いソリューションがいくつかあります。あなたがプロジェクトを持っているのか、それを理解しようとしているだけなのかはわかりませんが、何か新しいものを作成するのではなく、既存の機能を変更することから始めた方が簡単でしょう。そのためには、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ます。これは汎用クラス(スイスのアーミーナイフのようなもの)であり、その目的は、独自のメソッド/変数をその場で定義できるようにすることです。たとえば、あるメソッドから別のメソッドにデータを渡すために、それが栄光の配列として使用されているのがわかります。

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

$thisたくさん使われているのがわかります。表示するファイルに応じて、異なるクラスを意味します。get_class($this)特にFirePHPと一緒にあなたの友達です。

紙に書き留めます。たくさん。あなたがそれらに遭遇してから1〜2日後に必要になる、無数の小さなファクトイドがあります。

MagentoはOOが大好きです。メソッドをトレースすることで5〜10の異なるクラスを実行しても驚かないでください。

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

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


できればもっと投稿してください。すべての情報が非常に参考になります:)
クリックUpvote

ミサ、おそらくここでStackoverflowに登録する必要があります。もしCookieを失った場合、担当者はすべて消えてしまいます;)
Upvote

ありがとうございました!これは非常に役立ちます。Ner
Ner

2

私はむしろMage2Genをお勧めします。これはボイラープレートを生成するのに役立ち、コアビジネスロジックに集中することができます。物事をスピードアップするのに役立ちます。


0

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

magaplaza hello worldチュートリアルからモジュールを作成しようとしましたが、問題が発生しました。このモジュールhttps://github.com/astorm/magento2-hello-worldのコードをgithubからインポートしました。そのモジュールから、カテゴリサブカテゴリajax選択ドロップダウンモジュールを作成しました。あなたのmagento2インストールのAAP /コードのディレクトリにインストールした後、このURLに従ってください。.. http://www.example.com/hello_mvvm/hello/world あなたはここからそのコードをダウンロードすることができますhttps://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns それをaap / codeフォルダーに配置します。これらのコマンドを実行するより...

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

これで、次のURL http:// {{www.example.com}} / hello_mvvm / hello / worldでモジュールの機能を確認できます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.