お知らせ

Movable Type 5.1 Webサイト製作ガイドVolume 22011年7月20日

Movable Type 5.1 Webサイト製作ガイドVolume 2」を発売しました。
前書「Movable Type 5 Webサイト製作ガイド Volume 2」をMovable Type 5.1対応に改訂しました。 「Movable Type 5.1 Webサイト製作ガイドVolume 1」の続編で、変数等の応用的な機能や、ウェブサイトやテーマなどのMovable Type 5の新機能についてしっかり解説した書籍です。
Movable TypeでWeb製作をされている方などにお勧めです。
PDFによる販売で、当サイトでのみ購入できます(書店では購入できません)

他にも多数書籍を執筆しています。
こちらもぜひご覧ください。

数値型のカスタムフィールドを追加するプラグイン(その2)

| コメント(14) | トラックバック(0)

昨日に続いて、数値型のカスタムフィールドを追加するプラグインについてお話しします。
今日は、既存のテキスト型のデータを数値型に変換する方法を解説します。

1.データのバックアップ

テキストから数値への変換は、phpMyAdmin等を使って、SQLを直接に実行する形で行います。
多くのデータが影響を受けますので、万が一の事態に備えて、ブログのデータを必ずバックアップしておいてください。
また、バックアップから正しく復元できることも、確認しておいてください。

2.SQLに必要な情報のチェック

SQLを実行する前に、以下の4つの情報をメモしておいてください。

  • ブログのID
  • 変換元のテキスト型フィールドのベースネーム
  • 変換先の数値型フィールドのベースネーム
  • 変換先の数値型フィールドの数値の型(整数/浮動小数点数)

3.SQLの実行

次に、phpMyAdmin等を使って、SQLを実行します。
まず以下のようなSQLを実行します。

delete mt_entry_meta.*
from mt_entry_meta, mt_entry, mt_blog
where entry_meta_entry_id = entry_id
and entry_blog_id = blog_id
and blog_id = ブログのID
and entry_meta_type = 'field.変換先の数値型フィールドのベースネーム'

次に、以下のSQLを実行します。
「数値の型」のところには、整数型なら「vinteger」、浮動小数点型なら「vfloat」を入れます。

update mt_entry_meta, mt_entry, mt_blog
set entry_meta_type = 'field.変換先の数値型フィールドのベースネーム',
entry_meta_数値の型_idx = entry_meta_vchar_idx,
entry_meta_vchar_idx = null
where entry_meta_entry_id = entry_id
and entry_blog_id = blog_id
and blog_id = ブログのID
and entry_meta_type = 'field.変換元のテキスト型フィールドのベースネーム'

例えば、以下のような変換を行いたいとします。

項目
ブログのID1
変換元のテキスト型フィールドのベースネームtext1
変換先の数値型フィールドのベースネームnumber1
変換先の数値型フィールドの数値の型整数(vinteger)

この場合、以下の順でSQLを実行します。

delete mt_entry_meta.*
from mt_entry_meta, mt_entry, mt_blog
where entry_meta_entry_id = entry_id
and entry_blog_id = blog_id
and blog_id = 1
and entry_meta_type = 'field.number1'
update mt_entry_meta, mt_entry, mt_blog
set entry_meta_type = 'field.number1',
entry_meta_vinteger_idx = entry_meta_vchar_idx,
entry_meta_vchar_idx = null
where entry_meta_entry_id = entry_id
and entry_blog_id = blog_id
and blog_id = 1
and entry_meta_type = 'field.text1'

4.ベースネーム/テンプレートタグ名の変更

次に、変換元のテキスト型のフィールドを削除します。
そして、変換先の数値型のフィールドで、ベースネームとテンプレートタグ名を、変換元のテキスト型のベースネーム/テンプレートタグ名に変更します。

Facebook連携

当記事について「いいね」や「送信」を行っていただけると幸いです。


この記事についてウォールに投稿

トラックバック(0)

トラックバックURL: http://www.h-fj.com/mt/mt-tb.cgi/1635.

コメント(スレッド8件,コメント14件)

コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。

No.1 あぬあぬ : このプラグインで数値での検索は可能になりますか?

