Magento。 モジュールを書いています。 登録にCAPTCHAおよび追加フィールドを追加します

Magentoのプログラミングモジュールでの経験を共有したいと思います。 を招待してくれたjejeに感謝します
この記事では、顧客登録の追加機能を実装するモジュールの作成について詳しく説明します。 目的-最初から最後まで具体的な例を使用してMagentoの開発のアイデアを示し、主なアプローチ、コードの構成を示し、いくつかの機能を指摘します。 この記事は、より初心者を対象としていますが、Magentoに精通している人は、自分にとって役立つものを作ることができます。 もちろん、すべてを1つの記事で説明することはできませんが、トピックが必要な場合は、これが一連の記事の始まりかもしれません。
次の点が言及されています。

その結果、CAPTCHAチェック、グループ選択フィールド、招待コードの保存を含む登録を受け取ります。



登録ページ

何を考えているの


登録ページ/ magento /顧客/アカウント/作成があります。 CAPTCHAチェックを追加し、クライアントにグループと招待コードを要求します。 受信したデータはデータベースに保存されます。 デフォルトでは、Magentoは3つの顧客グループ、一般、卸売、小売業者を定義します。 これらのうち、将来のクライアントを選択することを提案します。 Magentoは招待コードについて何も知りません。新しい属性を作成します。

これは既成のソリューションではなく、プレゼンテーションを簡単にするために作成された単なる例です。

検索する


テンプレートファイルの場所、登録データの保存場所、保存方法を探しています。
  1. 顧客登録フォームテンプレート
    /magento/app/design/frontend/default/default/template/customer/form/register.phtml登録フォーム
  2. モジュールインストーラーに属性が追加されます。例:
    /magento/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-0.8.7-0.8.8.php
    詳細については、モジュールのインストーラーを作成するときに説明します。
  3. モジュール構成に変数フィールド(属性)の説明があります。
    /magento/app/code/core/Mage/Customer/etc/config.xml
    <fieldsets>タグ内
  4. 登録フォームは次の場所にデータを投稿します。
      http:// localhost / magento / customer / account / createpost / 

    したがって、リクエストはコントローラーによって処理されますMage_ Customer _ Account ControllerメソッドcreatePostアクション(行番号234)


実装


見つかったファイルを変更するオプションは考慮されません。 独自のテーマとモジュールを作成します。
テーマはシンプルです:
  1. / magento / app / design / frontend / default / mythemeに新しいフォルダーを作成します
    デフォルト -インターフェース名
    mythemeはテーマの名前です
  2. ディレクトリ構造を維持しながらファイルを新しいトピックにコピーします
  3. 必要に応じてテンプレートを編集/作成します

同じ名前のテンプレートは、標準テーマのテンプレートと重複しています。 したがって、「ネイティブ」の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つの理由で実行されます。
  1. core_resourceテーブルにモジュールに関するレコードがない
  2. 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>


そして、キャプチャーの準備ができました。

CAPTCHAスクリーンショットト

おわりに



最後まで読んでくれてありがとう! 私はそれが興味深く、または少なくとも有用だったことを望む:)。 既製のサンプルをダウンロードできます 。 この記事の執筆には、Magentoバージョン1.3.2.4が使用されました。
議論されているトピックがハブで興味深いものである場合は、新しい記事の要望に喜んで耳を傾けます。
このトピックに関する記事のアイデアと資料があります。

Source: https://habr.com/ru/post/J78003/


All Articles