読者です 読者をやめる 読者になる 読者になる

MTで空白区切りの値を配列に入れて利用する

昨日に引き続きMTの話。


やりたいことは、

  • ウェブページ投稿時、フィールドに空白区切りの値を入れて、それをテンプレート側で空白でバラして変数に入れる

というよくある感じのこと。


具体的には、

  1. 「読み込むスタイルシート」ってカスタムフィールドを作り、そこに「/css/1.css /css/2.css」みたいな値を入れる
  2. テンプレート側でそれをバラして配列の変数に入れる
  3. そのあと配列をループさせてスタイルシートのlinkタグを作る

ってことをやって、ページ毎に読み込むスタイルシートを変えたいという感じです。


以前おんなじようなことをやったときは、ググって出てきたsplitモディファイアプラグインみたいなのを入れて

<$MTPageDataCSS split="/\s/" setvar="array_data"$>

みたいな感じでやりました。
(MTPageDataCSSに空白区切りの値が入ってて、それを空白で区切って配列array_dataに代入)


ただ今回はなるべくデフォルトの機能だけでどうにかしたかったので以下のようにしました。

<MTIgnore><!--
 ウェブページ作成ページの「読み込むスタイルシート」欄に入力した値を半角スペースで区切り配列にする
--></MTIgnore>
<MTIf tag="MTPageDataCSS">
  <MTSetVars>
    page_data_css=<$MTPageDataCSS$>
    page_data_css_count=<$MTPageDataCSS count_words="1"$>
  </MTSetVars>
  <MTFor from="1" to="$page_data_css_count">
    <MTIf name="__last__">
      <MTSetVarBlock name="css_list" function="push"
      ><$MTVar name="page_data_css"$></MTSetVarBlock>
    <MTElse>
      <MTSetVarBlock name="css_list" function="push"
      ><$MTVar name="page_data_css"
      regex_replace="/^([^\s]+)\s(?:.+)$/","$1"$></MTSetVarBlock>
      <MTSetVars>
        page_data_css=<$MTVar name="page_data_css" regex_replace="/^(?:[^\s]+)\s(.+)$/",'$1'$>
      </MTSetVars>
    </MTIf>
  </MTFor>

  <MTLoop name="css_list">
    <link rel="stylesheet" type="text/css" href="<$MTGetVar name="__value__"$>" media="all">
  </MTLoop>
</MTIf>
  1. MTPageDataCSSをそのまま使いたくないのでpage_data_cssに代入
  2. count_words="1"を付けると「空白区切りの単語の数」がわかるので、それをpage_data_css_countに代入
  3. MTForを使って「空白区切りの値の数」分だけループ
  4. 空白の前までの値をどんどんcss_listという配列にpushしていく
  5. ループが終わるとcss_listにバラした値が入るので、最後にMTLoopを使って__value__で値を取得し、linkタグを作成する


とりあえずこれでできたっぽい。
グローバルモディファイアって結構たくさんあるので何かもっと簡単にできそうなのだけど上手い方法が思いつかない。