309

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そのため、 (または同様のもの)に行くと、ビュー内に行が表示されます。(空想する必要はありません。単に aecho $row->id;または同様のものが機能します。)

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

4

6 に答える 6

544

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

第二に、選択肢があり、経験豊富なプログラマーではない場合、または経験豊富なプログラマー (理想的には PHPJava) にアクセスできない場合は、別のカートを選択してください。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次のように名前付きで 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 は変更のための一意の名前空間です。会社の名前である必要はありませんが、推奨される規則は my magento です。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>

ここで言っているのは、「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 番目の部分が常にコントローラー名であるためです。この動作は、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 コントローラー クラスを調べて、モデルとテンプレート/レイアウト システムの使用方法を確認することをお勧めします。

于 2009-02-26T01:07:06.960 に答える
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. これは汎用クラス (スイス アーミー ナイフのようなもの) であり、その目的は、その場で独自のメソッド/変数を定義できるようにすることです。たとえば、あるメソッドから別のメソッドにデータを渡すための美化された配列として使用されることがわかります。

開発中は、キャッシュが無効になっていることを確認してください。これにより、magento は耐え難いほど遅くなりますが、(机に叩きつけることによる) 頭部外傷を大幅に減らすことができます。

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

紙に書き留めます。多くの。出会ってから 1 ~ 2 日で必要になる小さなファクトイドが無数にあります。

Magento は OO が大好きです。メソッドのトレースで 5 ~ 10 の異なるクラスが表示されても驚かないでください。

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

まだまだありますが、論文になる前にここでやめておきます。

于 2009-02-25T11:09:50.607 に答える