1. ホーム
  2. php

[解決済み】Magentoでシンプルな'Hello World'モジュールを作成する方法は?

2022-04-14 11:05:28

質問

Magentoで以下のことを実現するにはどうしたらよいでしょうか。

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

  • このコントローラ (または必要に応じて新しいコントローラ) に、モデルと対話し、クエリを実行するメソッドを追加するには、どうすればよいでしょうか? Select * FROM articles where id='10' を含む)行を返し、その行の id, title, content ) をコントローラに渡すのですか?そして、そのコントローラを使用して、この行を表示するビューをインクルードします。つまり http://example.com/myController/show_row (または同様の何か)は、ビューの中に行を表示します。(派手さは必要なく、単に echo $row->id; などが考えられます)。

その他、Magentoのコード構造に関する情報もあれば、とても助かります。

解決方法は?

まず、何よりもおすすめなのは、「Skype」の購入です。 PHPアーキテクトのPDF/E-Book . 20ドルですが、私が見つけた中で唯一わかりやすい「Magentoの仕組み」資料です。また、私は 自分のサイトでMagentoのチュートリアル .

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

第三に、MagentoのMVCは、MagentoのMVCと同じように、MagentoのMVCと異なる。 ルビーオンレイルズ , Django , CodeIgniter , CakePHP など。最近、PHP開発者に人気のMVCモデル。をベースにしていると思います。 ゼンド というモデルで、全体的にJava OOP的なんです。そこには コントローラに気を配る必要があります。module/frontName コントローラと、MVC コントローラです。

第四に、Magento のアプリケーション自体は、あなたが使うのと同じモジュールシステムを使って構築されているので、コアコードをつつくことは、学習戦術として有効です。また、Magento で行うことの多くは オーバーライド 既存のクラスです。ここで取り上げているのは 作成 をオーバーライドするのではなく、新しい機能を提供します。コードサンプルを見るときは、このことを念頭に置いてください。

まず最初の質問から、特定の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 は、あなたの修正のためのユニークな名前空間です。あなたの会社の名前である必要はありませんが、magento の推奨規則です。 HelloWorld はモジュールの名前です。

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

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

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

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

  1. システム設定に移動します。
  2. 詳細設定]をクリックします。
  3. Disable modules output"設定ボックスで、"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>

ここで言っているのは、"helloworldのfrontNameを持つすべての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 なぜなら、URLの2番目の部分は常にcontrollerNameであるからです。 この挙動は、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 コントローラクラスを見てみることをおすすめします。