2004年05月07日

「MTで任意のファイル名を生成する」MT導入と改造

MovableTypeのファイル名は基本的には番号でふってあるので、あまり分かり良いとは言えない。そこでエントリーとカテゴリーにURN(リソース名)という項目を追加して、リソース名があるときには、ファイル名を番号ではなくそのリソース名で作成するようにした。

内容としては大したことはしていない。変更も非常にすくなくてすんだ。まず、エントリーオブジェクトとカテゴリーオブジェクトにurnプロパティを追加した。これにより各オブジェクトは従来のidプロパティと並行してurnプロパティも持つようになる。違うのは、idプロパティがシステムに自動的に振られる番号であるのに対して、urnプロパティはユーザーによるオブジェクトの編集時に任意の文字列が保持されるところにある。従来のシステムと互換性を保つため、urnプロパティは空の状態が許されている。

次に、ファイル名の生成時には、もしurnプロパティに値が入っていたらそれを使ってファイル名を作り、そうでなければ従来の方法でファイル名を作るようにした。 もしユーザーがurnを指定している場合にはファイル名の生成にそれが使われ、そうでない場合には6桁の数値で表されるidプロパティの内容が使われる。

最後に、エントリーとカテゴリーの編集画面でurnプロパティが入力できるようにテンプレートにインプットフィールドが追加されている。ユーザーがurnフィールドに文字を入れておけばそれがファイル名になり、空のままにしておけば6桁の数値からなるファイル名になる。

ちなみに、このエントリーのurnはMTIS_URNAddedToMTに、カテゴリーのはMTIntroShakeupにしている。そのため、従来の無味乾草な数値だけのURLではなく、もうちょっと意味のある文字列による表現が可能になる。ただ、意味のあるといっても、URLに許された文字だけを使うことができるだけなので、全くの自由になるということにはならない。

以下、変更点をまとめた。

追記:

