メンバー検索

プロフィールに増やした項目を使ってメンバー検索ができるようにするために、データベースを使用してメンバー検索を行えるようにします。

takanori

テーブルを作成する

目次

DA を追加[da]

まず最初にデータベースに接続するための DA(Database Connection) を追加します。

ここでは MySQL を使うので MySQL for Python と ZMySQLDA をインストールします。 (データベースそのものはすでに動いているものとします。)

ダウンロードは http://sourceforge.net/projects/mysql-python から行います。

MySQL for Python は python setup.py install を実行してインストールします。

% tar xfz MySQL-python-1.2.0.tar.gz
% cd MySQL-python-1.2.0
% python setup.py build
% sudo python setup.py install

ZMySQLDA は解凍したものを zope の Products ディレクトリにインストールして、zope サーバを再起動します。

その後、ZMI 上で ZMySQL Database Connection を選択して追加します。

テーブルを作成[create]

次にメンバー情報を保存するためのテーブルを作成します。

基本的にデータは char や varchar 型で保存するようにします。

ZMI で Z SQL Method を追加し、以下のような内容で作成します。

  • Id member_create
  • Title メンバー情報テーブルの作成
  • 本文 :
        CREATE TABLE member (
          id char(6) primary key,
          fullname varchar(255),
          kananame varchar(255),
          nickname varchar(255),
          email varchar(255),
          organization varchar(255),
          workplace varchar(255),
          telno varchar(20),
          telext varchar(10),
          sex varchar(6),
          blood varchar(2),
          location varchar(255),
          hometown varchar(255),
          day varchar(10),
          month varchar(10),
          year varchar(10),
          hobby text,
          homepage varchar(255),
          skype varchar(50),
          introduction text,
          portrait varchar(255),
          photo char(1),
          searchable_text text
        );
    

Z SQL Method を作成したら、Test タブで Submit Query ボタンをクリックしてテーブルを作成します。

ちなみに photo には写真が設定してあるかどうかを、searchable_text には文字列系のデータを全部まとめて設定します。

次に、メンバー情報を登録 によって、このテーブルにメンバーのプロフィール情報を登録します。

メンバー情報を登録

目次

スクリプト群[script]

作成するスクリプトは以下の通りです。

メンバー情報を常に最新の情報にするために、以下のようなスクリプトを作成して使用します。

なお、これらのスクリプトはここでは Plone のルートフォルダの下に SQL フォルダを作成して保存することにします。

  • member_insert メンバー情報をデータベースに書き込むための Z SQL Method
  • member_update メンバー情報を更新するための Z SQL Method
  • member_exist 指定された ID の情報がデータベースに存在するか調べる Z SQL Method
  • insert_member_data 指定された(または全)メンバーの情報を登録する Python Script

以下に、それぞれの内容を記述します。

メンバー情報登録[insert]

メンバー情報をデータベースに書く込むための Z SQL Method は以下の通りです。

基本的に、引数でわたってきた値をそのまま insert 文で挿入するだけです。

  • Id member_insert
  • Title メンバー情報をテーブルに登録
  • Arguments id fullname nickname email organization workplace telno telext sex blood location hometown day month year hobby homepage skype introduction portrait photo searchable_text
  • ソースコード:
        insert into member
          (id, fullname, nickname, email, organization, workplace, telno, telext,
           sex, blood, location, hometown, day, month, year, hobby, homepage,
           skype, introduction, portrait, photo, searchable_text)
          values
          (
            <dtml-sqlvar id type="string">,
            <dtml-sqlvar fullname type="string">,
            <dtml-sqlvar nickname type="string">,
            <dtml-sqlvar email type="string">,
            <dtml-sqlvar organization type="string">,
            <dtml-sqlvar workplace type="string">,
            <dtml-sqlvar telno type="string">,
            <dtml-sqlvar telext type="string">,
            <dtml-sqlvar sex type="string">,
            <dtml-sqlvar blood type="string">,
            <dtml-sqlvar location type="string">,
            <dtml-sqlvar hometown type="string">,
            <dtml-sqlvar day type="string">,
            <dtml-sqlvar month type="string">,
            <dtml-sqlvar year type="string">,
            <dtml-sqlvar hobby type="string">,
            <dtml-sqlvar homepage type="string">,
            <dtml-sqlvar skype type="string">,
            <dtml-sqlvar introduction type="string">,
            <dtml-sqlvar portrait type="string">,
            <dtml-sqlvar photo type="string">,
            <dtml-sqlvar searchable_text type="string">
          )
    

メンバー情報更新[update]

データベースに書き込まれているメンバー情報を更新するための Z SQL Method は以下の通りです。

引数(Arguments)は メンバー情報登録 と同じです。