今、MTに藤本様著作のMTOS活用テクニックを用いて、数値検索の設置で格闘中なのですが、どうにもこうにもうまくいきません。
現在は、上記の本を見ながら自作のカスタムフィールドを作り管理画面に設置できたものの、数値を入れて保存をしても数値が入らない状況で、なんともかんとも、先に進みません。

edit_entry.htmlには以下の記述を入れました。

<mtapp:setting
    id="entry_price_01"
    label="プラン01-値段"
    label_class="top-label">
        <input name="entry_price_01" id="entry_price_01" size="8" value="<$mt:var name="entry_price_01" escape="html"$>" maxlength="255" mt:watch-change="1" class="full-width" />
</mtapp:setting>

プラグインファイルは以下のように記述しました。

package MT::Plugin::EntryNumberField;
use base 'MT::Plugin';
 
use strict;
 
use MT;
use MT::Plugin;
use MT::Template::Context;
use MT::Entry;
 
# register plugin
my $plugin = __PACKAGE__->new({
    name => 'EntryNumberField',
    key => 'entry_number_field',
    version => '1.00',
    author_name => 'Yasuhide Kakinuma',
    description => 'Add Number field to entry.',
    schema_version => '1.00',
});
MT->add_plugin($plugin);
 
# initialize registry
sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        object_types => {
            'entry' => {
                'price_01' => 'integer',
                'price_02' => 'integer',
                'price_03' => 'integer',
                'max_sitting' => 'integer',
                'max_standing' => 'integer',
            },
        },
        tags => {
            function => {
                EntryPrice01 => \&entry_price_01,
                EntryPrice02 => \&entry_price_02,
                EntryPrice03 => \&entry_price_03,
                EntryMaxSitting => \&entry_max_sitting,
                EntryMaxStanding => \&entry_max_standing,
            },
        },
        callbacks => {
            'cms_pre_save.entry' => {
                priority => 9,
                code => \&save_entry_field,
            },
        }
   });
}
 
sub save_entry_field {
    my ($eh, $app, $entry, $orig_entry) = @_;
 
    $entry->price_01(int($app->param('price_01')));
    $entry->price_02(int($app->param('price_02')));
    $entry->price_03(int($app->param('price_03')));
    $entry->max_sitting(int($app->param('max_sitting')));
    $entry->max_standing(int($app->param('max_standing')));
    1;
};
 
sub entry_price_01 {
    my ($ctx, $args) = @_;
 
    my $entry = $ctx->stash('entry')
        or return $ctx->_no_entry_error();
    int($entry->price_01);
}
 
sub entry_price_02 {
    my ($ctx, $args) = @_;
 
    my $entry = $ctx->stash('entry')
        or return $ctx->_no_entry_error();
    int($entry->price_02);
}
 
sub entry_price_03 {
    my ($ctx, $args) = @_;
 
    my $entry = $ctx->stash('entry')
        or return $ctx->_no_entry_error();
    int($entry->price_03);
}
 
sub entry_max_sitting {
    my ($ctx, $args) = @_;
 
    my $entry = $ctx->stash('entry')
        or return $ctx->_no_entry_error();
    int($entry->max_sitting);
}
 
sub entry_max_standing {
    my ($ctx, $args) = @_;
 
    my $entry = $ctx->stash('entry')
        or return $ctx->_no_entry_error();
    int($entry->max_standing);
}
 
1;

どこか、間違いはありますでしょうか?

No.2  : Re:このプラグインで数値での検索は可能になりますか?

>あぬあぬさん
こんにちは。
拙著をお買い求めいただき、ありがとうございます。

ご質問の件ですが、edit_entry.tmplに追加している部分に間違いがあります。
フィールド名等に「entry_price_01」とありますが、それらの「entry_」を削除して、以下のようにしてください。

<mtapp:setting
    id="price_01"
    label="プラン01-値段"
    label_class="top-label">
        <input name="price_01" id="price_01" size="8" value="<$mt:var name="price_01" escape="html"$>" maxlength="255" mt:watch-change="1" class="full-width" />
</mtapp:setting>
No.3 あぬあぬ : ありがとうございます。

早速のお返事ありがとうございます。
お蔭様で、数値を保存することが出来ました。
がしかし、今度は別の問題が起きました。