1.lib\MT\Entry.pm冒頭のパッケージにプロパティを設定しているところに次の赤字の行を追加する。

  17  PACKAGE->install_properties({ 
  18      columns => [ 
  19          'id', 'blog_id', 'status', 'author_id', 'allow_comments',
  20          'title', 'excerpt', 'text', 'text_more', 'convert_breaks',
  21          'to_ping_urls', 'pinged_urls', 'allow_pings', 'keywords',
  22          'tangent_cache',
  23  ## Have to keep this around for use in mt-upgrade.cgi.
  24          'category_id',
#red#  25          'urn',   Yun 20040508: support of urn
  26      ],

2.lib\MT\Category.pmについても同様に次の赤字の行を追加する。

  11  PACKAGE->install_properties({ 
  12      columns => [ 
  13          'id', 'blog_id', 'label', 'author_id', 'ping_urls', 'description', 
  14          'allow_pings',  
  15          'urn',  ## Yun 20040508: support of urn
  16      ], 

3.lib\MT\Util.pmのarchive_file_for関数中、次の棒線で消してある行を赤字の行に変更する。

 452      if ($at eq 'Individual') {
 453          if ($file_tmpl) {
 454              $ctx->stash('entry', $entry);
 455              $ctx->{current_timestamp} = $entry->created_on;
 456          } else {
 457               $file = sprintf("%06d", $entry‐>id); 
 457              ## Yun 20040508: support of urn for individual archive
 458              $file = defined $entry->urn 
                                  ? sprintf("%s", $entry->urn) 
                                  : sprintf("%06d", $entry->id);
 459          }

 487      } elsif ($at eq 'Category') { 
 488          my $this_cat = $cat ? $cat : $entry->category; 
 489          if ($file_tmpl) {
 490              $ctx->stash('archive_category', $this_cat);
 491              $ctx->{__stash}{category} = $this_cat; 
 492          } else { 
 493              my $label = ''; 
 494              if ($this_cat) { 
 495                  $label = dirify($this_cat->label); 
 496              } 
 497              $file = sprintf("cat_%s", $label); 
 497              ## Yun 20040508: support of urn for category archive
 498              $file = defined $this_cat->urn ? sprintf("%s", $this_cat->urn) : sprintf("cat_%s", $label);

4.tmpl\cms\edit_entry.tmplに次の赤字の部分を追加する。

 363                  <option value=""><MT_TRANS phrase="Add new category...">>/option> 
 364                  </TMPL_IF> 
 365                  </select></td> 
 366                  <td valign="middle" width="151">>TMPL_UNLESS NAME=NEW_OBJECT>>a href="javascript:editPlacements( 
 367                  </TMPL_IF> 
 368                  </TMPL_IF> 
 369                  </tr> 
 370 
 371                  <-- yun: added for urn - -> 
 372                  <tr> 
 373                  <td valign="top" width="191"><font class="pagetitle"><MT_TRANS phrase="URN"></font><br/>
 374                  <input class="text-short" name="urn" value="<TMPL_VAR NAME=URN>"></td> 
 375                  </tr>

5.tmpl\cms\edit_category.tmplに次の赤字の部分を追加する。

 110          <tr> 
 111          <td>&lt;font class="pagetitle">&lt;MT_TRANS phrase="Category Name:"> <TMPL_VAR NAME=LABEL></font></td> 
 112          </tr>
 113 
 114          <!-- yun: added for urn - -> 
 115          <tr> 
 116          <td valign="top" width="191"><font class="pagetitle"><MT_TRANS phrase="URN"></font><br/>  
 117          <input class="text-short" name="urn" value="<TMPL_VAR NAME=URN>"></td>  
 118          </tr>  

以上の追加変更で、エントリー編集ページとカテゴリー編集ページのタイトルのしたに「URN」という項目が追加され、そこにURLに許された文字(基本的にアルファベットと英数)でリソース名を入れておくと、それ以後にリビルドされた分からはページのURLが番号ではなくURNで指定された文字列に".html"が追加されたものになる。空欄にしておくと従来通りの名前付けになる。

また、次の6番の変更を施すと、<$MTEntryURN$>と<$MTCategoryURN$>がテンプレート中に使えるようになる。

6.lib\MT\template\context.pmに次の赤字の部分を追加する。

 110          $ctx->register_handler(EntryID => \&_hdlr_entry_id); 
 111          $ctx->register_handler(EntryURN => \&_hdlr_entry_urn); ## Yun 20040508: support of urn 

 205          $ctx->register_handler(CategoryID => \&_hdlr_category_id);
 206          $ctx->register_handler(CategoryURN => \&_hdlr_category_urn); ## Yun 20040508: support of urn 

 883      sub _hdlr_entry_id { 
 884          my $args = $_[1]; 
 885          my $e = $_[0]->stash('entry') 
 886              or return $_[0]->_no_entry_error('MTEntryID'); 
 887          $args && $args->{pad} ? (sprintf "%06d", $e->id) : $e->id; 
 888      } 
 889      sub _hdlr_entry_urn {
 890          my $args = $_[1]; 
 891          my $e = $_[0]->stash('entry') 
 892              or return $_[0]->_no_entry_error('MTEntryURN'); 
 893          $e->urn ? e->urn : ($args && $args->{pad} ? (sprintf "%06d", $e->id) : $e->id); 
 894      } </font>

 1706      sub _hdlr_category_id { 
 1707          my $cat = $_[0]->stash('category') 
 1708              or return $_[0]->error(MT->translate( 
 1709                  "You used an [_1] tag outside of the proper context.", 
 1710                  '&lt;$MTCategoryID$>' )); 
 1711          $cat->id; 
 1712      } 
 1713 
 1714      sub _hdlr_category_urn { 
 1715          my $cat = $_[0]->stash('category') 
 1716              or return $_[0]->error(MT->translate( 
 1717                  "You used an [_1] tag outside of the proper context.", 
 1718                  '<$MTCategoryURN$>' )); 
 1719          defined $cat->urn ? $cat->urn : $cat->id;
 1720      } 

 この「祈祷連歌」のブロブでは、カテゴリーアーカイブに、自分の書き込みだけのものと、コメントを展開したものの2種類のアーカイブを作成するようにしている。これはブロブの設定のカテゴリーアーカイブの設定でひとつのカテゴリーごとに2種類のファイルを作るようにしているからなのだが、ここでファイル名の設定に<$MTCategoryURN$>が使われている。アーカイブのファイル名は、urnそのままだとコメント表示なしで、urnの文字列の最後にLを付けたものはコメント展開版となっている。また、index.htmlも同様で、コメント展開版はindexlong.htmlとなっている。

最後に、次のようにextlib\MT\L10N\ja.pmにURNを「リソース名」などとしておくと良いかもしれない。

 140      ## Global: Entry fields 
 141      'Title' => 'タイトル', 
 142      'Post Status' => 'Post Status', 
 143      'Primary Category' => 'Primary Category', 
 144      'URN' => 'リソース名', 

とりあえず、これで使ってみているが、今のところ深刻な問題はでていない。しかし、MTは設定のバリエーションが多いので、設定によっては問題がでてくる可能性は十分にある。

この記事のトラックバック用 Ping URL: http://www.mediaware.jp/blog/mt-tb.cgi/5
「MTで任意のファイル名を生成する」へのコメント  コメントを書く
「MTで任意のファイル名を生成する」へのトラックバック
コメントを書き込む









メールアドレスを記憶する?


この記事の評価
悪い あんまり 普通 まあまあ 良い





@@@@