[解決済み】Magentoでシンプルな'Hello World'モジュールを作成する方法は?
質問
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 にそれを知らせる必要があります(そして、私たちの作業を確認する)。管理アプリケーションで
- システム->キャッシュ管理に移動します。
- すべてのキャッシュ]メニューから[更新]を選択します
- キャッシュの設定を保存する」をクリックします。
ここで、Magentoがこのモジュールについて知っていることを確認します。
- システム設定に移動します。
- 詳細設定]をクリックします。
- 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 コントローラクラスを見てみることをおすすめします。
関連
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み】Fatal error: mysqli_result 型のオブジェクトは使用できません [終了] 。
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】「初期通信パケットの読み込み」でMySQLサーバーに接続できなくなり、システムエラーになる。0
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?