プラグイン plugin 型

plugin 型

用語に注意

  • まずは用語に注意することを覚えてください。
    • プラグインには exeute 型と plugin 型があります。
    • 単に plugin と書く場合、それは plugin 型プラグインを意味しています。
    • plugin とプラグインは、発音は同じですが意味は同じではありません。
    • plugin 型プラグインはスキン内のプラグインタグによって呼び出されます。

plugin の役割 1

  • わかりやすく言うと、ブラウザに示される各ページのスキン部品が plugin です。
  • execute 型プラグインはページ特有の処理 (execute) を行い、必要に応じて plugin 型プラグインの実行を行います。
  • plugin 型プラグインが担う補助的な役割は主にスキン部品部分の作成です。
  • plugin 型プラグインは execute と同様、処理を実行することができます。
    • 個々の execute においては execute 型プラグインが主体となって重要な処理を行い、plugin 型プラグインはその補助的な処理を行います。
  • plugin 型プラグインはそれ自身が plugin 型プラグインの実行を行うことができます。
    • plugin は入れ子状もしくはツリー状に実行可能です。
    • これは、スキンやスキン部品の中にスキン部品の多様な挿入が可能であるということを意味します。
  • plugin 型プラグインはスキンを要求します。
    • execute 型プラグインはウェブ表示全体のレイアウトを指定するスキンを要求します。
    • それに対し、plugin 型プラグインは部品となるスキンを要求します。
    • plugin 型プラグインにより取得されたスキンは、呼び出し元が execute 型プラグインである場合は execute 型プラグインにより取得されたスキンに挿入される形になります。
    • plugin 型プラグインにより取得されたスキンは、呼び出し元が plugin 型プラグインである場合は plugin型プラグインにより取得されたスキンに挿入される形になります。

plugin の役割 2

  • 製品はメール書式もテンプレートとなっており、メール書面のスキン部品も plugin です。
    • その仕様は execute スキンの場合ととほぼ同じです。

処理の準備

  • 処理の準備は plugin を呼び出す execute もしくは plugin が行います。
  • execute もしくは plugin はスキンの読み込みによって実行すべき plugin 名を受け取ります。
    • plugin の実行はスキンの中に専用タグ (プラグインタグ) を用いて記述します。
    • スキンの側から見た plugin は純粋にスキン部品です。
  • 受け取るプラグインタグは例えば以下のようになります。
<#####user_inquiry_step3#####>
  • プラグインタグには : 区切りにてオプションをつけることが可能です。
    • しかしこれはほとんど使用されていないようです。
  • オプション付きのプラグインタグは例えば以下のようになります。
<#####mail_cart_record:package#####>
  • execute もしくは plugin は、その execute もしくは plugin に固有の plugin を許可しなければなりません。
  • あらかじめ許可されている (固有ではない) plugin のリストは以下の通りです。
    • 許可される固有の plugin の plugin 名はこのリストに追記されることになります。
$config->{list}{plugin}
  • $config->{list}{plugin} を設定しているファイルは以下の通りです。
[Apache_server]
 └ [cgi-bin]
    └ [config]
       └ [admin]
          └ config_basic.pl
  • 固有の plugin を許可するコードは例えば以下のようになります。
my @list =
 qw(
 user_inquiry_step3
 );
push (@{$config->{list}{plugin}},@list);
  • plugin が許可されていない場合、スキン内に該当のプラグインタグがあっても無視されます。

呼び出し

  • plugin の呼び出しはテンプレートエンジンによって行われますのであまり気にする必要はありません。
    • しかし plugin から plugin を呼び出す場合はテンプレートエンジンを操作するコードを書く (plugin にテンプレートコントローラを内蔵する) 必要があります。
    • 呼び出すファイル名は、plugin/pin_ + plugin 名 + .pl となります。
  • plugin 名が user_inquiry_step3 である場合、以下のようになります。
plugin/pin_user_inquiry_step3.pl

package 名

  • plugin 型プラグインは package を宣言しなければなりません。
    • 宣言する package 名は、Cart_plugin となります。
  • 宣言は以下のようになります。
################################################################################
# #
# CAFEMILK SHOPPING CART V5 #
# SOHO WORKSHOP CAFEMILK 全権留保 #
# #
################################################################################

use strict;
# use warnings;
use utf8;
# use encoding "utf8";

package Cart_plugin;

サブルーチン

  • plugin 型プラグインは、ウェブ処理用とメール処理用の二つのサブルーチンを持たなければなりません。
    • サブルーチン名は、plugin 名 + _html と plugin 名 + _mail となります。
  • plugin 名が user_inquiry_step3 である場合、ウエブ処理用のサブルーチンは以下のようになります。
sub user_inquiry_step3_html

plugin の処理

  • 以下は比較的簡単な plugin の例です。
    • 読み込むスキンが一つだけで、テンプレートエンジンの操作も最小限です。
################################################################################
# #
# CAFEMILK SHOPPING CART V5 #
# SOHO WORKSHOP CAFEMILK 全権留保 #
# #
################################################################################

use strict;
# use warnings;
use utf8;
# use encoding "utf8";

