Magentoのプログラミングモジュールでの経験を共有したいと思います。
私を招待し
てくれたjejeに感謝し
ます 。
この記事では、顧客登録の追加機能を実装するモジュールの作成について詳しく説明します。 目的-最初から最後まで具体的な例を使用してMagentoの開発のアイデアを示し、主なアプローチ、コードの構成を示し、いくつかの機能を指摘します。 この記事は、より初心者を対象としていますが、Magentoに精通している人は、自分にとって役立つものを作ることができます。 もちろん、すべてを1つの記事で説明することはできませんが、トピックが必要な場合は、これが一連の記事の始まりかもしれません。
次の点が言及されています。
- モジュール作成
- ブロック、テンプレート、レイアウトを使用する(レイアウト)
- コントローラーのオーバーライド
- モジュールインストールスクリプト
その結果、CAPTCHAチェック、グループ選択フィールド、招待コードの保存を含む登録を受け取ります。
何を考えているの
登録ページ/ magento /顧客/アカウント/作成があります。 CAPTCHAチェックを追加し、クライアントにグループと招待コードを要求します。 受信したデータはデータベースに保存されます。 デフォルトでは、Magentoは3つの顧客グループ、一般、卸売、小売業者を定義します。 これらのうち、将来のクライアントを選択することを提案します。 Magentoは招待コードについて何も知りません。新しい属性を作成します。
これは
既成のソリューションでは
なく、プレゼンテーションを簡単にするために作成された単なる例です。
検索する
テンプレートファイルの場所、登録データの保存場所、保存方法を探しています。
- 顧客登録フォームテンプレート
/magento/app/design/frontend/default/default/template/customer/form/register.phtml
登録フォーム
- モジュールインストーラーに属性が追加されます。例:
/magento/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-0.8.7-0.8.8.php
詳細については、モジュールのインストーラーを作成するときに説明します。 - モジュール構成に変数フィールド(属性)の説明があります。
/magento/app/code/core/Mage/Customer/etc/config.xml
<fieldsets>
タグ内
- 登録フォームは次の場所にデータを投稿します。
http:// localhost / magento / customer / account / createpost /
したがって、リクエストはコントローラーによって処理されますMage_ Customer _ Account ControllerメソッドcreatePostアクション(行番号234)
実装
見つかったファイルを変更するオプションは考慮されません。 独自のテーマとモジュールを作成します。
テーマはシンプルです:
- / magento / app / design / frontend / default / mythemeに新しいフォルダーを作成します
デフォルト -インターフェース名
mythemeはテーマの名前です
- ディレクトリ構造を維持しながらファイルを新しいトピックにコピーします
- 必要に応じてテンプレートを編集/作成します
同じ名前のテンプレートは、標準テーマのテンプレートと重複しています。 したがって、「ネイティブ」のMagentoファイルは変更しません。
モジュールがもう少し面白いと:
新しいモジュール
CustomerModを作成します。 すべてのモジュールのフォルダー構造は同じです:
magento /アプリ/コード/ローカル/
例
CustomerMod
-ブロック
-など
-ヘルパー
-モデル
-SQL
モジュールの説明を含むファイルを追加することを忘れないでください:
magento / app / etc / modules / Examples_All.xml <構成>
<モジュール>
<Examples_CustomerMod>
<active> true </ active>
<codePool>ローカル</ codePool>
</ Examples_CustomerMod>
</モジュール>
</ config>
登録ページのフィールド
登録ページにグループ選択フィールド(「一般」、「卸売」、「小売店」)を追加することから始めましょう。 情報を表示するために、Magentoはブロックとテンプレートを使用して動作します。 ブロックはテンプレートレンダラーと呼ばれます。 各ページはブロックで構成され、ブロックごとにテンプレートが指定されます。
登録フォームのブロック内にテンプレートを使用してブロックを追加します。 つまり、ブロックはフォームブロックの子になります。
1.実際には新しいテンプレート
別のファイルのグループ選択テンプレート:
/magento/app/design/frontend/default/example_theme/template/customer/form/register/groupselect.phtmlシンプルなコンテンツ:
<?php $ customer_groups = Mage ::ヘルパー( 'customer')-> getGroups()-> toOptionArray(); ?>
<fieldset class = "group-select">
<h4 class = "legend"> <?php echo $ this-> __( 'Customer Group')?> </ h4>
<ul>
<?php foreach($ customer_groups as $ cg){?>
<li class = "f-left" style = "margin:2px 4px;" >
<入力タイプ=「無線」名前=「グループID」ID =「グループID」
値= "<?php echo $ cg ['value'];?>"
<?php if($ cg ['value'] == 1)echo 'checked = 1'?> />
<label> <?php echo $ cg ['label']; ?> </ label>
</ li>
<?php} // foreachを終了しますか?>
</ ul>
</ fieldset>
フィールド「group_id」の名前は、属性の名前と一致する必要があります。
2.レイアウトの調整
ブロックの相互配置とテンプレートへのバインドは、レイアウトで説明されています。 これらは、
magento/app/design/_/_/layout
あるxmlファイル
magento/app/design/_/_/layout
。
この場合、次のようになります。
/magento/app/design/frontend/default/example_theme/layout/customermod.xml <レイアウトバージョン= "0.1.0">
<customer_account_create>
<参照名= "customer_form_register">
<block type = "core / template" name = "customergroups-select" template = "customer / form / register / groupselect.phtml" />
<block type = "captcha / recaptcha" name = "captcha" />
</参照>
</ customer_account_create>
</ layout>
customer_form_register
ブロックを参照し
customer_form_register
。 内部に子ブロックを記述します:
typeは、最終的にテンプレートをレンダリングするブロックのクラスです。 この場合、「コア/テンプレート」、つまり
Mage_Core_Block_Template
を意味し
Mage_Core_Block_Template
。
name-名前は何でもかまいません。 参照などでブロックを参照する必要があります。
テンプレート -ブロックテンプレート
Magentoが
customermod.xml
指定された変更を考慮するように、モジュールの構成でレイアウトの更新を指定することを忘れないでください。
/magento/app/code/local/Examples/CustomerMod/etc/config.xml <フロントエンド>
<レイアウト>
<更新>
<customermod>
<file> customermod.xml </ file>
</ customermod>
</ updates>
</ layout>
</ frontend>
3.親ブロックによるブロック出力。
getChildHtml(BLOCK_NAME)メソッドを使用して親の子ブロックを「呼び出す」必要があるため、ブロックはまだ表示されていません。
register.phtml
を
デフォルトのテーマからテーマにコピーし、
ログイン情報セクションの前に必要な呼び出しを追加し
ます 。
/magento/app/design/frontend/default/example_theme/template/customer/form/register.phtml ...
<?php echo $ this-> getChildHtml( 'customergroups-select')?>
<fieldset class = "group-select wide">
<h4 class = "legend"> <?php echo $ this-> __( 'Login Information')?> </ h4>
...
4.データの保存
登録フォームにグループの選択が表示されます。
「しかし、顧客は「小売業者」に登録します-そして、管理パネルでは、彼はまだ一般グループにいます!」-はい、
group_id
フィールドは保存されません。
入力したフィールドを保存するには、設定のフィールドセットでそれらを指定する必要があります。
/magento/app/code/local/Examples/CustomerMod/etc/config.xml <フィールドセット>
<customer_account>
<group_id> <create> 1 </ create> <update> 1 </ update> </ group_id>
</ customer_account>
</ fieldsets>
理由-Magentoの開発者に尋ねてください-しかし、これがカスタマーコントローラーの設計方法です。 興味のある方は、
/magento/app/code/core/Mage/Customer/controllers/AccountController.php
メソッドをご覧ください
createPostAction.
新しい属性
属性は
eav_attributesテーブルに記載されているため、属性の操作は
eav_attributesテーブルのエントリの編集に
限定されます。
値が別の列に格納されている
静的属性もあります(例:
sales_order
)。
1.インストールスクリプト
モデルを変更するすべてのアクションは、各モジュール内のsqlフォルダーに保存されているインストールスクリプトで実行されます。
/magento/app/code/core/Mage/Customer/sql/customer_setup
スクリプトには、
セットアップと
アップグレードの 2つの形式があり
ます 。 Magentoは、モジュールのインストールまたは更新時に適切なスクリプトを1回実行します。 インストール後、エントリが
core_resourceテーブルに表示されます。次に例を示します。
「customermod_setup」、「0.1.0」
つまり、スクリプトは次の2つの理由で実行されます。
- core_resourceテーブルにモジュールに関するレコードがない
- core_resourceで指定されたモジュールのバージョンが、モジュールのconfig.xmlよりも低い
アンインストールメカニズムが
提供されていないことに注意してください。 何かが発生した場合は、作成した属性を手で削除する必要があります。
スクリプトはインストーラーによって実行されます。 デフォルトでは、インストーラークラスは
Mage_Core_Model_Resource_Setup
ですが、
EAVモデルを操作するためのメソッドが含まれていないため(属性を作成する予定です)、この場合は
Mage_Eav_Model_Entity_Setup
が必要
Mage_Eav_Model_Entity_Setup
。
2.属性作成スクリプト
インストールスクリプトの例は、標準モジュールにあります。 SQLコマンドが実行されるだけの場合もあります。 ただし、インストーラークラスのメソッドを可能な限り使用し、最後にSQLコマンドに頼ることをお勧めします。
$ installer = $ this;
/ * @var $ installer Mage_Customer_Model_Entity_Setup * /
$ installer-> startSetup();
$ installer-> addAttribute( 'customer'、 'invitation_code'、array(
「タイプ」=>「varchar」、
「入力」=>「テキスト」、
「ラベル」=>「招待コード」、
'グローバル' => 1
'visible' => 1、
'必須' => 1
'user_defined' => 1
'default' => null、
'visible_on_front' => 1
));
$ installer-> endSetup();
非常に多くの序文の後、スクリプト自体に関するコメントは必要ないと思います。
3.テンプレートの更新
登録フォームテンプレートに新しいフィールドを追加します。
/magento/app/design/frontend/default/example_theme/template/customer/form/register.phtml <div class = "input-box">
<label for = "invitation_code"> <?php echo $ this-> __( 'Invitation Code')?> <span class = "required"> * </ span> </ label> <br/>
<input type = "text" name = "invitation_code" id = "invitation_code" title = "<?php echo $ this-> __( 'Invitation Code')?>" class = "required-entry input-text" />
</ div>
4.構成の更新
インストールスクリプトの説明を追加します。
/magento/app/code/local/Examples/CustomerMod/etc/config.xml <グローバル>
<リソース>
<customermod_setup>
<セットアップ>
<module> Examples_CustomerMod </ module>
<class> Mage_Eav_Model_Entity_Setup </ class>
</ setup>
<connection> <use> core_setup </ use> </ connection>
</ customermod_setup>
<customermod_write> <connection> <use> core_write </ use> </ connection> </ customermod_write>
<customermod_read> <connection> <use> core_read </ use> </ connection> </ customermod_read>
</ resources>
そして、フィールド
fieldsets
新しいフィールドを指定することを忘れないでください
<フィールドセット>
<customer_account>
<group_id> <create> 1 </ create> <update> 1 </ update> </ group_id>
<invitation_code> <create> 1 </ create> <update> 1 </ update> </ invitation_code>
</ customer_account>
</ fieldsets>
現在、登録フォームには
招待コードフィールドがあり、その値は各クライアントの
invitation_code
属性に保存されています。 また、[
アカウント情報 ]タブのクライアントアカウントページの管理パネルに新しいフィールドが表示されました。
キャプチャ
キャプチャを実装するには、
reCAPTCHAを使用します。 さらに、多くの方法があります:既存のモジュールにキャプチャの機能を含め、それを分離し、一般的にすべてをテンプレートにプッシュし、標準コントローラーを編集できます。
私の意見では、別のモジュールで発行することをお勧めします。 新しいモジュール、個別のテンプレートを作成し、レイアウト(レイアウト)を変更する手順は、上記と同じです。 まだ影響を受けていないもの、つまりコントローラーとヘルパーについて説明します。
登録フォームの値はコントローラーに転送されます
Mage_Customer_AccountController
Magentoは、コントローラーを再定義するためのメカニズムを提供します(
バージョン1.3以降、メカニズムはわずかに変更されました )。 標準コントローラを変更する代わりに、標準から継承した新しいコントローラを作成します。
順番に。
recaptcha-phpライブラリをダウンロードし、/ magento / libフォルダーにコピーします。
1.コントローラー
CustomerModモジュールの構成では、コントローラーについて説明します。
<構成>
...
<フロントエンド>
...
<ルーター>
<お客様>
<引数>
<モジュール>
<Examples_CustomerMod before = "Mage_Customer"> Examples_CustomerMod </ Examples_CustomerMod>
</モジュール>
</ args>
</ customer>
</ routers>
...
実際にはコントローラー自体。
/magento/app/code/local/Examples/CustomerMod/controllers/AccountController.php require_once( "Mage / Customer / controllers / AccountController.php");
require_once( 'recaptcha / recaptchalib.php');
クラスExamples_CustomerMod_AccountControllerはMage_Customer_AccountControllerを拡張します{
パブリック関数createPostAction(){
$ request = $ this-> getRequest();
$ captchaIsValid = Mage ::ヘルパー( 'captcha')-> captchaIsValid($リクエスト);
if($ captchaIsValid){
親:: createPostAction();
} else {
$ this-> _ getSession()-> setCustomerFormData($ this-> getRequest()-> getPost());
$ this-> _ getSession()-> addError($ this-> __(「検証コードが正しくありません。もう一度試してください。」));
$ this-> _ redirectError(Mage :: getUrl( '* / * / create'、array( '_ secure' => true)));
}
}
}
Magentoで定義されている他のすべてのクラスとは異なり、コントローラーの場合、親クラスとサードパーティライブラリを含むファイルを明示的に指定する必要があります。そのため、2つのrequire_onceが必要です。 コードは最小限で、recaptchalibの標準関数を使用します。 ただし、入力されたキャプチャ自体の検証は、別のヘルパークラスで行われます。 同じチェックを他のコントローラーに追加する必要がある場合、結果はすべて
Mage::helper('captcha')->captchaIsValid($request).
をチェックすることになり
Mage::helper('captcha')->captchaIsValid($request).
ここでは、招待コードの信頼性などを追加することもできます。
2.ヘルパー
Magentoのヘルパーはシングルトンクラスで、通常はヘルパーメソッドのセットが含まれています。 ヘルパーには、モジュール名をパラメーターとして使用して
Mage::helper()
メソッドを使用してアクセスします。 この
Examples_Captcha_Helper_Data
は、
Examples_Captcha_Helper_Data
にキャプチャ検証関数が含まれます。
/magento/app/code/local/Examples/Captcha/Helper/Data.php require_once( 'recaptcha / recaptchalib.php');
クラスExamples_Captcha_Helper_DataはMage_Core_Helper_Abstractを拡張します
{
const CAPTCHA_PUBLIC_KEY = "ウェブサイトの公開キー";
const CAPTCHA_PRIVATE_KEY = "ウェブサイトの秘密キー";
public function captchaIsValid(Mage_Core_Controller_Request_Http $ request){
if($リクエスト){
$ resp = recaptcha_check_answer(self :: CAPTCHA_PRIVATE_KEY、
$ _SERVER ["REMOTE_ADDR"]、
$ request-> getParam( "recaptcha_challenge_field")、
$ request-> getParam( "recaptcha_response_field"));
return $ resp-> is_valid;
}
falseを返します。
}
public function captchaGetError(Mage_Core_Controller_Request_Http $ request){
if($リクエスト){
$ resp = recaptcha_check_answer(self :: CAPTCHA_PRIVATE_KEY、
$ _SERVER ["REMOTE_ADDR"]、
$ request-> getParam( "recaptcha_challenge_field")、
$ request-> getParam( "recaptcha_response_field"));
return $ resp->エラー;
}
falseを返します。
}
public function getPublicKey(){Return Examples_Captcha_Helper_Data :: CAPTCHA_PUBLIC_KEY; }
}
3. CAPTCHAブロック
ページにキャプチャ画像を表示するといいでしょう。 これにはrecaptcha_get_html()関数があります。 関数はテンプレート(phtml)から呼び出すことができるという事実にもかかわらず、Magentoのアイデアとアーキテクチャに従います-新しいタイプのブロックを作成し、同時にテンプレートなしでブロックがどのようになり得るかを学びます。 これを行うために、
Examples_Captcha_Block_Recaptcha
クラスについて説明します。
_toHtml
メソッドで
recaptcha_get_html()
関数呼び出しを呼び出します。 このメソッドは、ブロックをHTMLでレンダリングするときに呼び出されます。 (
/magento/app/code/core/Mage/Core/Block/Abstract.php
行
#643を参照)
/magento/app/code/local/Examples/Captcha/Block/Recaptcha.php require_once( 'recaptcha / recaptchalib.php');
class Examples_Captcha_Block_Recaptcha extends Mage_Core_Block_Abstract {
パブリック関数_toHtml(){
$ html = recaptcha_get_html(Mage ::ヘルパー( 'captcha')-> getPublicKey());
return html;
}
}
レイアウトに新しいブロックを追加します。 このブロックのテンプレートは不要です。完成したキャプチャが既に表示されています。
/magento/app/design/frontend/default/example_theme/layout/customermod.xml <?xml version = "1.0"?>
<レイアウトバージョン= "0.1.0">
<customer_account_create>
<参照名= "customer_form_register">
<block type = "core / template" name = "customergroups-select" template = "customer / form / register / groupselect.phtml" />
<block type = "captcha / recaptcha" name = "captcha" />
</参照>
</ customer_account_create>
</ layout>
4.設定
Captchaモジュールの構成で、ブロックとヘルパーが含まれていることを示すためだけに残ります
/magento/app/code/local/Examples/Captcha/etc/config.xml <?xml version = "1.0" encoding = "UTF-8"?>
<構成>
<モジュール>
<Examples_Captcha>
<バージョン> 0.1.0 </バージョン>
</ Examples_Captcha>
</モジュール>
<グローバル>
<ブロック>
<captcha> <class> Examples_Captcha_Block </ class> </ captcha>
</ blocks>
<ヘルパー>
<キャプチャ>
<class> Examples_Captcha_Helper </ class>
</ captcha>
</ helpers>
</ global>
</ config>
そして、キャプチャーの準備ができました。
おわりに
最後まで読んでくれてありがとう! 私はそれが興味深く、または少なくとも有用だったことを望む:)。
既製のサンプルをダウンロードでき
ます 。 この記事の執筆には、Magentoバージョン1.3.2.4が使用されました。
議論されているトピックがハブで興味深いものである場合は、新しい記事の要望に喜んで耳を傾けます。
このトピックに関する記事のアイデアと資料があります。
- Magentoジンジャーブレッドクッキーとレーキの概要
- 電子メール通知を追加する例によるMagentoのイベントとリスナー。
- Magentoでのデバッグ(テストページ、Firebug、Mage ::ログについて)
- Magentoのモデル。 エンティティと属性を追加します。
- Magentoメールテンプレートにブロックを追加した方法
- MagentoのPDF。 苦い真実
- レポート作成の例を使用して、Magentoでコレクションを操作する
- Magentoで開発するIDEを選択/構成する