確かにconcrete5ぽくない使い方ですよね。
でもシンプルなコードでわかりやすいです。
ありがとうございます。
ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 10:25
初めて質問します。よろしくお願いします。
【前提】
ver. 5.7.5.1でサイトのオリジナルテーマを作成しています。
ページリストを使って同じページタイプの一覧を表示させたいと思っています。
表示するページは、日付とタイトルと記事本文がある・・・ブログ記事のようなものです。
コンポーザーを使って作成・更新します。
説明文を表示するオプションは通常のページリストブロックにはありますが、
説明文と記事本文と両方書くのは手間(あるいは忘れる可能性がある)ため、直接記事本文の値を取得して表示させたいと思っています。(長文の場合は適宜丸めるとして)
【質問】
サイトのデザイン上、カスタムテンプレートでUIに合わせたHTMLを書き出すように作成しているのですが、この場合ページリストのカスタムテンプレートのview.phpで、foreachループの中でどのような形で取得し表示するのが好ましいでしょうか?
タグ:
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 17:44
いろいろコツがあると思いますが・・・。
■ 案1: 5.6 のブログ表示のテクニック:ページのエリアを全部表示。CSS で隠す
5.6 の blog_index のコードを、5.7 のデフォルトの Page List の説明欄を表示する部分に入れ込んだものです。
実は、そのページの Main エリアをすべて表示するという方法をとっていて、
<div class="excerpts"> のクラスで囲っているので、そこで over-flow: hidden な設定で隠すということができます。
サンプルコードをご覧ください。
http://gist.github.com/katzueno/9b173e46df38a651e3d2/revisions
(下から2番目の変更箇所を参考にしてください。あと、すいません。PHP ショートコードなサンプルで作ってしまいました。)
この方法は、すごく簡単にできるのですが、
ページが長いと、HTMLサイズが重くなってしまいます。
■ 案2: メインエリアの最初か2番目のブロックをそのまま表示する方法
参考
http://www.concrete5.org/community/forums/customizing_c5/get-first-block-in-area-then-get-that-blocks-data/
サンプルコードはこちらです。
http://gist.github.com/katzueno/08173afeefacde40f243/revisions
(すいません。PHP ショートコードなサンプルで作ってしまいました。)
ここの
$blocks = $page->getBlocks('Main');
でメインエリアのブロックを読み込んで
$blocks[0]->display();
で1個目のブロックを表示するという設定になります。
2個目のブロックを表示させたければ
$blocks[1]->display();
にするとできます。
てな感じですかね。
こちらも、ブロックの中身が大きくなったら、CSS で隠すとかですかね。
■ 案1: 5.6 のブログ表示のテクニック:ページのエリアを全部表示。CSS で隠す
5.6 の blog_index のコードを、5.7 のデフォルトの Page List の説明欄を表示する部分に入れ込んだものです。
実は、そのページの Main エリアをすべて表示するという方法をとっていて、
<div class="excerpts"> のクラスで囲っているので、そこで over-flow: hidden な設定で隠すということができます。
サンプルコードをご覧ください。
http://gist.github.com/katzueno/9b173e46df38a651e3d2/revisions
(下から2番目の変更箇所を参考にしてください。あと、すいません。PHP ショートコードなサンプルで作ってしまいました。)
この方法は、すごく簡単にできるのですが、
ページが長いと、HTMLサイズが重くなってしまいます。
■ 案2: メインエリアの最初か2番目のブロックをそのまま表示する方法
参考
http://www.concrete5.org/community/forums/customizing_c5/get-first-block-in-area-then-get-that-blocks-data/
サンプルコードはこちらです。
http://gist.github.com/katzueno/08173afeefacde40f243/revisions
(すいません。PHP ショートコードなサンプルで作ってしまいました。)
ここの
$blocks = $page->getBlocks('Main');
でメインエリアのブロックを読み込んで
$blocks[0]->display();
で1個目のブロックを表示するという設定になります。
2個目のブロックを表示させたければ
$blocks[1]->display();
にするとできます。
てな感じですかね。
こちらも、ブロックの中身が大きくなったら、CSS で隠すとかですかね。
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 18:07
追記です。
案2のブロックの情報を取得して、
そこから、出力している HTML から、画像とか取り出して、テキストだけにして・・・
って、テキストだけ表示させるっていう処理もできます。
テキストだけの表示だったら、hissy の方法がいいとおもいます。
ただ、Main エリアの最初の部分からテキストが取得されているので、Main エリアでページタイトルも表示させていると、ちょっとややこしいかも。
そうなると、ページタイトル部分のエリアを別にして、Main は本文部分だけを設置する記事ブロックにするとかで対応できると思います。
案2のブロックの情報を取得して、
そこから、出力している HTML から、画像とか取り出して、テキストだけにして・・・
って、テキストだけ表示させるっていう処理もできます。
テキストだけの表示だったら、hissy の方法がいいとおもいます。
ただ、Main エリアの最初の部分からテキストが取得されているので、Main エリアでページタイトルも表示させていると、ちょっとややこしいかも。
そうなると、ページタイトル部分のエリアを別にして、Main は本文部分だけを設置する記事ブロックにするとかで対応できると思います。
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 18:11
あー。すいません。
案2のサンプルコードで、
もしも Main エリアにブロックが1個もなかったりしたら、エラーがでちゃうので、
今、3個目のrevision (修正)を追加しました。
http://gist.github.com/katzueno/08173afeefacde40f243/revisions
if 判定をつけることによって、エラーを回避できます。
案2のサンプルコードで、
もしも Main エリアにブロックが1個もなかったりしたら、エラーがでちゃうので、
今、3個目のrevision (修正)を追加しました。
http://gist.github.com/katzueno/08173afeefacde40f243/revisions
if 判定をつけることによって、エラーを回避できます。
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 20:47
いろんな想定があると考えると、難しいんですね。
Mainの中にひとつのブロックしかなくて、画像とかなくてテキストだけのつもりでいるんですが、あとからいろいろ編集したい風に言われると・・・と思って記事ブロックにしたという感じです。
でももしMainに複数のブロックがあったり、記事ブロックだけじゃないかもしれないし、
誰かが編集してしまえば前提条件もかわっちゃいますね。
逆にもやもやしてた理由が「決め打ちにしてない」からなんだなと思いました。
ちょっと検討します。ありがとうございました。
Mainの中にひとつのブロックしかなくて、画像とかなくてテキストだけのつもりでいるんですが、あとからいろいろ編集したい風に言われると・・・と思って記事ブロックにしたという感じです。
でももしMainに複数のブロックがあったり、記事ブロックだけじゃないかもしれないし、
誰かが編集してしまえば前提条件もかわっちゃいますね。
逆にもやもやしてた理由が「決め打ちにしてない」からなんだなと思いました。
ちょっと検討します。ありがとうございました。
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 21:18
記事ブロックから中身取り出す際、
$image_info = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $blog_post, $img_matches);
ってやって取り出してます。
$img_matchesは配列で、画像タグとSRCが取り出せます。
5.7で、picture タグ使う場合だと
$image_info = preg_match_all('/<picture><source.+srcset=[\'"]([^\'"]+)[\'"].*>/i', $blog_post, $img_matches);
でいけそうな気がします。←5.7で試してない。
$image_info = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $blog_post, $img_matches);
ってやって取り出してます。
$img_matchesは配列で、画像タグとSRCが取り出せます。
5.7で、picture タグ使う場合だと
$image_info = preg_match_all('/<picture><source.+srcset=[\'"]([^\'"]+)[\'"].*>/i', $blog_post, $img_matches);
でいけそうな気がします。←5.7で試してない。
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
2015年9月10日 at 21:34
Your post has been saved and will be published after approval by the forum moderator.
takuro hishikawa
Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい
$indexedSearch = new \Concrete\Core\Page\Search\IndexedSearch();
$bodyContent = $indexedSearch->getBodyContentFromPage($page);
echo \Core::make('helper/text')->shortText($bodyContent, 80); // 80文字