MovableType4.2 でウェブページ、ブログ記事に特定のタグがある場合にcss切り替えたいが、

指定方法が上手くいかない。どう直せば切り替えうまくいきますか?

コードが長いので、以下よりテキストダウンロードして下さい。
(URLは、7/14~21日までです。21日を過ぎた場合、コメントにて新URL記載します)
http://firestorage.jp/download/4ec35edaed383cd5b0bcb4ee1f88b3b3f460f21a


import1.css→1段組css
import2.css→2段組css

ヘッダーでcssの指定を書いています。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/17 01:35:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kaz No.2

回答回数200ベストアンサー獲得回数42

ポイント50pt

アップされているテキストを拝見しましたが、すみませんがやりたい内容がよく分かりません。

ただ、MT タグに関して、基本的な部分に誤解があるような気がします。

そもそも MTIf の tag="" は、エントリーで使う「タグ」ではありません。

※MTIf の tag="" は「MTEntryDate」等の MTタグのこと


また、MTIf そのものに関しても誤解があるようです。

name="" / tag="" ともに「どの値を判断するか」という指定なので、

それぞれ組み合わせるのは、like="" や eq="" など「どんな値か」等になります。

強引な例え話をすると「name="" tag=""」というのは「あなたの身長 あなたの体重」と書いているだけで、

いくつ以上、いくつ以下といった判断基準が書いていない状態なのです。

条件分岐させるなら「あなたの身長 170cm以上」や「あなたの体重 60kg以下」でなくてはいけません。


このあたりは、MT の強み・面白味ではありますが、

ややこしい部分なので、リファレンスをチェックすると良いかと思います。


MTIf | テンプレートタグリファレンス

http://www.movabletype.jp/documentation/appendices/tags/if.html


ブログ記事に特定のタグが使われているか否かを判別する

MT タグに「MTEntryIfTagged」がありますが、

ここでの tag="" はブログ記事に指定したタグとなります。

MTIf でも、記事についたタグの判別は可能ですが、専用タグであるこちらを使った方が簡単です。


また、MTIf を用いた条件分岐を行う場合、実際の動作を行う前に、

単純な結果表示などで、目的の分岐が行われるかを検証する事をおすすめします。


<MTEntryIfTagged tag="テストタグ">

テストタグがついてるよ

<MTElse>

テストタグはついてないよ

</MTEntryIfTagged>


こういったものを使い、ひとまず自分が意図した分岐が行われているかをチェックし、

その後、目的の処理を実装すると、動かない場合の問題点を見つけやすくなります。

id:sakuma1

なるほど・・mtIf tag="●"も、てっきりエントリー編集画面にあるタグの事だと思っていました;

@bone、@oneのタグが付いている時に、

import1.css(1段組のレイアウトcss)を適応させ、

同様に、

@btwo、@twoのタグが付いている時に、

import2.css (2段組レイアウトcss)を適応させたいのです。

●アーカイブ ブログ記事

<MTEntryIFTagged tag="@bone">

<mt:Include module="ブログ1段組" />

</MTEntryIFTagged>

<MTEntryIFTagged tag="@btwo">

<mt:Include module="ブログ2段組" />

</MTEntryIFTagged>

●アーカイブ ウェブページ

<mt:PageIfTagged include_private="1" tag="@one">

<mt:Include module="1段組" />

</mt:PageIfTagged>

<mt:PageIfTagged include_private="1" tag="@two">

<mt:Include module="2段組" />

</mt:PageIfTagged>


上記のものは分岐はちゃんとできているのですが、

cssがうまく読み込めていない状態です。

●●のタグの時に~cssを読み込むという指定方法がわかりません・・

随分サイトや本など調べましたがわからずじまいで質問しました;

2010/07/14 19:45:59

その他の回答2件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント30pt

MT使いこんでないから間違ってるかもしれないけど、こんな感じでいけるんじゃないかな

<MTIf name="entry_template"> エントリーテンプレートの場合
    <MTIff tag="bone">  変数boneが存在の場合
        <link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />
    <MTElse tag="btwo">  変数boneが無くて変数btwoが存在の場合
        <link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />
    </MTElse>
    </MTIf>
</MTIf>