○○以下の数値検索を行ってみたのですが、結果が「以下」になりません。
サーチフォームは以下です。

<input type="text" name="price01" id="price01" size="15" />以下

検索結果表示のモジュールは以下です。

<mt:GetQueryParamsToVars>
<mt:SearchConditions>
 <mt:SearchConditionCompare field="price01" le="$qp_price01_max">
</mt:SearchConditions>

必要なプラグイン類は入っているのですが、いろいろと試してみましたが、うまく動作しません。
お手数ですが、記述のチェックをお願いできればと思います。

No.4  : Re:ありがとうございます。

>あぬあぬさん
こんにちは。

ご質問の件ですが、MTSearchConditionCompareタグの「le」モディファイアの最後の「_max」が間違いです。
以下のように変えてください。

<mt:SearchConditionCompare field="price01" le="$qp_price01">
No.5 あぬあぬ : ご回答ありがとうございます。

上記の内容に変更してみましたが、今度は結果に何も表示されなくなってしまいました。
お手数掛けて申し訳ありませんが、何か他に考えられる原因はありますでしょうか?

サーチフォームは以下

<form name="search_form" id="search_form" method="get" action="<mt:RealtimeRebuildCGIPath>">
<input type="hidden" name="IncludeBlogs" value="<$mt:BlogID$>" />
 
  <table class="queryform">
 
    <tr>
      <th>お一人様の予算</th>
      <td>
        
        <input type="text" name="price01" id="price01" size="15" />以下
 
      </td>
    </tr>
 
  </table>
  <p>
    <input type="hidden" name="tmpl_id" value="<$mt:GetTemplateId tmpl_name="検索結果表示"$>" />
    <input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
    <input type="submit" name="submit" value="送信" />
  </p>
</form>
 

検索結果表示のモジュールは以下

<mt:GetQueryParamsToVars>
<mt:SearchConditions>
<mt:SearchConditionCompare field="price01" le="$qp_price01">
</mt:SearchConditions>
 
 <mt:Entries>
  <div id="shop"> 
<mt:entrymainimageasset>
 <a href="<$mt:Entrypermalink$>"><img src="<mt:assetthumbnailURL width="111" height="71">" alt="<$MTEntryTitle$>" title="<$MTEntryTitle$>"/></a> </mt:entrymainimageasset>
  <p><a href="<$mt:Entrypermalink$>"><$mt:EntryTitle$></a></p> 
 </div>
 </mt:Entries>
No.6  : Re:ご回答ありがとうございます。

>あぬあぬさん
こんにちは。

最初のご質問のリストだと、データベースに追加したフィールドの名前は「price_01」になっています。
一方、検索フォームおよび検索結果表示モジュールのテンプレートを見ると、フィールド名が「price01」になっています(priceの後のアンダースコアがない)。
検索フォームおよび検索結果表示モジュールの「price01」を「price_01」に全置換してください。

No.7 あぬあぬ : ありがとうございます!!

すみません、こちらのケアレスミスでした。
無事動作いたしました!
最後まで本当にありがとうございます。
藤本様のMT関連本は全部購入し、今読んでいる段階です。
他に無い充実度で、本当に助かっております。
ありがとうございました。

No.8 あぬあぬ : また壁にぶち当たりました。

前回は、ありがとう御座いました。
今回、またご相談があるのですが・・・
前回、○○以下の検索が出来るようになったのですが、今回は△△以上○○以下の検索が出来るようにシステムを組んでみたのですが、△△以上が動作しません。○○以下は動作するんですが。
例えば、数値が3000だとした場合、検索で1000以上、5000以下で検索すると、大丈夫なんですが、1000以上のみで検索すると、ヒットしません。藤本さんの書籍を参考にプログラムを書いてみたのですが、うまく動作しません。以下にコードを記述します。

サーチフォーム

<td>人数(着席の場合)</td>
<td><select name="max_sitting_min" id="max_sitting_min">
  <option>選択しない</option>
  <option value="5">5名</option>
  <option value="10">10名</option>
  <option value="20">20名</option>
  <option value="30">30名</option>
  <option value="40">40名</option>
  <option value="50">50名</option>
  <option value="60">60名</option>
  <option value="70">70名</option>
  <option value="80">80名</option>
  <option value="90">90名</option>
  <option value="100">100名</option>
  <option value="120">120名</option>
  <option value="140">140名</option>
  <option value="160">160名</option>
  <option value="180">180名</option>
