ホーム > フォーラム > 開発 > モジュール開発 > xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。

xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。
投稿者: hiron2425 | 投稿日時: 2011/2/27 19:34 | 閲覧: 10001回
hiron2425

xoopsmembersモジュールをカスタマイズいたしました。

ところで、
下記のフリーワード検索の、
フリーワードのテキストボックスを一つのみ表示させて、
複数キーワード単語(ユーザー名、その他の情報、居住地、本名)
をスペースで区切ったキーワード検索(AND検索)に変更したいのですが、
この場合どのように書き換えることができますでしょうか?

いろいろ調べても私の知識では難しいです。

どなたかわかる人がいましたら、どうぞ宜しくお願いいたします。



***** xoopsmembersモジュールのカスタマイズ *****


検索フォームは、
  <input type="text" name="user_freeword"....
として表示。

  index.phpの
  if ( $op == "form" ) {
  以下に、

   $freeword_text = new XoopsFormText("", "user_freeword", 30, 60);
   $freeword_match = new XoopsFormSelectMatchOption("", "user_freeword_match");
   $freeword_tray = new XoopsFormElementTray('フリーワード', "&nbsp;");
   $freeword_tray->addElement($freeword_match);
   $freeword_tray->addElement($freeword_text);

と定義した$freeword_trayを加えました。
   $form->addElement($freeword_tray);


キーワード一つで、
   uname(ユーザーiD)
   bio(その他情報)
   user_from(居住地)
   name(本名)
を一括検索できるように変更しました。

  index.phpの
  if ( $op == "submit" ) {
   $xoopsOption['template_main'] = 'xoopsmembers_searchresults.html';
   include XOOPS_ROOT_PATH."/header.php";
   $iamadmin = $xoopsUserIsAdmin;
   $myts =& MyTextSanitizer::getInstance();
   $criteria = new CriteriaCompo();
  以下に、
   if ( !empty($_POST['user_freeword']) ) {
     $match = (!empty($_POST['user_freeword_match'])) ? intval($_POST['user_freeword_match']) : XOOPS_MATCH_START;
     switch ( $match ) {
     case XOOPS_MATCH_START:
      $criteria->add(new Criteria('uname', $myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('bio', $myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('user_from', $myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('name', $myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      break;
     case XOOPS_MATCH_END:
      $criteria->add(new Criteria('uname', '%'.$myts->addSlashes(trim($_POST['user_freeword'])), 'LIKE'),"OR");
      $criteria->add(new Criteria('bio', '%'.$myts->addSlashes(trim($_POST['user_freeword'])), 'LIKE'),"OR");
      $criteria->add(new Criteria('user_from', '%'.$myts->addSlashes(trim($_POST['user_freeword'])), 'LIKE'),"OR");
      $criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($_POST['user_freeword'])), 'LIKE'),"OR");
      break;
     case XOOPS_MATCH_EQUAL:
      $criteria->add(new Criteria('uname', $myts->addSlashes(trim($_POST['user_freeword']))),"OR");
      $criteria->add(new Criteria('bio', $myts->addSlashes(trim($_POST['user_freeword']))),"OR");
      $criteria->add(new Criteria('user_from', $myts->addSlashes(trim($_POST['user_freeword']))),"OR");
      $criteria->add(new Criteria('name', $myts->addSlashes(trim($_POST['user_freeword']))),"OR");
      break;
     case XOOPS_MATCH_CONTAIN:
      $criteria->add(new Criteria('uname', '%'.$myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('bio', '%'.$myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('user_from', '%'.$myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      $criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($_POST['user_freeword'])).'%', 'LIKE'),"OR");
      break;
     }
   }

コメント(9)

Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: rabbit_bit | 投稿日時: 2011/2/27 21:12
rabbit_bit

基本的に引用しているとおりで動作するのではないでしょうか?
index.phpに追記+テンプレートを編集。
#20762 | | 返信する |
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: hiron2425 | 投稿日時: 2011/2/27 23:31 | 親コメント: #20762
hiron2425
引用:
基本的に引用しているとおりで動作するのではないでしょうか?
index.phpに追記+テンプレートを編集。



ご返事ありがとう御座います。

お世話になります。

実際は、以下のように記述しておりますが、内容はあっていると思います。

しかし、例えば「東京」あるいは「田中」と個々に記入すれば、検索結果が表記されるのですが、
「東京 田中」と複数キーワードで記入しても検索結果には「条件に合うユーザが見つかりませんでした」と表記されます。

宜しくお願いします。

できれば、URLをお知らせしたいのですが会員検索用に使用しているためオープンにできません。
個人的にお知らせできる方法はありますでしょうか?


if ( $op == "submit" ) {
$xoopsOption['template_main'] = 'xoopsmembers_searchresults.html';
include XOOPS_ROOT_PATH."/header.php";
$iamadmin = $xoopsUserIsAdmin;
$myts =& MyTextSanitizer::getInstance();
$criteria = new CriteriaCompo();

if (!empty($_POST['user_name']) ) {
$match = (!empty($_POST['user_name_match'])) ? intval($_POST['user_name_match']) : XOOPS_MATCH_START;
switch ($match) {
case XOOPS_MATCH_START:
$criteria->add(new Criteria('name', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_yim', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_msnm', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_from', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_engname', $myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
$criteria->add(new Criteria('user_yim', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
$criteria->add(new Criteria('user_msnm', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
$criteria->add(new Criteria('user_from', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
$criteria->add(new Criteria('user_engname', '%'.$myts->addSlashes(trim($_POST['user_name'])), 'LIKE'),"OR");
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('name', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_yim', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_msnm', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_from', $myts->addSlashes(trim($_POST['user_name']))),"OR");
$criteria->add(new Criteria('user_engname', $myts->addSlashes(trim($_POST['user_name']))),"OR");
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_yim', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_msnm', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_from', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
$criteria->add(new Criteria('user_engname', '%'.$myts->addSlashes(trim($_POST['user_name'])).'%', 'LIKE'),"OR");
break;
}

}
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: rabbit_bit | 投稿日時: 2011/2/28 10:11 | 親コメント: #20763
rabbit_bit

おっしゃっている意味がわかりました。
1.スペース区切りで検索キーワードを受け取る加工
2.受け取ったキーワードを使って、各フィールドを検索させるという作業で問題ないはずです。
こちらでミニテストを行なっていますが,動作しています。


以下は,index.phpを変更する具体的な手順です。(3ステップです)

hiron2425さんの例にしたがって,$_POST['user_name']を受け取った場合の挙動にしております。
(※別のinput(name)を使うようでしたら,そのnameに読み替えてください)


■作業1
  作業準備。(この作業は作業3と関係があります。)
  if (!empty($_POST['********']) ) {
  の部分を
  if (!empty($********) ) {
  に置き換える。(複数あるので全部)
  
  


■作業2
$criteria->addの行を,全部もとに戻す。

例えば、$user_name_match=以下は,
 $user_name_match=xoops_getrequest('user_name_match');;
  $match = (!empty($user_name_match)) ? intval($user_name_match) : XOOPS_MATCH_START;
  switch ($match) {
  case XOOPS_MATCH_START:
   $criteria->add(new Criteria('name', $myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
   break;
  case XOOPS_MATCH_END:
   $criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
   break;
  case XOOPS_MATCH_EQUAL:
   $criteria->add(new Criteria('name', $myts->addSlashes(trim(xoops_getrequest('user_name')))));
   break;
  case XOOPS_MATCH_CONTAIN:
   $criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
   break;
  }
※読みやすくするため,全角スペースで字下げをしています。(コピペでは動作しません)


$user_email_match=
$user_aim_match=
(ほか省略)
も削除(or編集)しているなら全部もとに戻す。


■作業3
各検索用criteria文にスペース区切りの検索語を全て検索させるように工夫する。


/** ▼ 追加1開始 ▼ **/
$KeyWord = xoops_getrequest('user_name');
$ArrKeyword = split(" | ",$KeyWord);
foreach($ArrKeyword as $value){
$name=$value;
/** ▲ 追加1終了 ▲ **/

if (!empty($name) ) {
省略
}

/** ▼ 追加2開始 ▼ **/
}
/** ▲ 追加2終了 ▲ **/



/** ▼ 追加3開始 ▼ **/
foreach($ArrKeyword as $value){
$user_uname=$value;
/** ▲ 追加3終了 ▲ **/

if (!empty($user_uname) ) {
省略
}

/** ▼ 追加4開始 ▼ **/
}
/** ▲ 追加4終了 ▲ **/



以下省略
同様のパターンで,
  user_icq
  user_aim
  user_yim
  user_msnm
  user_from
  user_engname
にも同様の検索ができるようにセット。

以上です。
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: hiron2425 | 投稿日時: 2011/3/1 0:29 | 親コメント: #20764
hiron2425

rabbit_bit 様、

大変お世話になっております。

ご丁寧なご返事を頂きありがとうございます。


以下のようにして、index.phpを変更いたしました。

$KeyWord = xoops_getrequest('user_name');
$ArrKeyword = split(" | ",$KeyWord);
foreach($ArrKeyword as $value){
$user_name=$value;

if (!empty($user_name) ) {
$user_name_match=xoops_getrequest('user_name_match');
$match = (!empty($user_name_match)) ? intval($user_name_match):XOOPS_MATCH_START;
switch ($match) {
case XOOPS_MATCH_START:
$criteria->add(new Criteria('name', $myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('name', $myts->addSlashes(trim(xoops_getrequest('user_name')))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
}
}
}

$KeyWord = xoops_getrequest('user_name');
$ArrKeyword = split(" | ",$KeyWord);
foreach($ArrKeyword as $value){
$user_icq=$value;

if ( !empty($user_icq) ) {
$user_icq_match=xoops_getrequest('user_icq_match');
$match = (!empty($user_icq_match)) ? intval($user_icq_match) : XOOPS_MATCH_START;
switch ($match) {


case XOOPS_MATCH_START:
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))), 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim(xoops_getrequest('user_name')))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
}
}
}


$KeyWord = xoops_getrequest('user_name');
$ArrKeyword = split(" | ",$KeyWord);
foreach($ArrKeyword as $value){
$user_aim=$value;

if ( !empty($user_aim) ) {
$user_aim_match=xoops_getrequest('user_aim_match');
$match = (!empty($user_aim_match)) ? intval($user_aim_match) : XOOPS_MATCH_START;
switch ($match) {
case XOOPS_MATCH_START:
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))), 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim(xoops_getrequest('user_name')))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim(xoops_getrequest('user_name'))).'%', 'LIKE'));
break;
}
}
}


しかし、検索フォームに「東京都 田中 大学」或いは「東京都」と文字を入力検索しても、検索結果には「条件に合うユーザが見つかりませんでした」と表記されます。

宜しくお願いいたします。
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: rabbit_bit | 投稿日時: 2011/3/1 13:27 | 親コメント: #20765
rabbit_bit

上記、「作業2」が説明不十分でした。
戻すとき、全部コピーになっていますね。

これではまともに検索できません。

$criteria->add(new Criteria('○○○○○○○○', $myts->addSlashes(trim($********)).'%', 'LIKE'));

$********は、作業1で定義した変数名。
○○○○○○○○は、検索用フィールド名
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: hiron2425 | 投稿日時: 2011/3/1 22:31 | 親コメント: #20766
hiron2425

rabbit_bit様、

大変お世話になっております。

お忙しい中、いつも申し訳ございません。

記述を以下のように変更いたしましたところ、画面が真っ白になってしまいました。

***************************

if ( $op == "submit" ) {
$xoopsOption['template_main'] = 'xoopsmembers_searchresults.html';
include XOOPS_ROOT_PATH."/header.php";
$iamadmin = $xoopsUserIsAdmin;
$myts =& MyTextSanitizer::getInstance();
$criteria = new CriteriaCompo();

$KeyWord = xoops_getrequest('user_name');
$ArrKeyword = split(" | ",$KeyWord);

foreach($ArrKeyword as $value){
$user_name=$value;

if (!empty($user_name) ) {
$user_name_match=xoops_getrequest('user_name_match');
$match = (!empty(user_name_match)) ? intval($user_name_match) : XOOPS_MATCH_START;
switch ($match) {
case XOOPS_MATCH_START:
$criteria->add(new Criteria('name', $myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('name', $myts->addSlashes(trim($user_name))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('name', '%'.$myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
}
}
}


foreach($ArrKeyword as $value){
$user_icq=$value;

if ( !empty($user_icq) ) {
$user_icq_match=xoops_getrequest('user_icq_match');
$match = (!empty($user_icq_match)) ? intval($user_icq_match) : XOOPS_MATCH_START;
switch ($match) {


case XOOPS_MATCH_START:
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim($user_name)), 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('user_icq', $myts->addSlashes(trim($user_name))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('user_icq', '%'.$myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
}
}
}


foreach($ArrKeyword as $value){
$user_aim=$value;

if ( !empty($user_aim) ) {
$user_aim_match=xoops_getrequest('user_aim_match');
$match = (!empty($user_aim_match)) ? intval($user_aim_match) : XOOPS_MATCH_START;
switch ($match) {
case XOOPS_MATCH_START:
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
case XOOPS_MATCH_END:
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim($user_name)), 'LIKE'));
break;
case XOOPS_MATCH_EQUAL:
$criteria->add(new Criteria('user_aim', $myts->addSlashes(trim($user_name))));
break;
case XOOPS_MATCH_CONTAIN:
$criteria->add(new Criteria('user_aim', '%'.$myts->addSlashes(trim($user_name)).'%', 'LIKE'));
break;
}
}
}

***************************

どうぞ宜しくお願いいたします。
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: rabbit_bit | 投稿日時: 2011/3/2 15:14 | 親コメント: #20767
rabbit_bit

$match = (!empty(user_name_match)) ? intval($user_name_match) : XOOPS_MATCH_START;
PHPの構文がおかしいですよ。
この部分は変更不要です。
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: hiron2425 | 投稿日時: 2011/3/2 23:03 | 親コメント: #20768
hiron2425

お世話になっております。

引用:
$match = (!empty(user_name_match)) ? intval($user_name_match) : XOOPS_MATCH_START;
PHPの構文がおかしいですよ。
この部分は変更不要です。


すいません。

$match = (!empty($user_name_match)) ? intval($user_name_match) : XOOPS_MATCH_START
に修正したところ、画面が無事表示されました。


しかし、まだ検索フォームに「東京 田中 大学」と入力しても検索結果には「条件に合うユーザが見つかりませんでした」と表記されます。

仕様環境による違いあるのでしょうか?
ちなみに、レンタルサーバーで運用(PHP5、MySQL 4.1)しております。

何卒、宜しくお願いいたします。
Re: xoopsmembersモジュールで複数キーワード検索(AND検索)をしたい。 
投稿者: rabbit_bit | 投稿日時: 2011/3/4 2:02 | 親コメント: #20769
rabbit_bit

PHP構文がおかしいです。

$match = (!empty($_POST['********_match'])) ? intval($_POST['********_match']) : XOOPS_MATCH_START;

とすべきです。
コピペよりもコードの意味を把握されたほうが近道かも(^o^)/

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top