http://www.movabletype.jp/documentation/appendices/tags/if.html

http://www.movabletype.jp/blog/mtelse41.html

id:sakuma1

回答ありがとうございます。

うーん、、MTIfの中にMTIfが二重になっていたので、まとめて少し修正して以下のようにしてみました。

しかし上手くいきませんでした・・orz どうしてもimport1と2両方読み込んじゃいます。

<MTIf name="entry_template" tag="bone"> エントリーテンプレートで、tagにboneが存在の場合

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

<MTElse name="entry_template" tag="btwo"> エントリーテンプレートで、MTIfの条件が成立せず、tagにbtwo存在の場合

<link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />

</MTElse>

</MTIf>

<MTIf name="page_template" tag="one"> ウェブページテンプレートで、tagにoneが存在の場合

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

<MTElse name="page_template" tag="two"> ウェブページテンプレートで、MTIfの条件が成立せず、tagにtwo存在の場合

<link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />

</MTElse>

</MTIf>


恐らく「entry_template」「page_template"」で、

もうそれぞれ「記事ページ」、「ウェブページ」を指すのでそれで固定になっていて、

その後のtagがきかないのかも・・?

tagに、andをいれて、以下のようにしてみましたがこれまたむりでしたorz and自体使用できないのかもです。

<MTIf tag="bone and one">

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

<MTElse>

<link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />

</MTElse>

</MTIf>

2010/07/14 14:54:57
id:kaz No.2

回答回数200ベストアンサー獲得回数42ここでベストアンサー

ポイント50pt

アップされているテキストを拝見しましたが、すみませんがやりたい内容がよく分かりません。

ただ、MT タグに関して、基本的な部分に誤解があるような気がします。

そもそも MTIf の tag="" は、エントリーで使う「タグ」ではありません。

※MTIf の tag="" は「MTEntryDate」等の MTタグのこと


また、MTIf そのものに関しても誤解があるようです。

name="" / tag="" ともに「どの値を判断するか」という指定なので、

それぞれ組み合わせるのは、like="" や eq="" など「どんな値か」等になります。

強引な例え話をすると「name="" tag=""」というのは「あなたの身長 あなたの体重」と書いているだけで、

いくつ以上、いくつ以下といった判断基準が書いていない状態なのです。

条件分岐させるなら「あなたの身長 170cm以上」や「あなたの体重 60kg以下」でなくてはいけません。


このあたりは、MT の強み・面白味ではありますが、

ややこしい部分なので、リファレンスをチェックすると良いかと思います。


MTIf | テンプレートタグリファレンス

http://www.movabletype.jp/documentation/appendices/tags/if.html


ブログ記事に特定のタグが使われているか否かを判別する

MT タグに「MTEntryIfTagged」がありますが、

ここでの tag="" はブログ記事に指定したタグとなります。

MTIf でも、記事についたタグの判別は可能ですが、専用タグであるこちらを使った方が簡単です。


また、MTIf を用いた条件分岐を行う場合、実際の動作を行う前に、

単純な結果表示などで、目的の分岐が行われるかを検証する事をおすすめします。


<MTEntryIfTagged tag="テストタグ">

テストタグがついてるよ

<MTElse>

テストタグはついてないよ

</MTEntryIfTagged>


こういったものを使い、ひとまず自分が意図した分岐が行われているかをチェックし、

その後、目的の処理を実装すると、動かない場合の問題点を見つけやすくなります。

id:sakuma1

なるほど・・mtIf tag="●"も、てっきりエントリー編集画面にあるタグの事だと思っていました;

@bone、@oneのタグが付いている時に、

import1.css(1段組のレイアウトcss)を適応させ、

同様に、

@btwo、@twoのタグが付いている時に、

import2.css (2段組レイアウトcss)を適応させたいのです。

●アーカイブ ブログ記事

<MTEntryIFTagged tag="@bone">

<mt:Include module="ブログ1段組" />

</MTEntryIFTagged>

<MTEntryIFTagged tag="@btwo">

<mt:Include module="ブログ2段組" />

</MTEntryIFTagged>

●アーカイブ ウェブページ

<mt:PageIfTagged include_private="1" tag="@one">

<mt:Include module="1段組" />

</mt:PageIfTagged>