</select>
  から
  <select name="max_sitting_max" id="max_sitting_max">
 <option>選択しない</option>
  <option value="10">10名</option>
  <option value="20">20名</option>
  <option value="30">30名</option>
  <option value="40">40名</option>
  <option value="50">50名</option>
  <option value="60">60名</option>
  <option value="70">70名</option>
  <option value="80">80名</option>
  <option value="90">90名</option>
  <option value="100">100名</option>
  <option value="120">120名</option>
  <option value="140">140名</option>
  <option value="160">160名</option>
  <option value="180">180名</option>
  <option value="200">200名</option>
  </select>
  まで      </td>
</tr>

検索結果表示モジュール

<mt:GetQueryParamsToVars>
<mt:SearchConditions>
<mt:SearchConditionCompare field="max_sitting" ge="$qp_max_sitting_min" le="$qp_max_sitting_max">
</mt:SearchConditions>

プラグインファイルは前回と同様です。

No.9  : Re:また壁にぶち当たりました。

>あぬあぬさん
こんにちは。

下限/上限の「選択しない」のoptionタグを以下のように変えれば、動作するはずです。

<option value="">選択しない</option>

ちなみに、optionタグのvalue属性を省略すると、<option>と</option>の間の値(いただいた例なら「選択しない」の文字列)がサーバーに送信されてしまい、正しく比較することができません。

No.10 あぬあぬ : ありがとうございます。

単にフォームの作り方がまずかっただけですね。
お恥ずかしい限りです。
毎度毎度すみません。
本当に助かっております。
ありがとうございました。

No.11 アソーカ・タノ : SQL実行後の作業について質問です

いつも参考にさせていただいています。先日は早々のご回答ありがとうございました。
当記事に書かれている「4.ベースネーム/テンプレートタグ名の変更」の件でご質問がありコメントさせていただきます。
NumericCustomFieldsプラグインを導入し、1.から3.の手順を終えた後、4.の「変換元のテキスト型のフィールドを削除」と「変換先の数値型のフィールドのベースネームとテンプレートタグ名変更」は、どこで行えばいいでしょうか?
記事を拝読して、4.はカスタムフィールド一覧画面で行うものだと考えて作業を進めたのですが、変換元のテキスト型フィールドは残っていて、変換先の数値型フィールドは一覧画面には表示されていませんでした(変換元のテキスト型フィールドに入力していたデータは空白になっていました)。
phpMyAdminでmt_entry_metaテーブルを確認すると、entry_meta_typeに「変換先の数値型フィールドのベースネーム」は在りますが「変換元のテキスト型フィールドのベースネーム」は存在していませんでした。
3.と4の作業は「変換元のテキスト型フィールドに入力していたデータを、変換先の数値型フィールドにコピー」→「カスタムフィールド一覧から変換元フィールドを削除」→「変換先フィールドのベースネームとテンプレートタグ名を変換元のものに変更」ということかなと理解していたのですが、SQL文に詳しくなく、何か根本的な勘違いをしているのであれば大変恐縮なのですが、ご指摘いただければ助かります。
よろしくお願いいたします。

No.12  : Re:SQL実行後の作業について質問です

>アソーカ・タノさん
こんにちは。

ご質問の件ですが、変換先のカスタムフィールドは、Movable Typeの管理画面で手動で作成してください。
SQLでは作成されません。

No.13 アソーカ・タノ : (無題)

藤本様

早々にご回答をいただき感謝します。
手動でフィールドを再作成します。
ありがとうございました。

No.14 アソーカ・タノ : (無題)

藤本様

記事に書かれていることをもう一度確認しながら、無事数値型への変換を行うことができました。
MTのカスタムフィールドに関するテーブルスキーマ(mt_entry_metaなど)をきちんと理解できていなかったのですが、この作業を通じて勉強になりました。
ありがとうございました。

コメントする


Facebookでコメント

試験的にFacebookのコメントフォームを設置しました。