Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする(MT4版)

Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする(MT4版)

Posted at December 3,2008 12:33 AM
Tag:[Customize, MovableType, Search]

Movable Type 4の検索フォームで検索文字列を複数入力し、区切り文字に全角スペース(空白)を使用すると、全角スペースは検索文字として認識され、期待しない結果(おそらく検索結果として何もヒットしない)になってしまいます。

この全角スペースを半角スペースと同じ扱いにするためのカスタマイズを紹介します。

このカスタマイズは、Movable Type 3.x用にエントリーした「Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする」を、Movable Type 4 用に調べなおしたものです。

ただし4.22が最新版の記事のため、4.3以降では適用されない可能性があります。

1.Search.pm の修正

Movable Type 4 では、~4.1x と 4.2x で修正方法が異なります。ご利用のバージョンを確認して1.1項または1.2項のいずれかを適用してください。

1.1 MT4.0x/MT4.1x の場合

まず、lib/MT/App/Search.pm に下記のパッチを適用してください。

--- lib/MT/App/Search.pm.bak    Tue Dec 02 23:56:46 2008
+++ lib/MT/App/Search.pm        Tue Dec 02 23:59:17 2008
@@ -149,6 +149,10 @@
         || ( $app->{searchparam}{Type} eq 'tag' ) ) {
         if ($q->param('search')) {
             $app->{search_string} = $q->param('search');
+            if (($app->{searchparam}{Type} eq 'straight')) {
+                my $delimiter = $app->translate("delimiter");
+                $app->{search_string} =~ s/$delimiter/ /g;
+            }
             $app->{search_string_decoded} = MT::I18N::decode(
                 $app->config->PublishCharset,
                 $app->{search_string}

パッチが分からない方は lib/MT/App/Search.pm を任意のエディタで開き、下記の青色の4行を追加してください。

...前略...
sub init_request{
    my $app = shift;
    $app->SUPER::init_request(@_);
...中略...
    ## Set search_string (for display only)
    if ( ( $app->{searchparam}{Type} eq 'straight' )
        || ( $app->{searchparam}{Type} eq 'tag' ) ) {
        if ($q->param('search')) {
            $app->{search_string} = $q->param('search');
            if (($app->{searchparam}{Type} eq 'straight')) {
                my $delimiter = $app->translate("delimiter");
                $app->{search_string} =~ s/$delimiter/ /g;
            }
            $app->{search_string_decoded} = MT::I18N::decode(
                $app->config->PublishCharset,
                $app->{search_string}
            );
        } else {
            $app->{search_string} = $app->{search_string_decoded} = q();
        }
    }
...後略...

1.2 MT4.2x の場合

まず、lib/MT/App/Search.pm に下記のパッチを適用してください。

--- lib/MT/App/Search.pm.bak    Tue Dec 02 23:51:51 2008
+++ lib/MT/App/Search.pm        Tue Dec 02 23:52:23 2008
@@ -347,6 +347,8 @@
     my $search_string = $q->param('searchTerms') || $q->param('search')
         or return $app->errtrans('No search term was specified.');
     $app->{search_string} = $search_string;
+    my $delimiter = $app->translate("delimiter");
+    $app->{search_string} =~ s/$delimiter/ /g;
     my $offset = $q->param('startIndex') || $q->param('offset') || 0;
     return $app->errtrans( 'Invalid value: [_1]', encode_html($offset) )
         if $offset && $offset !~ /^\d+$/;

パッチが分からない方は lib/MT/App/Search.pm を任意のエディタで開き、下記の青色の2行を追加してください。

...前略...
sub search_terms {
    my $app = shift;
    my $q   = $app->param;
 
    my $search_string = $q->param('searchTerms') || $q->param('search')
        or return $app->errtrans('No search term was specified.');
    $app->{search_string} = $search_string;
    my $delimiter = $app->translate("delimiter");
    $app->{search_string} =~ s/$delimiter/ /g;
    my $offset = $q->param('startIndex') || $q->param('offset') || 0;
...後略...

2.ja.pm の修正

lib/MT/L10N/ja.pm を任意のエディタで開き、下記の1行を追加してください。

'delimiter' => ' ',

追加する場所は、似たような記述の近辺であればどこでも構いませんが、とりあえず下から4行目にいれましょう。

...前略...
    'Invalid blog_id' => '不正なブログID',
    'Clone Blog' => 'ブログの複製',
    'delimiter' => ' ',
);
 
1;

お分かりの通り、検索フォームのクエリーから全角文字を半角文字に直しているだけです。もう少しエレガントな方法がありましたら情報お待ちしております。

2009.10.03
ファイルのパスが誤っていたので修正しました。

関連記事
トラックバックURL


コメント

yujiro さん、4.22でさっそく試してみました。
どうもありがとうございました。

[1] Posted by s.fujino : December 3, 2008 1:42 AM

yujiroさん、こんばんは。

4.23でもOKでした。
(もう一晩待てばよかった :-)

[2] Posted by s.fujino : December 4, 2008 12:01 AM

>s.fujinoさん
こんばんは。
4.23でのご確認&ご連絡ありがとうございました。
ちょっとタイミングが良くなかったですね(笑)。

[3] Posted by yujiro logo : December 7, 2008 12:09 AM

MT4.261ではパスが
/mt/lib/MT/App/Search.pmとなっておりました。
成功はしたのですが、システムメニューの「全般」「ユーザー」が
エラーが発生しました。
Can't locate object method "new" via package "MT::L10N::ja_bk"
となりました。
回避策はありますか?

[4] Posted by kazu : October 1, 2009 4:54 PM

>kazuさん
こんにちは。
パスについては記載が誤っていたので修正致しました。ご指摘ありがとうございます。
後半のご質問の件につきましては、エラー内容より「ja_bk.pm」というファイルを呼び出しているので、おそらく修正前のバックアップとして ja_bk.pm というファイルを作り、同じディレクトリに置かれたのがエラーの原因と思われます。
ja_xx.pm のファイルを置くと、ja.pm より優先して読み込まれてしまうため、バックアップのファイル名を ja.pm_bk など、拡張子を .pm 以外のものに変更すればエラーを回避できると思います。
それではよろしくお願い致します。

[5] Posted by yujiro logo : October 3, 2009 3:53 PM

yujiroさん
ありがとうございます。
無事回避できました。
エラーメッセージをよく読まないとダメですね・・・。
初歩的ミスですいません・・・。

[6] Posted by kazu : October 4, 2009 9:46 PM

>kazuさん
こんにちは。
ご連絡ありがとうございました。
無事に直ったようで良かったです。
ではでは!

[7] Posted by yujiro logo : October 8, 2009 4:08 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)