<mt:PageIfTagged include_private="1" tag="@two">

<mt:Include module="2段組" />

</mt:PageIfTagged>


上記のものは分岐はちゃんとできているのですが、

cssがうまく読み込めていない状態です。

●●のタグの時に~cssを読み込むという指定方法がわかりません・・

随分サイトや本など調べましたがわからずじまいで質問しました;

2010/07/14 19:45:59
id:kaz No.3

回答回数200ベストアンサー獲得回数42

> ●●のタグの時に~cssを読み込むという指定方法がわかりません

ヘッダの CSS 読み込み部分に同じ仕組みを使えばいけると思うのですが、動かないのでしょうか。


<MTEntryIFTagged tag="@bone">

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>"

</MTEntryIFTagged>

id:sakuma1

ブログ記事の方、ちゃんとcss読み込み切り替えできました!

<MTEntryIFTagged tag="@bone">

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

</MTEntryIFTagged>

<MTEntryIFTagged tag="@btwo">

<link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />

</MTEntryIFTagged>


しかし↓のだとウェブページの方は、エラーが・・このままでは無理なのですね;

「mtPageIfTagged>タグでエラーがありました:mtPageIfTaggedをPageのコンテキスト外で利用しようとしました。

 MtPagesコンテナの外部に配置していませんか?」 と出ました。

 うーん・・何か方法ありますでしょうか。。

<mtPageIfTagged tag="@one">

<link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

</mtPageIfTagged>

<mtPageIfTagged tag="@two">

<link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />

</mtPageIfTagged>

