BlogTop > MovableType > MTカスタムフィールド Archive

MTカスタムフィールド Archive

2 of 2

< Previous Page

すべてのページ

使ってるカスタムフィールドの内容を出力してみた

エントリアーカイブで使っているカスタムフィールドの中身を一覧表示させるためのテンプレートを書いてみました。

これまで使ってきたカスタムフィールドがどのような内容だったか忘れてしまったので、控として一覧表示できたらいいのでは、と思ったのでちょっとテンプレートを書いてみました。

参考にしたリンクを入れるフィールドの内容をXML形式にて出力して、Excelなどで読み出して管理してみる、というのを試みました。出力したXMLファイルをExcelで読みこんで操作してる様子は以下のようなものです。

カスタムフィールド一覧をExcelで開く

記事エントリー内で使っているカスタムフィールドの内容を出力させるのに、を利用しています。

タグリファレンスをみると大体わかるのですが、比較的簡単なテンプレートで実現できるようでした。

テンプレート

テンプレートは以下のようなものです。

<?xml version="1.0" encoding="UTF-8"?>
<fields>
<$MTEntries lastn="20" sort_order="ascend"$><$MTEntryCustomFields exclude="test field,test2">$><mt:if tag="CustomFieldValue">
<items>
        <Title><$mt:EntryTitle encode_xml="1" remove_html="1"$></Title>
        <link><$mt:EntryPermalink encode_xml="1"$></link>
        <CustomFieldValue><![CDATA[<$MTCustomFieldValue$>]]></CustomFieldValue>
</items></mt:if></MTEntryCustomFields>
</MTEntries>
</fields>

EntryCustomFieldsのタグリファレンスをみると、一部のフィールドだけを除きたい場合は、exclude モディファイアをとあります。上の例は、「test」,「test field」,「test2」という3つのカスタムフィールドがあり、「test」という名前のフィールドのみをブログ記事の古い順から20記事のうちから抽出しますというテンプレートです。簡単なXSLTテンプレートも作ってみました。スタイルはセンスがないのでアレですが。

一部、ミスリードの可能性があるので追記しておきます。特定のカスタムフィールドの内容を出力したいときは、EntryCustomFieldsタグでなく、提供されたカスタムフィールド用タグを使います。このことはタグリファレンスにも明記されています。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:output
 method="html"
 media-type="text/html"
 omit-xml-declaration="yes"
 doctype-public="-//W3C//DTD HTML 4.01//EN"
 doctype-system="http://www.w3.org/TR/html4/strict.dtd"
 indent="yes"