コーディングルールにより package 名を宣言
package Cart_plugin;
以下はウェブ処理用
sub user_inquiry_step3_html
 {
コーディングルールによって義務づけられた各種情報の格納処理
 my $package = shift;
 my $argument = shift;
 my $config = $argument->{config};
 my $userdata = $argument->{userdata};
 my $log_error = $argument->{log_error};
 my $log_alert = $argument->{log_alert};
 my $status = $argument->{status};
HTML テンプレートエンジンの使用にあたって処理名を準備
 my $pin_name = 'user_inquiry_step3_html';
HTML テンプレートエンジンで使用するスキンのパスを準備
 my $path = "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/pin_user_inquiry_step3.html";
コーディングルールにより %input_values にリクエストされた各情報を格納……してません。
%input_values を宣言しているだけ。
 my %input_values;
コーディングルールにより $userdata->{tag_data} に HTML テンプレート用の各情報を格納
execute から execute 処理の成功を知らせる $status->{execute_success} を受け取ってその内容にしたがってテンプレートタグの値を変更している。
 if ($status->{execute_success})
  {
  $userdata->{tag_data}{temporal}{display_success_2} = 'none';
  }
 else
  {
  $userdata->{tag_data}{temporal}{display_submit} = 'none';
  $userdata->{tag_data}{temporal}{display_success_1} = 'none';
  }
HTML テンプレートエンジンのオブジェクトを作成
 my $skin = Cafemilk_skin_html->new
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  name => $pin_name,
  });
スキンの読み込み
 $skin->set_path($path);
スキン内の HTML MIDDLE テンプレートタグを読み込む
 $skin->load_tag_middle();
許可されるテンプレートタグを指定
許可されるのは temporal のみ
 my @list = qw(temporal);
許可されたリストに基づいて HTML MIDDLE テンプレートタグを処理する
 $skin->replace_tag_middle
  ({
  allow => \@list,
  package => "Cafemilk_tag_html",
  });
コーディングルールにしたがい $userdata->{tag_data}{temporal} は内容をクリア
 undef $userdata->{tag_data}{temporal};
HTML テンプレートの結果を取得して return
 my $source = $skin->get_source();
 }
以下はメール処理用
メール処理用サブルーチンは必要ないがコーディングルール上記述する
sub user_inquiry_step3_mail
 {
 # none
 }
最後に何か retern するのが Perl のお約束
1;
  • 以上の例では、HTML テンプレートエンジンの処理は部分的に実施されています。
    • ここでタグの取得と処理が行われているのは MIDDLE テンプレートタグのみです。
    • タグはプラグインタグとテンプレートタグ、それぞれに HIGH, MIDDLE, LOW がありますから、その一部しか活用していないことになります。
  • 以下は plugin が大量のスキンを読み込んでいる例です。
HTML 型スキンの呼び出し
 my %path;
 my %source;
 my $common = "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}";
 my @list =
  qw(
  cell_head cell_body_image cell_body_text cell_body_flash cell_border
  cell_foot cell_nocart cell_body_noitem cell_body_block
  );
 foreach (@list)
  {
  my $line = $_;
  $path{$line} = "$common/pin_user_cart_main_$line.html";
  my $skin = Cafemilk_skin_html->new
   ({
   config => $config,
   userdata => $userdata,
   log_error => $log_error,
   log_alert => $log_alert,
   status => $status,
   name => $pin_name,
   });
  $skin->set_path($path{$line});
  $source{$line} .= $skin->get_source();
  }
続いてWORDLIST 型スキンの呼び出し
 my @word_list_price_foot = Cafemilk_basic::get_wordlist
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  filename => "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/list_price_foot.txt",
  });
 my @word_list_item_alert = Cafemilk_basic::get_wordlist
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  filename => "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/list_item_alert.txt",
  });
 my @word_list_tax_status = Cafemilk_basic::get_wordlist
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  filename => "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/list_tax_status.txt",
  });
 my @word_list_ship_status = Cafemilk_basic::get_wordlist
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  filename => "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/list_ship_status.txt",
  });
 my @word_list_cart_message = Cafemilk_basic::get_wordlist
  ({
  config => $config,
  userdata => $userdata,
  log_error => $log_error,
  log_alert => $log_alert,
  status => $status,
  filename => "./$config->{path}{skin}/user/cgi/$config->{default}{user_type}/$userdata->{device_type}/$userdata->{language_type}/$userdata->{currency_type}/$userdata->{template_type}/list_cart_message.txt",
  });
  • この場合、商品の一覧を表示するにあたって、Flash が用いられているか / 画像が用いられているか / テキストのみか / などの諸条件に応じて使用するスキンを選択する必要があるので、それらのパスを一括して指定し、さらに読み込みまで行っています。
  • また、各スキンにおいて要求されるテンプレートタグの値を用意するため、WORDLIST 型スキンも多数を読み込んでいます。
    • このあと、それらのスキンを処理したものを、ヘッダとフッタの間に、適宜ボーダーを挟みながら繰り返し挿入していくコードがあります。
    • スキンには繰り返しなどの制御命令が書けない仕様なので、繰り返しは plugin 型プラグイン内にて書くことになります。
  • 読み込まれているスキンが多数ある場合、それらのスキンの名称を見れば、その振る舞いがだいたい解るものです。
  • plugin ではまれにオプションが用いられます。
    • plugin 型プラグイン内におけるオプションの取得方法は以下の通りです。
sub mail_cart_record_mail
 {
 my $package = shift;
 my $argument = shift;
 my $config = $argument->{config};
 my $userdata = $argument->{userdata};
 my $log_error = $argument->{log_error};
 my $log_alert = $argument->{log_alert};
 my $status = $argument->{status};
一つめのオプションを取得
複数ある場合は連番となる
 my $target = $argument->{values}[0];
最終更新:2009年09月24日 23:30
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。