2010/07/15 20:33:41
  • id:windofjuly
    うぃんど 2010/07/14 15:14:47
    >その後のtagがきかない
    はい、効きません
    MTifは複雑な条件判定ができません
    最初にある name="entry_template" だけで有効と判断されてしまうため、MTifはどちらも真となり、2つのcssが入ってしまう結果になってます


    >MTIfの中にMTIfが二重になっていたので、まとめて少し修正して以下のようにしてみました
    MTifは複雑な条件判定ができない(tag="bone and one"もダメですよ)ので入れ子にしたのですが、
    そのままで動かなかったとすれば他の部分も見直さないといけないようですね。そうなってくると全体像を想像できない今の私にはお手上げです。ごめんなさい
    ではなくて、単に二重は嫌だとかダメだとか思ってテストしていただいていないなら再度やりなおしてくださいませんか
    入れ子にしている例なら下記にもあります
    http://www.koikikukan.com/archives/2007/06/10-033737.php
    MTElse を使っていることにも意味があります。MTIfを列挙してしまうと、間違って同時にoneとtwoが記載されていた再に両方適用されることを避けるためです
  • id:sakuma1
    cssが二つインポートされてしまうのは直りました!
    どうやらMtIfのせいではなく、テンプレート内の<Mtsetvar>も消してしまっていたみたいで、
    それが原因なのか、つけたら2重読み込みはなくなりました。しかしまだ振り分けは正常ではないですが、、import1.cssのみしか読み込まなくなってしまい・・。

    MTIfが二重になってたのをまとめてみたのは、
    一度windofulyさんのタグでやってみたところ、エラーがでていたので、まとめないといけないのかなと思いまして、まとめてみました。
    私も理由をちゃんと書き込みすればよかったのですが、申し訳ありません。
    入れ子可能なことも分かりましたし、複雑な条件判定ができないことも勉強させていただきました。ありがとうございます。
  • id:windofjuly
    うぃんど 2010/07/15 02:34:01
    >エラーがでていた
    MTIffとfがひとつ多くなってしまってるのが原因だったのかな。どこかに全角文字でも入ったかしら?
    エラーの原因がわかるとそれも何かのヒントになるかもしれないし、私の馬鹿さを露呈するだけかも(笑)


    >テンプレート内の<Mtsetvar>も消してしまっていた
    >import1.cssのみしか読み込まなくなってしまい
    私の書いたコードをベースにしていると仮定して、<Mtsetvar>が消えていたのに両方が出力され、
    <Mtsetvar>を書いたら書いたで一方しか出力されない????
    この2つの状況の関連性がまだぜんぜん想像できてないのですが、ためしに処理の流れを逆にしてみてください
    多分こんどはimport2.cssのみしか読み込まなくなると思います

    <MTIf tag="btwo">  変数btwoが存在の場合
    <link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />
    <MTElse tag="bone">  変数btwoが無くて変数boneが存在の場合
    <link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

    予想通りにimport2.cssのみしか読み込まなくなった場合は、<Mtsetvar>の設置方法に問題があるかもしれないです
    たとえば<Mtsetvar>で1段組を選択しているモジュールと、2段組を選択しているモジュールを1つの画面に呼び出していたりしたら、当然ながら、どちらも存在することになりますから先に判定されるMTifのほうが常に真になって表示される結果になり、このコメントの改造コードならbtwoの判定が先に変えてあるのでimport2.cssが常に利用されるということになるという寸法です

    ちなみに<Mtsetvar>に閉じタグ</Mtsetvar>は存在しません。下記参照してください
    http://www.movabletype.jp/documentation/appendices/tags/setvar.html
    デバッグは大変な作業ですから、ちょっとずつやっていってください


    上の方法は上の方法として完遂してほしいと願ってますが、それとは別に、タグの存在チェックではなく変数に値を持たせる方法も検討してみたほうがいいかもしれないです
    <Mtsetvar name="csschoice" value="1"> 1段組用cssを使いたい場合の指定
    <Mtsetvar name="csschoice" value="2"> 2段組用cssを使いたい場合の指定

    <MTIf name="csschoice" eq="1">
    <link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />
    <MTElse name="csschoice" eq="2">
    <link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />
    この方法でも一方のcssしか選択されないとすれば問題はMtsetvarを記述しているほうのテンプレートにあるということになりそうです
  • id:kaz
    > しかし↓のだとウェブページの方は、エラーが・・このままでは無理なのですね

    アーカイブを間違えていませんか?
    「アーカイブテンプレート」の「ウェブページ」以外でウェブページ関連タグを使う場合は、
    <MTPages> 〜 </MTPages> 内に書く必要がありますが、ウェブページアーカイブであれば必要ありません。
    ※モジュールで呼び出す構造にしている場合、<MTPages> で囲む必要があります。

    テンプレート編集、特に今回のような条件分岐は、
    全体の構造やタグの働きをきっちり把握していないと、かなり大変です。
    回り道のような気がするかもしれませんが、目的の分岐を行う前に、簡単な分岐でのテストを行ったり、
    さらに、その前にテンプレート構造の把握など、基本部分を学習しておく事をおすすめします。
  • id:sakuma1
    windofjulyさん>
    色々考えてくださり、本当にありがとうございます。

    <MTIf tag="btwo">  変数btwoが存在の場合
    <link rel="stylesheet" href="<$mt:Link template="import2.css"$>" type="text/css" />
    <MTElse tag="bone">  変数btwoが無くて変数boneが存在の場合
    <link rel="stylesheet" href="<$mt:Link template="import1.css"$>" type="text/css" />

    上記のものだとエラーが。。
    2の回答でkazさんよりご指摘がありまして、tagの解釈が私自身間違っていたので・・tag=○○に書くもの自体、
    最初から間違っていたようです、すみません。。
    tagはtagでも、ブログなどの編集画面にあるタグと同じだと思っていまして、
    ○○ tag~と書くので・・違うと分からなかったのです;

    恐らく、<mtIf name="entry_template" tag="">だとエラーが発生しなかったのは、
    tag="~"の中が間違っていても、entry_template~の部分の記述はおかしくないので、それでエラーがでなかったのかもです。

    もう一つの方法はまだ試せていないのですが、、又今度報告致します。

    kazさん>
    なるほど、、<Mtpages>の文エラーでてたのはそういう意味だったのですね。
    お陰さまでちゃんとcssきました、本当に有難うございます。。

    ご指摘のとおり、私にはまだまだ条件分岐は難しいと思っております。
    私ができる限り、本を色々読んで、タグを調べて、それでも分からなければ別の本もみて。。色々本を買いました。
    意味も一つ一つタグを見つつ、自分なりに理解してから打つようにしていますが、それでも、
    「本にのってないこと」「どう指定していいかわからない不確かで書いているもの」に関しては、やはりちゃんと分かっていない部分がでてしまうのです。
    ネットもしらみつぶしに見ましたし、本屋も色々渡り歩きましたが・・それでもどうしても分からない点は、はてなで質問させていただいております。
    本は、今最新が5で、MT4,2の本があまりなく(あっても知りたい情報がありません・・)、MT4と4.2と違う部分もあるようで、
    私自身どれを確かな情報としていいのか、もわかりにくい部分もあります。。

    基本部分で何か良い本(できれば4.2系の本のもの)ありましたら、教えていただけると助かります。
  • id:sakuma1
    質問内容はお陰さまで解決しましたので、終了し、ポイントをお付けいたしました。
    kazさんのは、一つの質問にポイントをまとめさせていただきました。
    windofjulyさんより回答いただいた、もう一つの方法はまたコメントにて書かせていただきます。

    本当にありがとうございました!
  • id:windofjuly
    うぃんど 2010/07/17 03:06:15
    あまりお役に立てませんでしたが、解決したようで何よりです

    >色々本を買いました。
    自分にあった本を探すのは難しいと思いますが、沢山買いすぎても混乱の元のように思います。

    >ちゃんと分かってない
    >「本にのってないこと」「どう指定していいかわからない不確かで書いているもの」
    それぞれの本の作者がどれだけのスキルを持ち、また、どのような意図でその本を書いているのかを理解するのは大変なことですね。
    幾冊もお読みになったのであれば、そのなかから一番頼りにした本1冊だけに絞ってよく読みなおすことをお勧めします。
    2冊目としてはあなたが検索しやすいと思うようなコマンドリファレンスがあればいいでしょう。
    コマンドリファレンスとは各コマンドの詳細な解説や使用例の載っているものです。
    1冊目をベースにして2冊目で細かな部分を補填して、載ってないことや不確かさを補完するというイメージです。

    もうひとつ問題があるとすれ、結果を急ぎすぎて、簡単なことからはじめてないという点でしょうか。
    kaz さんや私のコメントの流れを今一度全体を通して、見直していただければ伝わると思いますが、1つ1つ確認しながらの作業になっています。
    A→BがダメならB→Aをやってみるといったような地道な努力の上に積みあがるものなので、
    本に載っているような事をそっくりまねることから始めて、目を瞑ってもできるようになってから次に進むくらいの気持ちは持ちたいものです。
    思い立ったからやってみたいという欲求には勝てませんけどね(笑) そこはそれってことで。

    ちょっとだけ気になったので、えらそうですがコメントさせていただきました

    P.S.
    よく聞かれる質問として、お勧めの本を教えてくださいというものがありますが、
    上記のようなことがありますので、自分で探せという回答しかしないようにしています
  • id:kaz
    > どう指定していいかわからない不確かで書いているもの

    この部分にどうアプローチするか、が重要だと思います。
    とりあえず現状使えれば良い、ではなく MT とがっつり付き合う場合、
    やりたい事を分かるレベルまで単純化する事をおすすめします。

    たとえば、今回の MTPages の場合、
    様々な処理をしていると、どこでエラーが出ているのか分かりません。
    しかし、タグをどんどん簡略化していくと(場合によっては何もない状態でも良い)
    「ある簡略化段階で、エラーが出る/出ないが分かれている事が見つかる
     =エラーの原因、すなわち仕様(こう書くべき)が分かる」
    といった事を把握する事ができます。


    参考図書に関してですが、一通り本を探して満足する内容が無いのであれば、
    「公式のリファレンス + ネット検索」をおすすめします。

    ある処理に関して調べる、とある MT タグが検索結果に出て来る。
    まず公式のリファレンスをチェックする、
    次に、タグ名で検索し、活用法などを紹介しているページをチェックする。
    分かりやすい解説・ツボをついた紹介をしているページは、
    その記事以外もチェックする。
    途中、知らないタグや、知らなかった情報が出て来たら、
    同じように公式・ネット検索の順にチェックする。
    これと平行して、なるほど、と思った Tips は、
    ごく簡略化した形で、実際にテストして動作検証してみる。

    MT は日本語の情報も多く、ピンポイントな処理でも、
    解説してくれているページが多いので、
    こういった方法で、十分に学んで行けると思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません