かえラボBlog

かえラボBlogはラナデザインアソシエイツのテクニカルチームが運営する技術系ラボプロジェクトです

RaNa design associates, inc.

CMS :: Recent Entries

January 21, 2010

[MT]リンクやファイルのパスを全て相対パスにしたい場合

Category :

MTが置いてあるサーバーと本番公開用サーバーが異なる場合、MTで書き出したファイルをそのまま本番サーバーにアップしてしまうと、HTML中でhttp://で始まるパスが合わなくなってしまいます。(パスはMTの置いてあるサーバーを指してしまう)

これを解決するためにどうにか、絶対パスを出力しないように工夫してテンプレートを組むわけですが、MTタグによっては必ず絶対パスを出力してしまうものがあります。
例えばMTEntryPermalink
これ、使えないと結構面倒。

今日ふと思いついたんですが「出力を置き換えてしまう」って方法がありました。
まず絶対パスでホストURL部分が入った変数を作り

<mt:SetVarBlock name='website_absolute_url'>http://<$mt:BlogHost$>/</mt:SetVarBlock>

この変数を元に、該当タグの出力を置換。

<$mt:EntryPermalink replace='$website_absolute_url','/'$>

おー、なんで今まで思いつかなかったんだろう!

January 20, 2010

MT5に移行したら「検索結果」が動かなくなった件

Category :

MT4のテンプレートをそのままMT5に移行したら、「検索結果」及び「タグ検索」で以下のスクリーンショットのようなエラーが出て、動作しなくなりました。つまり、mt-search.cgi系がダメになったってことですね。

エラーメッセージ「Can't coerce array into hash」

「検索結果」テンプレートとにらめっこして原因究明をしていった結果、「タグクラウド」ウィジェットにあることが判明。このウィジェットで <mt:If tag="Tags"> ... </mt:If> という風に<mt:If>してるところでダメが出ていました。

「タグクラウド」ウィジェット

<mt:If tag="Tags">
<div class="widget-tag-cloud widget">
  <h3 class="widget-header">Tag Cloud</h3>
  <div class="widget-content">
    <ul>
      <mt:Tags top="20"><li class="rank-<$mt:TagRank max="10"$>"><a href="<$mt:TagSearchLink encode_html="1"$>" rel="tag"><$mt:TagName$></a></li>
      </mt:Tags>
    </ul>
  </div>
</div>
</mt:If>

どうやら「検索結果」テンプレートから<mt:If>MTTagsタグの有る無しを判定しちゃいけないように仕様が変わったようなんですね。仕様というより、バグと言ってもいいと思います。
ちなみに<mt:IfNonEmpty tag="Tags">に変更してもダメでした。

これを知ってか知らずか、MT5のデフォルトテンプレートでは「タグクラウド」ウィジェットは以下のようなコードになっています。

<mt:Tags top="20">
<mt:If name="__first__">
<div class="widget-tag-cloud widget">
    <h3 class="widget-header">タグクラウド</h3>
    <div class="widget-content">
        <ul>
</mt:If>
            <li class="rank-<$mt:TagRank max="10"$>"><a href="javascript:void(0)" onclick="location.href='<$mt:TagSearchLink encode_js="1"$>';return false;" rel="tag"><$mt:TagName$></a></li>
<mt:If name="__last__">
        </ul>
    </div>
</div>
</mt:If>
</mt:Tags>

確かに<mt:If tag="Tags">とは書いてありません。なんでしょう、この納得のいかない感じは・・・。

December 18, 2009

[MT4]SSIのインクルードを使う

Category :

MT5が出たというのにMT4ネタで申し訳ないのですが、MT4でモジュールのSSIインクルードを設定するのに、1個注意点があったのでメモ。
※ここでは、サーバー側のSSIの設定云々については省きます。

MT4の管理画面で「設定」→「公開」と画面遷移すると、下の方に「サーバーサイドインクルード」という項目があるので、それを「ApacheのSSI」に設定し、「変更を保存」。再構築。

MT4の管理画面で「設定」→「公開」

ここで書き出されたファイルをFTPで落としてきて中身を確認したところ、SSIになっていない。これだけではダメなのかー、とつまづいたところで、MTのドキュメントを確認。
MTIncludeタグのドキュメントを確認したところ、「ssi="1 | 0"」というモディファイアがあることを発見し、

<$mt:Include module='hoge/fuga.html' ssi='1'$>