/>
<xsl:template match="/">
<html lang="ja">
<head>
<title>Custom Fields</title>
<style type="text/css">
#MAIN{padding : 0 20px;}
table{ border-spacing:0; border: 2px solid #0e0;} 
th{background:#333;color:#FFF;}
td{border:1px dotted #0e0;background:#F1EFE2;}
</style>
</head>
<body>
<div id="MAIN">
<table border="1" cellspacing="0">
<tbody>
<tr><th>EntryTITLE</th><th>PermaLINK</th><th>Value</th></tr>
<xsl:apply-templates select="fields/items" />
</tbody>
</table>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="fields/items">
<tr>
<td>
<xsl:value-of select="Title" />
</td>
<td>
<a href="{link}"><xsl:value-of select="link" /></a>
</td>
<td>
<xsl:value-of select="CustomFieldValue" />
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

これらのテンプレートをまとめたものを置いておきます。

download

My_Custom_fields.zip

カスタムフィールド系のテンプレートは以下を参照するとよさようです。

XSLTの xmlns="http://www.w3.org/1999/xhtml"を削除しました。

メモ:記事ごとに違う処理したいときのカスタムフィールド

特定記事のみで読み込むコードとかがある場合に、条件処理させたいと思い、カスタムフィールドを使ってやってみました。

1.カスタムフィールドの設定

カスタムフィールドを新規作成します。以下のような感じで、Yes,Noをラベルに使ったラジオボタンを作成します。

  • 名前: 任意
  • 説明: 任意
  • 種類: ラジオボタン
  • オプション: Yes,No
  • 必須?: チェック(チェックにすることで、記事作成画面に常に表示されます)
  • 規定値: NoまたはYesのラジオボタンにチェック

ここで作成されたタグの出力結果は、ラジオボタンにチェックを入れたほうの値となります。

Yes,Noでなくても自分でわかりやすい変数っぽいものでもいいでしょう。

2.ブログ記事テンプレートに変数を定義

Checkboxという名前でできたカスタムフィールドですと以下のような形となります。

場所は、ブログ記事テンプレートの上の辺りにでも

<MTIfNonEmpty tag="Checkbox">
<MTSetVarBlock name="check"><MTCheckbox></MTSetVarBlock>
</MTIfNonEmpty>

MTIfNonEmptyタグは念のため記述してありますが、「必須」にしてあるのでもしかしたら要らないかもしれません。

3.処理を行いたい箇所のコード

条件分岐したい場所に以下のようにeq=...にて判断をおこないます。この場合は、Yesにチェックが入っていた場合の条件での処理になります。MTElseなどを入れることも考えられるでしょう。

<MTIf name="check" eq="Yes">
do something...
</MTIf>

カスタムフィールドと条件分岐についてはだいたいこのような感じです。

フィード配信しない内容をカスタムフィールドにて

MT4.1のカスタムフィールドで生成されるタグを記述しないとカスタムフィールドの内容は表示されません。このことから、カスタムフィールド内にフィード配信しないコンテンツを含めて利用しよう、という使い方です。

W3CのFeed Validation Service を利用して、フィードチェックをすると、フィードの要素内に、scriptタグが含まれてると、以下のような警告が出ます。

element should not contain script tag

この警告についての説明ページをみますと、

http://validator.w3.org/feed/docs/warning/SecurityRisk.html より引用

Some feed elements are allowed to contain HTML.However, some HTML tags, like script, are potentially dangerous and could cause unwanted side effects in browser-based news aggregators.For this reason, these potentially dangerous tags are often stripped out on the client side.

JavaScriptのように危険なコードが含まれる可能性のあるタグは、クライアント側で除去されることがありますよ。といったところでしょうか。

例えば、ブログパーツを記事で紹介するようなとき記事内に公開されているソースコードを埋めたいようなことがあります。

ところが、記事本文内にscriptタグで埋め込みますと、Feed Validation Serviceで上記の警告がでてしまいます。

これを回避するのに、feedのテンプレートで、MTEntryExcerptは配信しないようにして、追記部分にソースコードを埋め込む、というのを以前やっていたことがありました。

そのほかには、フィードを概要配信に変えてしまうという手もあります。

この辺のお話は、WingMemoさまの記事、「RSSを配信するということ(2)」が参考になると思います。

ただこれらの方法ですと、全文配信派(この場合、読み手の立場からになるのか?)なひとからすると、一寸不満な部分はあると思います。

そのような場面で、カスタムフィールドを使うというのを考えました。

カスタムフィールドの説明などは、www.movabletype.jpのドキュメントにあるとおりなので、細かな説明は省略します。

冒頭に書いたとおりですが、カスタムフィールドを作成して生成されたタグをページに埋め込まないことには、カスタムフィールドの内容は表示されません。

記事ページ用のカスタムフィールドとして登録しておき、フィードのテンプレートはそのまま何も手を加えなければ、フィードでJavaScriptコードは出力されなくなるというわけです。

以上はカスタムフィールドを利用したほんの一例でしかありません。サイトの運営方針などもありますし。JavaScriptの動作確認をするのなら、テストページを作成して記事内でリンクの形のほうがいいのかも知れません。

おまけですが、例えば、なぞかけエントリなどで、「そのこころは」の部分をカスタムフィールドでといった使い方も考えられるでしょうね(これだけのために使うというのもアレなのでようせんけど)。

Index of all entries

BlogTop > MovableType > MTカスタムフィールド Archive

Feeds
Elsewhere

Action Streams

logo

Comment powered by DISQUS

Return to page top