昨日に続いて、数値型のカスタムフィールドを追加するプラグインについてお話しします。
今日は、既存のテキスト型のデータを数値型に変換する方法を解説します。
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.変換元のテキスト型フィールドのベースネーム'
例えば、以下のような変換を行いたいとします。
| 項目 | 値 |
|---|---|
| ブログのID | 1 |
| 変換元のテキスト型フィールドのベースネーム | 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.ベースネーム/テンプレートタグ名の変更
次に、変換元のテキスト型のフィールドを削除します。
そして、変換先の数値型のフィールドで、ベースネームとテンプレートタグ名を、変換元のテキスト型のベースネーム/テンプレートタグ名に変更します。





![Hardcore Will Never Die, But You Will [Bonus Tracks] Hardcore Will Never Die, But You Will [Bonus Tracks]](http://userserve-ak.last.fm/serve/34s/67192634.jpg)



コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
今、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;どこか、間違いはありますでしょうか?
>あぬあぬさん
こんにちは。
拙著をお買い求めいただき、ありがとうございます。
ご質問の件ですが、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>早速のお返事ありがとうございます。
お蔭様で、数値を保存することが出来ました。
がしかし、今度は別の問題が起きました。
○○以下の数値検索を行ってみたのですが、結果が「以下」になりません。
サーチフォームは以下です。
検索結果表示のモジュールは以下です。
必要なプラグイン類は入っているのですが、いろいろと試してみましたが、うまく動作しません。
お手数ですが、記述のチェックをお願いできればと思います。
>あぬあぬさん
こんにちは。
ご質問の件ですが、MTSearchConditionCompareタグの「le」モディファイアの最後の「_max」が間違いです。
以下のように変えてください。
上記の内容に変更してみましたが、今度は結果に何も表示されなくなってしまいました。
お手数掛けて申し訳ありませんが、何か他に考えられる原因はありますでしょうか?
サーチフォームは以下
<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>検索結果表示のモジュールは以下
>あぬあぬさん
こんにちは。
最初のご質問のリストだと、データベースに追加したフィールドの名前は「price_01」になっています。
一方、検索フォームおよび検索結果表示モジュールのテンプレートを見ると、フィールド名が「price01」になっています(priceの後のアンダースコアがない)。
検索フォームおよび検索結果表示モジュールの「price01」を「price_01」に全置換してください。
すみません、こちらのケアレスミスでした。
無事動作いたしました!
最後まで本当にありがとうございます。
藤本様のMT関連本は全部購入し、今読んでいる段階です。
他に無い充実度で、本当に助かっております。
ありがとうございました。
前回は、ありがとう御座いました。
今回、またご相談があるのですが・・・
前回、○○以下の検索が出来るようになったのですが、今回は△△以上○○以下の検索が出来るようにシステムを組んでみたのですが、△△以上が動作しません。○○以下は動作するんですが。
例えば、数値が3000だとした場合、検索で1000以上、5000以下で検索すると、大丈夫なんですが、1000以上のみで検索すると、ヒットしません。藤本さんの書籍を参考にプログラムを書いてみたのですが、うまく動作しません。以下にコードを記述します。
サーチフォーム
検索結果表示モジュール
プラグインファイルは前回と同様です。
>あぬあぬさん
こんにちは。
下限/上限の「選択しない」のoptionタグを以下のように変えれば、動作するはずです。
<option value="">選択しない</option>
ちなみに、optionタグのvalue属性を省略すると、<option>と</option>の間の値(いただいた例なら「選択しない」の文字列)がサーバーに送信されてしまい、正しく比較することができません。
単にフォームの作り方がまずかっただけですね。
お恥ずかしい限りです。
毎度毎度すみません。
本当に助かっております。
ありがとうございました。
いつも参考にさせていただいています。先日は早々のご回答ありがとうございました。
当記事に書かれている「4.ベースネーム/テンプレートタグ名の変更」の件でご質問がありコメントさせていただきます。
NumericCustomFieldsプラグインを導入し、1.から3.の手順を終えた後、4.の「変換元のテキスト型のフィールドを削除」と「変換先の数値型のフィールドのベースネームとテンプレートタグ名変更」は、どこで行えばいいでしょうか?
記事を拝読して、4.はカスタムフィールド一覧画面で行うものだと考えて作業を進めたのですが、変換元のテキスト型フィールドは残っていて、変換先の数値型フィールドは一覧画面には表示されていませんでした(変換元のテキスト型フィールドに入力していたデータは空白になっていました)。
phpMyAdminでmt_entry_metaテーブルを確認すると、entry_meta_typeに「変換先の数値型フィールドのベースネーム」は在りますが「変換元のテキスト型フィールドのベースネーム」は存在していませんでした。
3.と4の作業は「変換元のテキスト型フィールドに入力していたデータを、変換先の数値型フィールドにコピー」→「カスタムフィールド一覧から変換元フィールドを削除」→「変換先フィールドのベースネームとテンプレートタグ名を変換元のものに変更」ということかなと理解していたのですが、SQL文に詳しくなく、何か根本的な勘違いをしているのであれば大変恐縮なのですが、ご指摘いただければ助かります。
よろしくお願いいたします。
>アソーカ・タノさん
こんにちは。
ご質問の件ですが、変換先のカスタムフィールドは、Movable Typeの管理画面で手動で作成してください。
SQLでは作成されません。
藤本様
早々にご回答をいただき感謝します。
手動でフィールドを再作成します。
ありがとうございました。
藤本様
記事に書かれていることをもう一度確認しながら、無事数値型への変換を行うことができました。
MTのカスタムフィールドに関するテーブルスキーマ(mt_entry_metaなど)をきちんと理解できていなかったのですが、この作業を通じて勉強になりました。
ありがとうございました。