Movable Type の変数の初期化に関するまとめ

Movable Type の変数の初期化に関するまとめ

Posted at June 24,2009 12:55 AM
Tag:[MovableType, TemplateTag]

Movable Type の変数の初期化について、「45式::雑記 - MTで変数の値を初期化する方法」に便乗して、まとめっぽくエントリーします。

1.変数を「0」で初期化する

変数を 0 で初期化する場合には value モディファイアの値に 0 を設定します。

<mt:SetVar name="foo" value="0" />

2.変数を空の文字列で初期化する

45式::雑記 - MTで変数の値を初期化する方法」で解説されている通りです。

主な初期化方法は次の2通りです。ひとつは value モディファイアの値を設定しません。

<mt:SetVar name="foo" value="" />

もうひとつは、value モディファイア自体を記述しません。

<mt:SetVar name="foo" />

単純な変数以外に、設定済みの配列変数やハッシュ変数も上記の方法で初期化できます。

3.変数を未定義にする

変数は MTSetVar タグで1項や2項のお作法で設定されていない限り、未定義の状態です。MTSetVar タグなどで一旦定義した変数を未定義にするには undef 関数を利用します。

<mt:SetVar name="undef(foo)" />

利用するケースは少ないと思いますが、未定義にすることで Perl の defined による判定が行なえます。Movable Type で defined を利用するには、test モディファイアを使用します。

変数の定義・未定義のチェックは、下記のサブテンプレートでお試しください。

a.変数が定義されていない状態でのチェック

<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>

aの実施結果

undef!

b.変数を定義した後のチェック

<mt:SetVar name="foo" value="0" />
<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>

bの実施結果

defined!

c.変数を undef した後のチェック

<mt:SetVar name="undef(foo)" />
<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>

cの実施結果

undef!

undef 関数は、配列変数やハッシュ変数にも利用できます。

4.変数の NULL 設定について

Movable Type のテンプレートタグには、NULL 判定に該当する処理はありません。MT の変数が Perl に依存していると考えれば、Perl に NULL が存在しないのがその理由と思います。

なおネットで調べると、DB の NULL については、変数未定義の状態が該当するようです。

燈明日記 - DBでのNULLはPerlではどうなる?

また、PHP には NULL 判定がありますが、is_null() 関数が true を返却する条件として「未定義の変数」も含まれています。

つまり3項の、変数を未定義にする動作が NULL 設定に等しい(または近い)状態と思われます。

関連記事
zenback
人気エントリー
トラックバックURL


コメント

初めまして。ムーバブルタイプ使いにはこちらの情報は大変重宝しております。
参考にさせてもらい、ちょっといじったらこのようなメッセージが出ました。

Can't call method "id" without a package or object reference at lib/MT/ArchiveType/Date.pm line 57.

この原因と対処法についてお知りでしたら教えて頂きますようお願い致します。

[1] Posted by いまじん : June 25, 2009 11:43 PM

>いまじんさん
こんばんは。
ご質問の件ですが、まずどのような編集(あるいは操作)をされたのかをご連絡いただけますでしょうか。また、このエラーは再構築時に出力されたのでしょうか。あわせてご連絡いただければ幸いです。

テンプレートを編集したのであれば、一度、テンプレートの初期化を行なってみてください。初期化は、テンプレート一覧画面をチェックしてプルダウンから「テンプレートの初期化」を選択するか、テンプレート編集画面の右下にあるプルダウンから「テンプレートの初期化」を選択します。
それではよろしくお願い致します。

[2] Posted by yujiro logo : June 27, 2009 2:51 AM

ご返事いただいて本当にありがとうございます。

再構築時に出てしまいます。
週別と日別カテゴリの再構成終了後に
メッセージが出てきます。

オリジナルのスキンではなくて配布している
スキンを入れてすぐには異常は出ませんでしたが
しばらくして症状が出てきたのです。
初期化してしまうと影響は出ないでしょうか?

途中で再構築は止まってしまうようですが、
ファイルの入れ替えや再構築記事更新、
ファイルアップには支障がないようなので
そのままにしています。
メッセージバーに
「ページでエラーが発生しました」
と出てしまっていますが。

[3] Posted by いまじん : June 28, 2009 9:17 AM

>いまじんさん
こんにちは。
ご連絡ありがとうございます。以下、何点か確認です。

●確認事項1
コメント[1]の「ちょっといじったら」というのは、具体的には「週別と日別カテゴリのアーカイブマッピングを追加した」ということでよろしいでしょうか。(YES/NOでお答えください)

●確認事項2
「週別」は「週別カテゴリ」ではなく、単なる「週別」でしょうか?(YES/NOでお答えください)

●確認事項3
追加した「週別」と「日別カテゴリ」という種類は、それぞれ、

  • 週別:「月別ブログ記事リスト」に追加
  • 日別カテゴリ:「カテゴリ別ブログ記事リスト」に追加

となってますでしょうか。(YES/NOでお答えください。NOの場合は、上記のアーカイブマッピングに修正して再構築してみてください)