引数 id が同じデータを更新します。

  • Id member_insert
  • Title メンバー情報をテーブルに登録
  • Arguments id fullname nickname email organization workplace telno telext sex blood location hometown day month year hobby homepage skype introduction portrait photo searchable_text
  • ソースコード:
        update member 
          set fullname = <dtml-sqlvar fullname type="string">,
            kananame = <dtml-sqlvar kananame type="string">,
            nickname = <dtml-sqlvar nickname type="string">,
            email = <dtml-sqlvar email type="string">,
            email = <dtml-sqlvar email type="string">,
            organization = <dtml-sqlvar organization type="string">,
            workplace = <dtml-sqlvar workplace type="string">,
            telno = <dtml-sqlvar telno type="string">,
            telext = <dtml-sqlvar telext type="string">,
            sex = <dtml-sqlvar sex type="string">,
            blood = <dtml-sqlvar blood type="string">,
            location = <dtml-sqlvar location type="string">,
            hometown = <dtml-sqlvar hometown type="string">,
            day = <dtml-sqlvar day type="string">,
            month = <dtml-sqlvar month type="string">,
            year = <dtml-sqlvar year type="string">,
            hobby = <dtml-sqlvar hobby type="string">,
            homepage = <dtml-sqlvar homepage type="string">,
            skype = <dtml-sqlvar skype type="string">,
            introduction = <dtml-sqlvar introduction type="string">,
            portrait = <dtml-sqlvar portrait type="string">,
            photo = <dtml-sqlvar photo type="string">,
            searchable_text = <dtml-sqlvar searchable_text type="string">
          where id = <dtml-sqlvar id type="string">
    

メンバー情報の存在[exist]

データベースに、指定された id のメンバー情報が存在するか調べるための Z SQL Method は以下の通りです。

メンバー情報が存在するとその id を返し、存在しない場合は何も返しません。

その結果により、メンバー情報登録メンバー情報更新 をスクリプトで使い分けます。

  • Id member_exist
  • Title メンバー情報が存在するか調べる
  • Arguments id
  • ソースコード:
        select id from member where id = <dtml-sqlvar id type="string">
    

メンバー情報登録スクリプト[python]

指定された(または全)メンバーの情報を登録(または更新)する Python Script です。

  • Id insert_member_data
  • Title 指定されたメンバーの情報を登録(または全メンバー登録)
  • Parameter List member_id=None
  • ソースコード insert_member_data のソース を参照してください。

このスクリプトを実行すると、メンバー情報が最新の状態に更新されるようになります。(削除はされませんが)

次に、メンバー検索 をデータベースから検索するようにします。

メンバー検索ページ

目次

入力フォーム[form]

まず、メンバー検索の入力フォームに、追加した値も検索条件として入力できるようにします。

そして、検索条件としてニックネームや血液型を指定できるように、入力フォームを追加します。

例えば、ニックネームの入力フォームは以下のようになります。:

    <tr>
      <td>
        <span class="field"><label i18n:translate="label_nick_name">Nick name</label></span>
      </td>
      <td>
        <input type="text"
               name="nickname"
               size="25"
               tabindex=""
               tal:attributes="tabindex tabindex/next;"
               />
      </td>
    </tr>

portal_skins/plone_forms/ にアクセスして、member_search_form を開いて Customize ボタンをクリックします。

ソースコードは meber_search_form のソース を参照してください。

メンバー タブをクリックして表示される、検索フォームは以下のような形になります。

member search form

検索 SQL[sql]

次に、メンバー検索をデータベースから行うための SQL Method を SQL フォルダに作成します。

基本的には、引数として渡された文字列を、部分文字列として like 検索するものを、and でつなぐようになっています。

  • Id searchForMembers
  • Arguments searchable_text id fullname kananame nickname email organization workplace telno sex blood location hometown photo
  • ソースコード searchForMembers のソース を参照してください。

検索結果表示[results]

最後に、検索結果を表示するための Page Template を作成します。

portal_skins/plone_forms/ にアクセスして、member_search_results を開いて Customize ボタンをクリックします。

ソースコードは meber_search_results のソース を参照してください。

実際にはこの Page Template が member_serach_form から呼ばれ、内部で先ほど作成した serachForMembers を実行し、その結果を一覧表示するようになっています。

なお、コードの最初の方に記述してある results python:here.SQL.searchForMembers(request); の部分で、データベースからの検索を行っています。

また、plone の初期状態ではメンバー検索の結果は顔写真のみの表示でしたが、ここでは下記の項目を表示するように変更してい。

  • 縮小した顔写真(ホームへリンク)
  • 名前とニックネーム(ホームへリンク)
  • 電話番号と内線番号
  • メールアドレスとリンク
  • 自己紹介
  • 所属

検索結果を実行したは以下のように表示されます。

member search results

メンテナンス[maintenance]

ここまでで、項目を増やしたメンバー情報を、データベースを使用して検索できるようになりました。

ただし、このままでは plone 上でメンバーの情報が更新されたときに、データベースに反映されません。 そこで、下記のいずれかの方法で(他にもあるかもしれませんが)メンバー情報をメンテナンスする必要があります。

  1. cron 等で定期的に メンバー情報登録スクリプト(insert_membe_data) を実行して、最新の状態に保つ。
  2. メンバー情報が更新されたときに、そのメンバーに対して、 メンバー情報登録スクリプト(insert_membe_data) を実行する。

私の環境では「2」の方法でデータを最新の状態に保っています。

具体的には /portal_skins/plone_form_scripts にある personalize という Python Script をカスタマイズして、 return の直前に context.SQL.insert_member_data(member_id=member.getId()) というメンバー情報の更新処理を追加してあります。