ページ 11

エントリ内に他のエントリの画像を載せるには

Posted: 2007年7月12日(木) 14:38
by ifeel
いつもお世話になっております。

エントリ内に他のエントリの画像を載せようと色々試したのですが
うまくいかず、またこちらにお邪魔しました。

【やりたいこと】
1:各エントリに、「関連商品」を掲載したい

ある商品(1つのエントリ)の色違いの商品があった場合に
関連する商品のエントリID、例えば「00002」と登録することで
そのエントリ内に、関連商品の画像とそのページへのリンクを表示したい

という感じです。

TIP(メニュー項目の選択肢をデザイン定義に読み込む)をまねしてみようと思い
各エントリをxml表示する「 test.html 」を作成して
読み込ませようと努力したのですが
やはりエラーが出てしまいました。

何か良い方法があれば、アドバイスいただけますと助かります。


そもそもの書き方がおかしいと思うのであまり意味がないかもしれませんが
試してみたことも記載してみます。

【試してみたこと】

ディレクトリの位置関係はこんな感じで
- cmsdesigner
- shop/test.html

表示させたい画像は mainimg なので

<xsl:variable name="img01" select="document('../../../../shop/test.html?eid=00001')/entry/data[@name='mainimg']" />

<img src="{$img01/@src}" />

と言う感じにしたところ以下のようなエラーになりました
Warning: Sablotron error on line 2: invalid namespace prefix 'cmsd' (中略)/cmsdesigner/include/xmlutil.php.inc on line 201

Re: エントリ内に他のエントリの画像を載せるには

Posted: 2007年7月13日(金) 11:55
by webmaster
 ifeelさん、いつもご質問ありがとうございます。
 こうやって「試してみたこと」を具体的に書いて頂けると、どのような意図でどの辺で
躓いているか等がわかり、対応しやすいです。ありがとうございます。
 
 今回の場合、一番簡単なのはiframeを使う方法だと思います。
 仮に「関連商品ID」の項目名をrelatedidとします。
 

コード: 全て選択

<iframe src="http://yourdomain.com/item_detail_iframe.php?eid={relatedid}" ><a href="http://yourdomain.com/item_detail.php?eid={relatedid}"></a></iframe>
 
 relatedidは
 item_detail_iframe.php では、フレーム内のみのHTMLを出力するようにしておきます。
 iframeタグの中のaタグは、iframe非対応のブラウザで見た場合に該当ページへジャンプ
できるようにする為のリンクです。
 
 この方法以外ですと、かなりCMSDの内部構造やXSLT/XMLに熟知していないと難しいと思います。
 
 document関数とvariableを使った方法はかなり近いのですが、ifeelさんの方法ですと
埋め込みphpファイル(ifeelさんの環境では.htmlでもphp実行可能なように設定されている
ようですが)を開こうとしている為、phpが実行される前のソースを読み込もうとしてエラー
が表示されています。

 同様の方法で、エントリデータファイルを直接開く必要があります。
 
 エントリデータファイル名は、「エントリフォルダ名.エントリID.xml」です。
 

コード: 全て選択

<xsl:variable name="relatedimg" select="document('../../../data/entry/ENTRYNAME/ENTRYNAME.{relatedid}.xml')/entry/data[@name='mainimg']" />
 
 ENTRYNAMEには、ifeelさんが作成されたエントリフォルダ名を入れて下さい。
 
 この方法を使ってtextarea型の項目を読み込もうとすると、改行処理などを行う前のデータが
取得される為、問題があるかもしれません。
 画像等の場合には今のところ問題ありませんが、今後のバージョンアップで仕様が変わる恐れも
ありますのでご注意下さい。

 サンプルコードはテストしておりませんので、記述ミスなどがあるかもしれません。
 間違いがありましたらご容赦下さい。

一応解決しました

Posted: 2007年7月13日(金) 19:24
by ifeel
webmaster 様

いつも丁寧な解説をありがとうございます。
そもそもエントリはxmlデータで存在するから、直接そちらにアクセスすれば良かったんですね :oops:

これがダメなら、これはどうだ、と言う感じでやっていくと、そうゆう当然気づくべき事を見落としてしまいますね・・。
このアドバイスを頂いたおかげで、解決いたしました。ありがとうございます。

結論から言いますと、今回私がやりたかったことは
エントリ××番のmainimgを表示、ということだけだったので

コード: 全て選択

<img src="cmsdesigner/data/entry/ENTRYNAME/ENTRYNAME.{relatedid}.00000001.jpg"}
と書くことで表示されました。
mainimgは一個目の画像なので、00000001と直接指定してしまいました。
実際にはリンクも貼りたいので

コード: 全て選択