なお、テンプレートを初期化しても、デザインが元に戻るのみで、他に影響はありません。
それではよろしくお願い致します。

[4] Posted by yujiro logo : June 29, 2009 12:53 PM

度々済みません。

●確認事項1
いじったのはかなり前なので、詳細については覚えていないのですが
アーカイブテンプレートの
・ウェブページ
・カテゴリ別ブログ記事リスト
・ブログ記事
・ブログ記事(コメント)
・月別ブログ記事リスト
・日別ブログ記事リスト
です。これは間違いありません。
そのうち、
・ブログ記事(コメント)
のアーカイブマッピングは私がスクリプトを変え、
「週別と日別カテゴリのアーカイブマッピング」は、
スキンを変えた時に自動に変更になったようです。
●確認事項2
アーカイブテンプレートのリストには
・月別ブログ記事リスト
・日別ブログ記事リスト
テンプレートモジュールのリストには
・月別ページの詳細
があるのですが、「週別」も「週別カテゴリ」も見つかりません。
●確認事項3
日別カテゴリ:「カテゴリ別ブログ記事リスト」に追加
詳しくないのですが、「カテゴリ-日別」はスタティックになっています。

スキンはMovable Type MEMOさんのPandoraをお借りしています。

これで参考になったでしょうか?
つたない返事ですが、引き続きお願いします。

[5] Posted by いまじん : July 3, 2009 10:38 AM

>いまじんさん
こんばんは。
ご連絡ありがとうございます。
確認事項2の質問は、説明不足でしたが、「アーカイブテンプレート」の「テンプレートの設定」にある「種類」欄の表示内容について確認させていただいてます。具体的には下記の画像の赤色部分です(表示している画像には「カテゴリ」しか表示されていませんが、ここに「週別」と表示されているかどうかを確認させていただいてます)。
「種類」欄の表示内容

なお、いまじんさんの設定内容を想定して色々試してみましたが、同様の事象を再現できませんでした。申し訳ありませんが、スキン(テンプレートセット)をデフォルトテンプレートに戻して、再度、再構築を実行願えますでしょうか。

もし、テンプレートをデフォルトに戻して再構築が行なえた場合、配布元(Movable Type MEMO)にご質問頂いた方が不具合が解決する可能性が高いと思います。
それではよろしくお願い致します。

[6] Posted by yujiro logo : July 5, 2009 12:44 AM

返事重ね重ねありがとうございます。
ご指摘のあったアーカイブテンプレートの
・ウェブページ
・カテゴリ別ブログ記事リスト
・カレンダー
・ブログ記事
・ブログ記事(コメント)
・月別ブログ記事リスト
・日別ブログ記事リスト
の全部を確認してみましたが、
「週別」と表示されているのはひとつもありませんでした。

デフォルトテンプレートに戻すしかないのでしょうか。。。
スキン配布先のサイトさんにも聞いてみましたが、
事情は分からないようです。

でも、MTについては最も信頼されている小粋空間さんの
アドバイスなので、もう一度再構成するしかないかなあと
諦めモードになってます。

無知なな私にとっては有難いバイブルなので
欠かさずに拝見しています。
何かの解決法があったら、今度はエントリー上で
是非アドバイスお願いします。

今後も頑張って下さい。大変お世話になりました。

[7] Posted by いまじん : July 8, 2009 12:37 AM

>いまじんさん
こんにちは。
ご連絡ありがとうございました。
今使われているテンプレートは、「テンプレートの初期化」を行う際、バックアップとして残すことができます。
あるいは、現状で一度、バックアップ(「ツール」→「バックアップ」)をとっておけば、復元することも可能です。
また、個々のテンプレート単位で初期化を行うこともできますので、最適な方法を選択してください。

どうしてもテンプレートを変更したくない場合、以下の方法もあります。

  • 現在のブログデータをエクスポート(「ツール」→「エクスポート」)
  • 「ブログの新規作成」で別のブログをもうひとつ作成し(デフォルトテンプレートを選択)
  • 作成したブログにエクスポートしたブログデータをインポート(「ツール」→「インポート」)
  • 新しいブログを再構築できることを確認

いずれにしても、再構築が正常に行えることを確認し、それから再度トライされることをおすすめします。
それではよろしくお願い致します。

[8] Posted by yujiro logo : July 8, 2009 10:31 AM

同じエラーがMT4.2で出てきたので、検索してここにたどり着きました。
私の場合、複数のブログ記事にて、エントリーの公開日が重複している場合に、このエラーが出ていたのが原因でした。もし特定のエントリーを再構築する際にエラーが出るようであれば、エントリーの公開日を重複しないようにしてみてはいかがでしょうか。

[9] Posted by abilitydesign : August 29, 2009 7:13 AM

>abilitydesignさん
こんばんは。
ご返事遅くなりましたが情報ありがとうございました!

[10] Posted by yujiro logo : September 3, 2009 7:44 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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