ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 10:25

初めて質問します。よろしくお願いします。

【前提】
ver. 5.7.5.1でサイトのオリジナルテーマを作成しています。
ページリストを使って同じページタイプの一覧を表示させたいと思っています。
表示するページは、日付とタイトルと記事本文がある・・・ブログ記事のようなものです。
コンポーザーを使って作成・更新します。
説明文を表示するオプションは通常のページリストブロックにはありますが、
説明文と記事本文と両方書くのは手間(あるいは忘れる可能性がある)ため、直接記事本文の値を取得して表示させたいと思っています。(長文の場合は適宜丸めるとして)

【質問】
サイトのデザイン上、カスタムテンプレートでUIに合わせたHTMLを書き出すように作成しているのですが、この場合ページリストのカスタムテンプレートのview.phpで、foreachループの中でどのような形で取得し表示するのが好ましいでしょうか?

タグ:

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 13:07
concrete5ではあまり行われないカスタマイズですね。一応できると思うので考えてみました。$page には Page オブジェクトが入ってる前提のコードです

$indexedSearch = new \Concrete\Core\Page\Search\IndexedSearch();
$bodyContent = $indexedSearch->getBodyContentFromPage($page);
echo \Core::make('helper/text')->shortText($bodyContent, 80); // 80文字
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 20:34
確かにconcrete5ぽくない使い方ですよね。
でもシンプルなコードでわかりやすいです。

ありがとうございます。
 

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 で隠すとかですかね。
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 18:07
追記です。

案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 判定をつけることによって、エラーを回避できます。
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 20:47
いろんな想定があると考えると、難しいんですね。

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で試してない。
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月10日 at 21:34
5.7からはDOMパーサーが付属しているので、正規表現に頼らなくても何かと操作できて便利。
http://github.com/sunra/php-simple-html-dom-parser
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月11日 at 5:59
これは知らなかったです。
便利ですね!
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月12日 at 11:58
返信ではなく、考え方だけですが、

コンポーザーを使って作成・更新との事なので、
on_page_type_save_composer_form 等のイベントを使って、
説明文が未入力だったら、本文を説明文にコピーするといったコーディングではいかがでしょうか?

説明文の情報は、metaのdescriptionや、feed等でも使われていると思うので、
それぞれに特殊な処理を入れるよりは、スマートな気がしますが、如何でしょうか?
 

Re: ページリストのカスタムテンプレートから、ページの記事ブロックの値を取得したい

2015年9月12日 at 21:52
on_page_type_save_composer_form のイベントだと、自動保存でも発火してしまうようなので、
on_page_type_publish イベントを使った方がよさそうですね。

まだ、コーディングが終わっていないので、ある程度、コードが出来たら、こちらに掲載させて頂きます。