<a href="item.php?eid={relatedid}"><img src="cmsdesigner/data/entry/e-shop/e-shop.{relatedid}.00000001.jpg" /></a>
と言う感じで書きました。
(ご指摘の通り、私の環境ではhtmlでもPHPが動く設定になっていますが
他の方もご覧になると思うので、phpとしておきます。)
ちなみに、私の環境ではitem.php(=item.html)がルート直下にはないので、
実際の書き方は「../」を足してこんな感じになっています。

コード: 全て選択

<a href="item.html?eid={relatedid}"><img src="../cmsdesigner/data/entry/e-shop/e-shop.{relatedid}.00000001.jpg" /></a>
【蛇足】
本当はdocument関数とvariableを使った方法が
他の値も取りやすいと思ったのですが、うまくいかなかったので上記の方法にしました。

具体的に書く前に一箇所だけ修正です
<xsl:variable name="relatedimg" select="document('../../../data/entry/ENTRYNAME/ENTRYNAME.{relatedid}.xml')/entry/data[@name='mainimg']" />
entry以下がdata型ではなかったので

コード: 全て選択

<xsl:variable name="relatedimg" select="document('../../../data/entry/ENTRYNAME/ENTRYNAME.×××.xml')/entry/mainimg" />
のようにしました。
修正したコードの「×××」部分にrelatedidの値を入れたかったわけですが
ここに{relatedid}のようにしてもエラーが出てしまいました。

一度relatedidの値を変数に代入した方が良いのかと思ってそれも試したのですが
document('')と、シングルクオテーションで囲まれているせいか
エラー表示として出てくるurl(?)にも
e-shop.$relatedurl.xml
と、そのまま変数名が出てきてしまいました。

「×××」に00001と、数値を入れた場合
<img src="{$relatedimg}" />
と言う記述で、00001のmainimgが表示されたので
document関数の中に変数を使えない、と解釈してこの方法は断念しました。


と、いうことですごく長くなってしまいましたがご報告でした
いつも、何かにつまづくとこちらの過去ログから答えを見つけているので
この件も書いておけば誰かのお役にたつかも・・・と
だらだらと書いてしまいました。
長文失礼いたしました。

Re: 一応解決しました

Posted: 2007年7月14日(土) 12:16
by webmaster
 ifeelさん、丁寧なご回答、ありがとうございました。
 大変参考になります。

 また、サンプルが間違っており、ご迷惑をおかけしました。

コード: 全て選択

<xsl:variable name="relatedimg" select="document( concat('../../../data/entry/ENTRYNAME/ENTRYNAME.', relatedid, '.xml'))/entry/mainimg" />
 が正しいコードになります。
 document関数の中でデータ項目を扱う場合には、上記のようにconcat関数を使って文字列を連結する必要があるのを失念しておりました。
 
 また、[@name='mainimg']と書いていたのも、スキーマ側と勘違いしておりました。(-_-;

コード: 全て選択

<img src="cmsdesigner/data/entry/ENTRYNAME/ENTRYNAME.{relatedid}.00000001.jpg"} 
 この方法も問題ないと思いますが、将来img項目がスキーマに追加された場合に、
ファイルIDが00000001になるかどうかが保証されなくなる為(追加された順番で
番号が振られます)、ご注意下さい。

 以上、曖昧な回答にも関わらず自力で解決されたifeelさんには頭が下がる思い
です。

 また何かありましたら、よろしくお願い致します。

完璧です!

Posted: 2007年7月14日(土) 15:11
by ifeel
webmaster様

教えていただいたコードで、やりたかった事が完璧に実現できました!
ありがとうございます :D

concat関数で文字列を連結すればうまくいくのですねぇ
もう絶対無理なんだわ・・と諦めていたので本当にうれしいです
そして、とても勉強になりました。

何案件か利用させていただいていて、使い勝手の良さがとても気に入っているのですが、これでますますCMSデザイナーファンになってしまいました!

私の応急処置的やり方は、スキーマにimgを追加しない、と言う前提の上にしか
なりたたないので、とても不安定だなと思っていたのと
「元データが売り切れていたらリンクをはずす」なども本当はやりたかったので
documentで呼びだす方法が使えてとても助かります。


ちなみに、また私の環境では、の話ですが
「関連商品」として登録するために使っているため
ある商品では0件、ある商品では3件、などエントリ毎に件数が違うため
list項目として設定しています。

そのため、リストアイテムを書き出す for-each の中に記述しました。
以下、参考までに記述例です。

コード: 全て選択

<xsl:for-each select="relations/listitem">
<xsl:variable name="relatedimg" select="document( concat('../../../data/entry/ENTRYNAME/ENTRYNAME.',relatedid, '.xml'))/entry/mainimg" />
<a href="item.php?eid={relatedid}"><img src="{$relatedimg}" /></a>
</xsl:for-each>
正式な使い方ではないので
CMSデザイナーのバージョンアップで仕様変更があった場合
注意が必要である、ということが前提ですが
これで運用してみたいと思います。

かなり応用編な使い方にもかかわらず最後までおつきあい下さり
本当にありがとうございました