2019年3月アーカイブ

表題の件を探したところ「かたつむりくんのwww」に良い記事があったのでメモメモ。
https://tinybeans.net/blog/2012/06/16-075413.html

 

<$mt:SetVar name="favorite" value="バッジョ,ジーコ,クライフ,ピルロ,ストイコビッチ,グアルディオラ"$>
<$mt:Var name="favorite" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length"$>

<mt:For var="i" from="1" to="$length">
  <mt:If name="__first__"><ul></mt:If>
  <$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
  <$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
  <li><$mt:Var name="value"$></li>
  <mt:If name="__last__"></ul></mt:If>
</mt:For>

カンマの数を拾ってループさせる回数を決め、<For>でその回数だけ回して、使った分だけ削って次へ回す感じかな。

元ページのほうに詳しい解説があるのでそちらも参照すること。

実案件で作ったので備忘録。

クライアントは某自治体(代理店も入っているので名前は明かせない)。今回の要望は「更新をすべてトップページに表示したい」。当初は更新情報の子ブログを立ち上げて手動で入力した発信することを提案したが、担当者さまは自動生成へのこだわりが強いようす。話を聴いていくと市民からのニーズが確実にあること、更新者が多数いて更新した情報を集めるだけでも大変で、多少不完全なものであっても自動生成のほうが合理的と分かりました。

そこでこんな仕様で組んでいます。

◆「更新情報」は最近30日に更新のあったものを表示。
◆ウェブページはすべて監視して、「最終更新日」をキーに「更新日:<ページタイトル>を更新しました」と表記
◆新着情報などブログにしてあるものは「公開日:<記事タイトル>を更新しました」
◆一覧を日付順に並べる

ひと工夫する必要があったのが「一覧を日付順に並べる」という部分。いったん配列変数に格納してLoopで並び替えながら取り出すことに。

配列変数を入れ子にする必要があって、下層の日付をキーにして並べ替えしたかったけど方法が見つからない。MTLoopの並び替えは「sort_by=」の値に「key」or「value」以外の選択肢は無さそう。なのでここは日付+記事IDをkeyに設定することで解決。

 

----------
参考ソース
----------

【ブログ記事を配列変数に格納】

<mt:Entries days="30" blog_ids="9,17,14">
    <mt:SetVarBlock name="entryKey"><$mt:EntryDate format="%Y%m%d"$><$mt:EntryID$></mt:SetVarBlock>
    <mt:SetHashVar name="updateEntries">
        <mt:SetHashVar name="$entryKey">
            <mt:SetVarBlock name="date"><$mt:EntryDate format="%Y.%m.%d"$></mt:SetVarBlock>
            <mt:SetVarBlock name="ttl"><$mt:EntryTitle$> を更新しました</mt:SetVarBlock>
            <mt:SetVarBlock name="cate"><$mt:EntryBlogName$></mt:SetVarBlock>
            <mt:SetVarBlock name="url"><$mt:EntryPermalink$></mt:SetVarBlock>
        </mt:SetHashVar>
    </mt:SetHashVar>
</mt:Entries>

 

【ウェブページについても似た感じで配列変数に格納】

※ソースは省略
※ただしこちらは公開日でなく更新日がキーなのでdaysモディファイアが使えない。
 ごにょごにょと書いて30日前までに更新された記事を抽出するように。

 

【表示部】

<mt:Loop name="updateEntries" sort_by="key reverse">
    <mt:GetVar name="__value__" setvar="updateEntry">
    <dl class="homeNewsItem">
        <dt><$mt:GetVar name="updateEntry{date}"$></dt>
        <dd class="entryDate" datetime="<$mt:GetVar name='updateEntry{date}'$>"><a href="<$mt:GetVar name='updateEntry{url}'$>"><$mt:GetVar name='updateEntry{ttl}'$></a></dd>
    </dl>   
</mt:Loop>

 

実際にはブログによって定型文に変えたりリンク先を記事ページ以外にしたりと激しく分岐させてるけど、上記で骨子の部分は思い出せるかな。

クライアントのサイトで不可解な現象に遭遇。詳細ページの体裁を変更するためにアーカイブテンプレートを探したらどこにも見当たらない。実はインデックステンプレートで詳細ページを書き出していたという仕様でした。

何故そのような仕様になったかここでは説明できないのだけれど、インデックステンプレートをアーカイブテンプレート的に使うことができるのは驚き。MT7からのコンテンツタイプを使い込んでいくと、もしかするとこれを使う機会も出てくるかもしれないのでメモメモ。

-----

これをやるためにはH.Fujimotoさんが公開しているプラグインが必要。サイト上ではMT5.0から6.2までの対応とあるが、クライアントの7.0でも動いているようだ。

https://www.h-fj.com/mtplugins/writetofile.php

基本的には1ページを書き出すものなのだが、条件を設定してLoopなどを回すことで複数書き出すことができる。

他にもアーカイブテンプレート内に設置して、例えば個別店舗を案内するときに、地図がある場合だけ地図ページを書き出すといった使い方も考えられるかな。

 

アーカイブ

ウェブページ

「紺屋の白袴」とはまさにこの事。見にくいしスマホ対応もまだしていません。そのうちやります。そのうちにね。

エフスタジオの中の人は株式会社メキメキに在籍しています。