という風に、テンプレートのMTIncludeタグにモディファイアを追加したら、見事SSIインクルードになりました。

August 10, 2009

ファイルがアップロードできない現象

Category :

「 不正な要求です。文字コードUTF-8に含まれない文字データを送信しています。」というエラーメッセージが出て、MTでファイルアップロードができなくなる現象が報告されています。

ファイルアップロードでエラー「不正な要求です。文字コードUTF-8に含まれない文字データを送信しています。」 | Movable Type 4 FAQ

上記の公式記事によると、発生条件は以下の3つ全てを満たした場合。

  • Perl 5.8.5 以前のバージョンをお使いの環境
  • アップロードするファイルのパスに日本語が含まれている
  • ブラウザに Internet Explorer を使用

上記の2件目がポイントで、Windowsの「デスクトップ」(もしくはそれ以下のディレクトリ)にファイルを置いていると、パスに日本語が含まれていることになってしまい、アップロードに失敗します。My Documentsは大丈夫なようです。

弊社の某案件で体験したお話でした。
エラーメッセージでググるって、重要ですね!

June 3, 2009

MTテンプレートで「ファイルへのリンク」をする際の注意点

Category :

パスはサーバーのフルパスで記述します。そうすれば、テンプレートファイルがパブリッシュされるディレクトリにあろうと、MTが格納されたディレクトリにあろうと、リンクすることができます。 サーバーのフルパスは「設定」→「公開」画面にある「サイトパス」で見ることができますよ~。

それから2つ目の注意点は、テンプレートファイルは必ず文字コードをUTF-8にすることです。Shift-JISなどで保存してしまうと、マルチバイト文字が出現したところからテンプレートがばっさり切れてしまいます。

June 1, 2009

MTでサブドメインを扱う際の注意

Category :

特定のディレクトリにサブドメインを割り当て、ルートに置いてあるMTからそこにパブリッシュする、という案件をやったので気づいたことメモ。

  • mt-config.cgiのCGIPath/StaticWebPath は絶対パスで指定すること

    CGIPath        http://example.net/mt_directory/
    StaticWebPath  http://example.net/mt_directory/mt-static/

    そうしないと、<$mt:CGIPath$>などを使う場合にパスがずれてしまう恐れがある。

  • <$MTBlogRelativeURL$>を使う場合、システムテンプレートでは<$MTBlogURL$>に置き換えること。システムテンプレートが適用されるのは、MTディレクトリにあるプログラムであるため。

  • サブドメインはクロスドメイン扱いになるので、ドメイン縛りでAjaxが使えなくなる。
    MTディレクトリにあるプログラム(※)から、Ajaxでパブリッシュフォルダ内のファイルをリクエストするケースなど。
    ※コメントフォームや検索結果など、システムテンプレートを使うもの

とにかくいろいろなパスが通らなくなります。全テンプレートから読み込む共通ヘッダーなどで、次のような変数を指定しておき、それを呼び出すことでパスを呼び出すとか。工夫が必要です。

<mt:SetVarBlock name="siteURL">
  <mt:If name="system_template">
    <mt:MultiBlog include_blogs="1"><$mt:BlogURL$></mt:MultiBlog>
    <mt:Else><mt:MultiBlog include_blogs="1"><$mt:BlogRelativeURL$></mt:MultiBlog>
  </mt:If>
</mt:SetVarBlock>

上記のsiteURL-MT変数を呼び出すと、システムテンプレートではID1のブログの絶対パスが、その他のテンプレートで呼び出すと、ID1のブログの相対パスが出力される仕組みです。

February 5, 2009

カスタムフィールド「テキスト(複数行)」でもconvert_breaksは使える

Category :

MTのネタです。
カスタムフィールドで種類「テキスト(複数行)」を選択すると、エントリー画面で複数行のテキスト(「概要」フィールドみたいな感じ)を入力することができます。

公式ドキュメントには書いていないのですが、このカスタムフィールドの値をテンプレート中に呼び出す時に、convert_breaksモディファイアを使うことができます。例えば以下のような感じで。

<mt:If tag="taghogehoge"><$mt:taghogehoge convert_breaks="1"$></mt:If>

convert_breaks="1"とすると入力した改行が、<br /><p>に変換され、ページに反映されます。

たすけあいジャパン
ラナデザインアソシエイツは、「助けあいジャパン」に協力しています。