CMSインサイド
eZ Publishの構築を簡単に!
自己紹介
●
    サニエ エリック
●   フランス人、2001年に来日
●   2008~2011 eZ Systems Japanでテクニカルコンサル
    タント
●   2011年より独立(eZ Publishを中心)
●   eZ Publishコミュニティ活動・毎月にez Publishの勉強会
●   es@clina.jp
●   @ericsagnes
eZ Publishの紹介
eZ Publish
●   ノルウェー発のオープンソースCMS (GPL2)

●   2001年から開発

●   eZ Systems社が開発の方針を決めます

●
    開発と展開はヨーロッパ中心
2つのeZ Publish
●   エンタープライズオープンソースCMS

●
    エンタープライズ版とオープンソース版

●
    オープンソースからエンタープライズは移行可能

●
    プロジェクトの規模とニーズに合わせて、バージョ
    ン決めれる
エンタープライズ版
●
    有料

●
    サブスクリプション型

●
    正式サポート

●
    専用エクステンションマーケット

●
    ステーブルバージョン(1年2回リリース)

●
    専用商用ライセンス
コミュニティ版
●
    エンタープライズ版とコードベースは一緒

●   GPL2ライセンス

●
    毎月のマイルストーンリリース

●
    エンタープライズほどステーブルでありません

●
    エンタープライズ版より最新機能を含んでいます
2つのeZ Publish第2弾!
●   2012年9月にeZ Publish 5.0がリリースされま
    した
●   主流はまだeZ Publish 4
●   eZ Publish 5とeZ Publish 4の互換性は少な
    い
●   eZ Publish 5は互換性のためにeZ Publish 4
    をそのまま含んでいます(legacy)
eZ Publish 4
●   2007年12月にリリース
●   PHP 5に対応したバージョン
●   独自のフレームワーク、eZ Componentsの利
    用
●   最終バージョンは4.7
●
    安定しています
eZ Publish 5
●   2012年9月にリリース
●   Symfony 2ベース
●   新しいカーネル、カーネルAPI、テンプレート。。。
●   eZ Publish 4.7を含んでいる
●
    未完成なところもある
●
    変更点が多く、ドキュメントは現在に少ない
●
    開発者プレビューに近い
●
    可能性は広い!
eZ Publish 4環境
●   LAMP環境
●   PHP 5.2.14以上
●   MySQL 5以上
●   PostgreSQL 8以上でも動く
●   IISでも動く
eZ Publish のインストール
●   アーカイブのダウンロード(2012.8はおすすめ)
●
    アーカイブの解答
●   DBの作成
●
    バーチャルホスト・ホストの設定
●
    ブラウザからアクセスする
●
    インストールを完成する
●
    デモサイト、管理画面を確認する
eZ Publishの事例 ­ 海外
eZ Publishの事例 ­ 国内
eZ Publish の特徴
●
    柔軟なコンテンツエンジン

●
    豊富のデフォルト機能

●
    開発の柔軟性

●
    開発の速度・効率
デフォルト機能(一部)
●
    柔軟なコンテンツエンジン     ●
                         マルチドメイン
●
    多言語              ●
                         細かいアクセス権限
●
    バージョン管理          ●
                         マルチデータベース
●
    ブログ              ●   SSO
●
    掲示板              ●
                         高機能検索エンジン
●
    画像自動リサイズ         ●   REST API
●
    他段階承認            ●   AJAX API
●   webdav           ●
                         ファイルの一括アップロード
●   LDAP             ●
                         コンテンツ関連付け
●
    オフィスファイルインポート・
                     ●   RSS自動生成
    エクスポート           ●
                         サイトマップ自動生成
CMSとCMF
●   CMSはコンテンツマネジメントシステム
●   CMFはコンテンツマネジメントフレームワーク
●   eZ PublishはCMFでありながら、CMSである
●   と言いますと、eZ Componentsとコンテンツエン
    ジンを使って、別なCMSを「簡単」に作れます
●
    管理画面を簡単に置き換えれ、拡張できる
プラグインベースCMSと
          コアベースCMS
●   プラグインベースCMS
     + コミュニティが活発的
     + プラグインのチョイスが多い
     ー バージョン依存が複雑になります
     ー 品質がばらばら
     ー コアが浅い
●   コアベースCMS
     + バージョンの依存関係問題はほとんどない
     +品質が統一されている
     ー コミュニティ活動が静か
     ー エクステンションは自作ですることが多い
eZ Publishに向いてる案件
●
    ニーズの高い案件
●
    メディアサイト
●
    マルチドメイン・横展開
●
    カタログサイト
●   コーポレートサイト (eZ Webin)
●
    成長可能性のあるサイト
夢のようなCMS?
●
    機能があるだけハードルがやや高い
●
    ドキュメンテーションが少ない、わかりにくい
●
    サイトアクセス、ノード、オブジェクト、ビュー、モ
    ジュール。。。初心者から掴みづらいCMS
●
    でもなれると開発時間はかなり短縮できます
●
    機能の追加も簡単にできます
初心者向けの使い方
●   WebInパッケージをインストール
●   CSS変更
●
    コンテンツの調整
●
    コーポレートサイトの出来上がり
eZ Publishを活用した案件
●   8ドメイン・10サイト   ●
                      承認ワークフロー
●
    2つのデータベース     ●
                      未来公開
●
    多言語(日本語、英     ●
                      複雑なアクセス権限
    語)            ●
                      関連付け(タグ)
●   自動Twitter投稿   ●
                      画像ギャラリー
●
    イベントの自動管理     ●
                      複雑なキャッシュ設定
●
    クロスドメイン投稿     ●
                      テンプレート言語の拡
●   統合RSSフィード         張
eZ Publishを活用した案件
それでも
●   ひとつのeZ Publish
●
    元コードやテンプレートに一切の変更なし
●
    3つのエクステンションで実装
●
    〜150枚のテンプレート
●
    簡単に新規サブサイト・機能の追加可能
eZ Publishの技術紹介
eZ Publishの最大特徴!
          コンテンツエンジン
●   コンテンツを無理矢理CMSに合わせるのではなく、CMS
    はコンテンツに自然に合う

●
    コンテンツは自由なコンテンツクラスで定義

●   コンテンツクラスはGUIで作れます

●
    コンテンツクラスは属性の組み合わせ

●
    属性はデータタイプで定義できる

●   ニーズあれば、カスタムデータタイプは作成できる(PHP)
eZ Publishの最大特徴!
             コンテンツエンジン
●
    「イベント」のコンテンツクラスを作りましょう!
    –   タイトル[テキスト]
    –   紹介文[XMLブロック]
    –   開催日時[日付と時刻]
    –   終了日時[日時と時刻]
    –   地図[Google Mapロケーション]
eZ Publishの最大特徴!
      コンテンツエンジンのメリット
●
    既存クラスに簡単にフィールドを追加できます

●   DB、コーラムは一切気にしなくていい

●
    フィールドで絞り込み、検索できます

●
    コンテンツクラス別のテンプレート実装

●
    コンテンツクラス別のアクセス権限

●
    コンテンツレベルにロジック持たせる
コンテンツクラス、コンテンツツリー
        オブジェクト、ノード
●
    コンテンツはコンテンツツリーに作ります

●
    コンテンツを作る際はコンテンツクラスのインスタ
    ンス、オブジェクトは作られます

●
    同時にコンテンツツリーにノードが作られます

●
    ノードはオブジェクトの配置先と呼びます

●
    一つのオブジェクトは複数のノードに公開されるこ
    とができます
コンテンツクラス、コンテンツツリー
       オブジェクト、ノード

     コンテンツツリー               オブジェクトプール

        ノードID:2
                             オブジェクトID:3
       オブジェクトID:3


 ノードID:12      ノードID:16
オブジェクトID:15   オブジェクトID:25   オブジェクトID:15


 ノードID:34
オブジェクトID:25
                            オブジェクトID:25
ノード・オブジェクトの骨組み

ノード
 オブジェクト
  言語(日本語)     言語(英語)
  バージョン(5)    バージョン(5)
  属性          属性
  タイトル:ほげほげ   タイトル:FOO

  属性B         属性B

  バージョン(4)    バージョン(4)
コンテンツエンジン
           最後の一言
●
    実際ノードとオブジェクトの境線は薄い

●
    ノード・オブジェクトの全属性をテンプレートからア
    クセスできます

●
    メディアリソースとユーザ管理もコンテンツツリー
    の一部

●   コンテンツツリー内のノードのURLは属性で決め
    れます
コンテンツエンジン
●
    イベントクラスコンテンツの作成

●
    ノードとオブジェクト関係の確認

●
    配置先の確認
しっかりとしたアクセス権限
●
    行動別で権限を設定できます
    –   作成
    –   編集
    –   削除
●
    コンテンツ別で権限を設定できます
    –   セクション別
    –   サブツリー別
    –   言語別
    –   作成ユーザのグループ別
アクセス権限の骨組み
          ポリシー、ロール、ユーザ
●
    ポリシーはひとつの権限となります
    –   例「日本語のイベントを作成できる」
●
    ポリシーは基本的にカーネルの一つのモジュー
    ルの一つのファンクションにアクセスを許可します
●
    ロールはポリシーの組み合わせ
●
    ユーザ(又はユーザグループ)にロールを割り当
    てれる
●
    ロールを割り当てるときにコンテンツ制限(サブツ
    リー又はセクション)をつけることができます
アクセス権限の骨組み
 ポリシー、ロール、ユーザ

 ロールとポリシー     ユーザ管理


ロールA        ユーザグループ1
   ポリシーA       ユーザ2

   ポリシーB       ユーザ3



ロールC
   ポリシーD

   ポリシーE
アクセス権限
          最後の一言
●
    ユーザは普通のオブジェクト・ノードであります
●
    ユーザアカウント属性を持つノーづはすべて有効
    ユーザとなります
●
    オブジェクトの複数配置先を利用すれば、同じ
    ユーザを数ユーザグループに入れることができま
    す
●
    ロール割り当て制限をうまく使うとロールは簡単
    に再利用できます
アクセス権限
●
    ユーザグループの作成
●
    ユーザの作成
●
    ロールの作成
●
    ロールを割り当てる
豊富な設定
                設定とサイトアクセス
●   基本の設定ファイルはsettingsフォルダー直下に入っています
●   iniファイルとなっています
●
    ブロックとルールの組み合わせになります
●
    設定ファイルはたくさんあります!
●   一番重要な設定ファイルはsite.ini
●
    基本の設定は
    –   デフォルト設定: settings/直下
    –   オーバーライド設定: settings/override/直下
    –   サイトアクセス設定: settings/siteaccess/の下
●   デフォルト以外は.ini.append.phpの拡張をつける(セキュリ
    ティのため)
豊富な設定
             設定とサイトアクセス
●
    設定の優先順位は
    –   オーバーライド
    –   サイトアクセス
    –   デフォルト
●
    サイトアクセスは設定の組み合わせ
●
    サイトアクセスは特別な条件で読み込まれる設定
    –   特定なホスト名 www.site.com/
    –   特定なポート www.site.com:8080/
    –   特定なパス www.site.com/admin/
設定で管理できるもの
●
    利用するデザイン
●
    利用する言語
●   利用するDB
●
    デバッグの有効
●
    テンプレートの設定
●
    イメージの自動リサイズパータン
●
    など
サイトアクセス
●
    サイトアクセスを利用することで
    –   多言語サイト
    –   複数DBサイト
    –   複数デザイン
    –   管理画面(ただのデザイン)
    –   モバイルサイト(ただのデザイン)
    –   などの実装ができます
エクステンションと設定
●
    エクステンションで設定を管理できる
    –   デフォルト
    –   サイトアクセス
●
    あわせて(優先順位で)
    –   オーバーライド
    –   デフォルトサイトアクセス
    –   エクステンションサイトアクセス
    –   エクステンションデフォルト
    –   デフォルト
●
    の設定場所があります
●
    多くて混乱しやすいので、管理画面で確認しましょう!
    (システム設定 > INIファイル)
設定の変更
●
    オーバーライドでデバッグモードの有効
    /settings/override/site.ini.append.phpに
    ####################
    # 開発設定
    ####################

    [ContentSettings]
    ViewCaching=disabled

    [DebugSettings]
    DebugOutput=enabled

    [TemplateSettings]
    Debug=enabled
    ShowXHTMLCode=disabled
    TemplateCompile=disabled
    TemplateCache=disabled
    ShowUsedTemplates=enabled

    [OverrideSettings]
    Cache=disabled
●
    キャッシュの削除
    php bin/php/ezcache --clear-all
●
    結果の確認
デザインとは
●
    テンプレートはデザインでまとめます
●   デザインは/design直下のフォルダーです
●   デザインはテンプレート、CSS、JS、コンテンツでな
    い画像などを含めます
●
    一つのサイトアクセスは複数なデザインを利用しま
    す
    –   メインデザイン
    –   追加デザイン(任意、複数可能)
    –   デフォルトデザイン
●   site.iniで管理されます
デザインフォールバック
●
    メインデザインでリソースを見つけない場合には
    優先順位の次のデザインに探します
●   最終的に「standard」デザインに探します
●   standardデザインはすべての基本テンプレート
    を含めます
●
    デザインフォールバックをうまく利用すれば、作る
    テンプレート量を減らすことができます
●
    デザインを抽象的な使い方もできます!
デザインフォールバック

       design/design3/templates/pagelayout.tpl
デザインの抽象・例
デザインの抽象・構造
●   design/hospital
    –   基本の病院テンプレート
●   design/ophthalmologist
    –   眼科の一般テンプレート
●   design/dermatologist
    –   皮膚科の一般テンプレート
●   design/dentist/
    –   歯科の一般テンプレート
●   design/dermatologist_a
    –   皮膚科 A 特定の画像やテンプレート
テンプレート
●
    必ずデザインに入っています
●   テンプレート言語はsmartyに似ている
●   HTMLと{}で囲めたeZ Publishコード
●
    テンプレート言語を独自オペーレーターで拡張で
    きる
●
    一つのページには複数のテンプレートでできてい
    ます
●
    テンプレートは2種類あります、レイアウトテンプ
    レートとコンテンツテンプレート
レイアウトテンプレートと
           コンテンツテンプレート
pagelayout.tpl(レイアウトテンプレート)

                              ヘッダー


              コンテンツテンプレート




 ナビゲーション




                              フッター
ページで利用されるテンプレート
2種類のコンテンツテンプレート
●
    ノードを表示する時の「ノードテンプレート」
    /company/news
    /blog
●
    カーネルの機能をアクセスする時の「システムテ
    ンプレート」
    /user/login
    /content/edit
    /モジュール名/ファンクション名
システムテンプレート
●
    カーネルのインターフェースとなるテンプレート
●   URLは
    /モジュール名/ビュー名
●
    読み込まれるテンプレートファイルは
    モジュール名/ビュー名.tpl
    user/login.tpl
    user/logout.tpl
ノードテンプレート
●
    コンテンツ(ノード)を表示する際に必ず利用され
    ます
●   URLはノードのコンテンツツリーの位置できまりま
    す
●   システムURLでもアクセスできます
    /content/view/full/ノードID
●
    読み込まれるテンプレートファイルは必ず
    node/view/full.tpl
テンプレートオーバーライド
●
    ノードテンプレートはすべて同じテンプレートを利用します
●
    テンプレートオーバーライドを利用することで、好きな条件
    で別なテンプレートを読み込むことができます
    –   特定なコンテンツクラスのインスタンス
    –   特定なノードIDやオブジェクトID
    –   特定なセクションに入ってるノード
    –   など
●
    どのテンプレートにオーバーライド使える!
    (利用できる条件は異なります)
●   http://doc.ez.no/eZ-Publish/Technical-
    manual/4.x/Reference/Template-override-
    conditions
テンプレートオーバーライド
●   override.ini 設定ファイルで管理されます
●
    オーバーライドブロックをの組み合わせ
●
    順番でブロックが読み込まれて、最初マッチするも
    のは利用されます
●
    一つのブロックで複数の条件を設定できます
    (ANDとなります)
●
    オーバーライドブロックは下記のよう(基本)
    –   元のテンプレート
    –   代わりに利用するテンプレート
    –   条件
オーバーライドブロック



 ブロックタイトル     [full_article]
  元テンプレート     Source=node/view/full.tpl
 利用テンプレート     MatchFile=full/article.tpl
テンプレートフォルダー   Subdir=templates
    条件        Match[class_identifier]=article
テンプレートビューモード
●
    テンプレートのビューモードはオーバーライドブ
    ロックの元テンプレートの「node/view/ビュー
    モード.tpl」
●   デフォルトのビューモードは「full」となります
●   ノードのURLはシステム的に
    /content/view/full/ノードID
●
    一言で言いますとビューモードは求めるテンプ
    レートです
●
    ビューモードにいろいろの可能性があります!
    /content/view/sitemap/ノードID
デバッグで利用されている
テンプレートオーバーライドの確認
テンプレートの場所
●
    テンプレートはデザインに入ります
    –   /design/デザイン名/templates 標準テンプレート
    –   /design/デザイン名/override/templates
         オーバーライドテンプレート


●
    テンプレートのパスは深くなりますので、間違いや
    すい(特にエクステンションを利用する際)
テンプレート言語
●   HTMLとeZ Publishコードの組み合わせ
●   eZ Publishコードは{}で囲む
●   eZ Publishコードでは
    –   変数の定義と呼び出し
    –   オペーレーターによる処理
    –   ファンクションによる処理(フェッチ、インクルード等)
    –   ループ、IF等のブロック処理
●
    独自オペーレーターで拡張できます
テンプレート変数
●
    テンプレートで利用できる変数
●   「$」で始まる
●
    2種類あります
    –   モジュールが提供する変数
        $nodeなど
    –   テンプレートで作る変数
●
    変数のタイプは
    –   数字
    –   文字列
    –   配列
    –   オブジェクト
    –   ブーリアン
テンプレート変数
●   {def}ファンクションで作れます
    {def $name='foo'}
●   {set}ファンクションで変更できます
    {set $name='bar'}
●
    各タイプの変数
    –   {set $a=3.14} 数字
    –   {set $a='pi'} 文字列
    –   {set $a=array(1.61, 3.14)} 配列
    –   {set $a=hash('phi', 1.61, 'pi', 3.14)} ハッシュ
$node変数
●
    ノードテンプレートで利用できます
●   eZContentObjectTreeNodeオブジェクトのインスタンス
●   $nodeから簡単に属性、オブジェクト、親ノード、子ノードなど
    の情報を習得できます
    –   {$node.parent} 親ノード
    –   {$node.data_map} 属性情報
    –   {$node.children} 子ノードの配列
    –   {$node.object} オブジェクト
    –   {$node.url_alias} ノードのURL
●   http://doc.ez.no/eZ-Publish/Technical-
    manual/4.x/Reference/Objects/ezcontentobjecttree
    node
テンプレートオペレーター
●
    テンプレート内でロジックを実行できる特別なキー
    ワード
●
    基本的はインプットに対して、アウトプットを生成し
    ます
    –   {concat('hello',' world')} => 'hello world'
●   「|」でオペレーターを繋げれる
    –   {10|inc()|dec()} => 10
●
    デフォルトで140オペーレーター以上があります
●   PHPで独自オペーレーターが作れる
テンプレートファンクション
●
    オペーレーターに似ていますが、インプットを渡す
    ことができません
●
    代表的に他のテンプレートの呼び出しとコンテン
    ツを取得するフェッチを含めます
    –   {include uri='design:footer.html'}
●
    フェッチファンクション以外、独自ファンクションは
    あんまり作らない
テンプレートブロック
●   ブロックはIFロジック、ループなどを実行します
    {if eq($i,5)}
    <p>5 x 5 = {mul(5,5)}</p>
    {/if}
●   ループの基本はforeach(forとwhileもあります)
    {foreach $array as $item}
    <p>{$item}</p>
    {/foreach}
    {foreach $array as $key => $item}
    <p>{$key} - {$item}</p>
    {/foreach}
eZ Publishのforeachは強力!
●   reverse – 逆順でループする
    {foreach $array as $item reverse}
●   max – 最大のループ数
    {foreach $array as $item max 3}
●   offset – ループのスタートを決める
    {foreach $array as $item offset 3}
●   sequence – ループする追加配列(CSSに便利)
    {foreach $array as $item sequence
    array('light','dark') as $style}
fetchファンクション
●   fetchファンクションでモデルにクエリーを送れま
    す(コンテンツの取得)
●
    モジュール毎に設定されています
●
    公式ドキュメントにほとんどドキュメントされていま
    す
●   独自fetchファンクションを追加することができま
    す
●
    書き方は
    {fetch('モジュール名','fetchファンクション名',
    [パラメーター])}
代表的fetchファンクション
●   主に使われるfetchファンクションは3つとなりま
    す
●   一つのノードをfetchする
    {fetch('content','node',hash('node_id',2))
    }
●   複数のノードをfetchする
    {fetch('content','list',hash('parent_node_i
    d',2))}
●   現在のユーザをfetchする
    {fetch('user','current_user')}
fetch – content, node
●
    単独のノードをフェッチする
●
    ノードオブジェクト
    [eZContentObjectTreeNode]を戻す
●
    使い方
    {def $node=fetch('content','node',hash(
       'node_id', ノードID
    ))}
●
    追加パラメーター
    –   'language-code' 特定な言語でフェッチする
fetch – content, list
●
    複数のノードをフェッチする
●   ノードオブジェクト[eZContentObjectTreeNode]の配列を戻す
●
    使い方
    {def $nodes=fetch('content','list',hash(
       'parent_node_id', ノードID
    ))}
●
    追加パラメーター
    –   'sort_by' ソート順の設定 [配列]
    –   'limit' 戻すノードの数 [数字]
    –   'offset' 結果のスタート位置 [数字]
    –   'class_filter_type' コンテンツクラス絞り込みロジック ['include'|'exclude']
    –   'class_filter_array' コンテンツクラスの絞り込み [配列]
    –   'attribute_filter' 属性ベース絞り込み [配列]
    –   'depth' ツリーの深さ [数字]
fetch – content, list例
●
    ページネーションの実装
    {def $nodes=fetch('content','list',hash(
       'parent_node_id', ノードID,
       'offset', mul(sub($page_nb,1),
    $items_per_page),
       'limit', $items_per_page
    ))}
●   フォルダーインスタンスコンテンツのfetch
    {def $nodes=fetch('content','list',hash(
       'parent_node_id', ノードID,
       'class_filter_type', 'include',
       'class_filter_array', array('folder')
    ))}
テンプレート呼び出し
●
    テンプレート内から、オーバーライドルールに従っ
    て、テンプレートを呼び出すことができます
●
    最も使われるのは
    –   ノードテンプレートを呼び出す
        {node_view_gui}
    –   属性テンプレートを呼び出す
        {attribute_view_gui}
●
    テンプレート作成の最高の味方!
node_view_gui
●
    ノードをオーバーライドルールに合ったテンプレートを利用し
    て、表示する
●
    パラメーター
    –   content_node 表示したいノードオブジェクト
        [eZContentObjectTreeNode]
    –   view 利用するビューモード [文字列]
        view='line'
    –   カスタム変数 (任意)
        foo='bar'
●
    例
        {node_view_gui content_node=$a_node view='line'}
        {node_view_gui content_node=$a_node view='line'
        foo='bar'}
node_view_gui・例
●   子ノードを'line'ビューモードで表示する
    {foreach $node.children as $child}
    {node_view_gui content_node=$child view='line'}
    {/foreach}
●
    パンくずを生成する
    {node_view_gui content_node=$node view='breadcrumb'}
●   node_view_guiをうまく使えば、綺麗なテンプ
    レート、テンプレートの因数分解ができて、効率が
    どんどんアップ!
attribute_view_gui
●
    属性をオーバーライドルールに合ったテンプレートを利用して、
    表示する
●
    パラメーター
    –   attribute表示したい属性オブジェクト
        [eZContentObjectAttribute]
        attribute=$node.data_map.title
    –   カスタム変数 (任意)
        foo='bar'
●
    例
        {attribute_view_gui attribute=$node.data_map.title}
        {attribute_view_gui attribute=$node.data_map.image
        image_class='thumbnail'}
テンプレートベストプラクティス
●   変数の中身を見たい時はattributeオペーレー
    ターを使う
    {$var|attribute(show,1)}
●
    できるだけテンプレートの因数分解をして、数少な
    い、わかりやすいテンプレートを作りましょう
●   テンプレート言語のスピードはやや遅い(PHPに
    比べれば)、できることが限られていますので、テ
    ンプレート言語で実装が難しいものはカスタムオ
    ペーレーターで実装
例:簡単なニュース一覧の設計
●
    下記の仕様にあったニュースの一覧を表示したい
    –   最新の10ニュースを表示する
    –   最新のニュースはタイトル、概要テキストと画像
    –   次の4ニュースタイトルと概要
    –   残りの5ニュースはタイトルのみ
●
    3つのビューモードを利用します
    –   headline
    –   detailed
    –   line
例:簡単なニュース一覧の設計
●
    ニュース一覧テンプレート
    {def $viewmode=''}
    {foreach $news_list as $index => $news_item max 10}
       {if lt($index,1)}
          {set $viewmode='headline'}
       {elseif le($index,5)}
          {set $viewmode='detailed'}
       {else}
          {set $viewmode='line'}
       {/if}
       {node_view_gui content_node=$news_item view=$viewmode}
    {/foreach}
例:簡単なニュース一覧の設計
headlineテンプレート
<div class=”news”>
<h3><a href={$node.url_alias|ez_url}>
{attribute_view_gui attribute=node.data_map.title}
</a></h3>
<p>
{attribute_view_gui attribute=$node.data_map.image image_class='thumbnail'}
{attribute_view_gui attribute=$node.data_map.short_text}
</div>

detailedテンプレート
<div class=”news”>
<h3><a href={$node.url_alias|ez_url}>
{attribute_view_gui attribute=node.data_map.title}
</a></h3>
<p>
{attribute_view_gui attribute=$node.data_map.short_text}
</p>
</div>

lineテンプレート
<div class=”news”>
<p><a href={$node.url_alias|ez_url}>
{attribute_view_gui attribute=node.data_map.title}
</a></p>
</div>
エクステンション
●
    普段開発する際はエクステンションのみで行います
●   元のdesignと関わらなくて、まとまりもいい
●   eZ Publishでエクステンションはほとんどの機能を実装で
    きます
    –   設定・サイトアクセス
    –   デザイン・テンプレート
    –   テンプレートオペーレーター
    –   翻訳
    –   PHPクラス
    –   データタイプ
    –   カーネルオーバーライド
    –   管理画面の拡張
エクステンション
                       ベストプラクティス
●
    サイトアクセス、設定はすべてエクステンションに持っていく
●
    オバーライドテンプレートは綺麗にまとめる
    –   コンテンツクラスベースオーバーライドは
        /extension/エステンション名/design/デザイン名/override/templates/classes/コンテンツクラス名/
        ビュー名.tpl

    –   ノードID・オブジェクトIDベースオーバーライドは
        /extension/エステンション名/design/デザイン名/override/templates/pages/ページの/パス.tpl
●
    テンプレートで5行以上の再利用できるロジックはオペーレー
    ターにする
●   オペーレーターのコードはできるだけPHPクラスに移す
●
    実装が早い、デバッグは簡単、テンプレートはわかりやすい、
    可能性が広がる
eZ Publishのここがすごい!
           eZ Components
●   eZ Publishのライブラリーに含まれている
    /lib/ezc/
●   PHP自体の開発に関わったDerick Rethansが生み出
    した高品質のPHPライブラリー
●   現在はApacheファンデーションでZeta Components
    に生まれ変わっています
●
    グラフとメールコンポーネントは特にすごい
●   カスタムオペレーターで簡単にeZ Publishとインター
    フェースできる
●   eZ Publish 5ではどんどんSymfonyに置き換えられる
    予定
eZ Publishのここがすごい!
      オンラインエディター・eZ OE
●   XMLブロックデータタイプを利用すると、編集画面
    にeZ OE、リッチテキストエディターが利用できま
    す
●   TinyMCEベース
●   コンテンツをXML形式で保存する
●
    タグ毎にテンプレートを利用し、タグ毎のテンプ
    レートをオーバーライドできる!
●
    カスタムタグの追加可能、既存タグのカスタマイす
    可能
●
    タグの属性タイプも準備されています
eZ Publishのここがすごい!
               eZ Find
●
    高機能検索エンジン
●   JavaのSolrベース
●
    日本語対応
●
    絞り込み検索「ファセット」
●
    カスタマイズできて、属性の拡張できる
●   本来のfetchの代わりにもなれる
●   外部コンテンツ、複数eZ Publishを同時に検索
    可能
●
    パーフォーマンスはかなり早い
eZ Publishの紹介は以上
      質問タイム
日本コミュニティ作成のエクステンション
      Easy CMS
Easy CMSの機能紹介
●
    メインの機能は2つ
    –   フラグ機能
    –   テンプレート選択機能
●   ライセンスはGPL3
●
    「フラグ絞り込み」データタイプの追加
●   モジュールの追加「flag」と「template」
●   fetchファンクションの追加
●
    https://bitbucket.org/ericsagnes/ez-easycms/ 
    からダウンロードできます
Easy CMSのユースケース
●
    カタログサイト

●
    柔軟な運用が必要の場合

●
    デザインパターンが多いサイト
テンプレート機能
●
    オーバーライドルールを書かずにテンプレートや
    ビューモードを管理画面で選択できる
●
    3種類のテンプレートが設定できる
    –   ノードテンプレート
    –   子ノードテンプレート
    –   ノードレイアウト
●
    テンプレートの設定は親子関係で継承されます
●
    デフォルトでは2選択できます
    –   継承 [選択されています]
    –   デフォルト
テンプレート機能
インターフェース
テンプレート機能
                   ノードテンプレート
●
    実際はノードテンプレートに利用されるビューモード
●   easycms.ini設定ファイルで追加できます
    [Templates]
    viewmodes[]
    viewmodes[inherit]=継承する
    viewmodes[default]=デフォルト

●   仕組みはfullビューモードにfetchファンクションで設定さ
    れているビューモードを代わりに読み込みます
●   注意! override.iniのルールは「node/view/full.tpl」
    でなく、「node/view/default.tpl」と設定する必要があり
    ます
テンプレート機能
                  ノードレイアウト
●
    ページレイアウトを選択できます
●
    設定ファイルでできます
    [Templates]
    layouts[]
    layouts[inherit]=継承する
    layouts[default]=デフォルト
●   標準の「pagelayout.tpl」を「pagelayout_ノードレイア
    ウト.tpl」に変更します
●   仕組みはpagelayout.tplからfetchでノードレイアウトを
    取得し、「pagelayout_ノードレイアウト.tpl」を読み込む
●   注意! pagelayout.tplベースオーバライドと一緒に利用
    できません
テンプレート機能
             ユースケース
●
    広告キャンペーン

●
    テーマ的な使い方

●
    デザインの運用が必要な場合

●
    サブサイト
フラグ機能
●
    テンプレートコードを書かずにフェッチを実装できる
●
    ノードを「コンテナー」と「コンテンツ」にわける
●
    「コンテンツ」と「コンテナー」の区別は設定ファイルで
    できます
●
    「コンテナー」はフラグを持つことができます
●
    「コンテンツ」にフラグをつけることができます
●
    「コンテンツ」に付けれるフラグはノードのパスに含ま
    れたコンテナーアイテムのみとなります
●
    「コンテナー」に「フラグ絞り込み」属性をつければ、
    バーチャルフォルダーを実装できる
フラグ機能・
コンテナーインターフェース
フラグ機能・
コンテンツインターフェース
フラグ機能・
フラグ絞り込みインターフェース
例:カタログ
●
    アイテムをすべて「アイテム一覧」フォルダーに作
    成
●
    「アイテム一覧」フォルダーにフラグを作る、
●
    空フォルダーを作って、フラグ絞り込みのターゲッ
    トを「アイテム一覧」にし、絞り込むフラグを選択し
    ます
●
    自動的に絞り込みページができます
●
    デモ
インストール
●
    多少複雑
●   eZ Publishをインストール
●   easy cmsをダウンロード
    git clone git@bitbucket.org:ericsagnes/ez-easycms.git extension/easycms

●   extension/easycms/doc/install.txt を参照
課題
●
    インストールを簡単にする
●   全fetchファンクションをドキュメントする
●   eZ Findと連動させる
●
    機能を追加する 
ご清聴ありがとうございました!

eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」

  • 1.
  • 2.
    自己紹介 ● サニエ エリック ● フランス人、2001年に来日 ● 2008~2011 eZ Systems Japanでテクニカルコンサル タント ● 2011年より独立(eZ Publishを中心) ● eZ Publishコミュニティ活動・毎月にez Publishの勉強会 ● [email protected] ● @ericsagnes
  • 3.
  • 4.
    eZ Publish ● ノルウェー発のオープンソースCMS (GPL2) ● 2001年から開発 ● eZ Systems社が開発の方針を決めます ● 開発と展開はヨーロッパ中心
  • 5.
    2つのeZ Publish ● エンタープライズオープンソースCMS ● エンタープライズ版とオープンソース版 ● オープンソースからエンタープライズは移行可能 ● プロジェクトの規模とニーズに合わせて、バージョ ン決めれる
  • 6.
    エンタープライズ版 ● 有料 ● サブスクリプション型 ● 正式サポート ● 専用エクステンションマーケット ● ステーブルバージョン(1年2回リリース) ● 専用商用ライセンス
  • 7.
    コミュニティ版 ● エンタープライズ版とコードベースは一緒 ● GPL2ライセンス ● 毎月のマイルストーンリリース ● エンタープライズほどステーブルでありません ● エンタープライズ版より最新機能を含んでいます
  • 8.
    2つのeZ Publish第2弾! ● 2012年9月にeZ Publish 5.0がリリースされま した ● 主流はまだeZ Publish 4 ● eZ Publish 5とeZ Publish 4の互換性は少な い ● eZ Publish 5は互換性のためにeZ Publish 4 をそのまま含んでいます(legacy)
  • 9.
    eZ Publish 4 ● 2007年12月にリリース ● PHP 5に対応したバージョン ● 独自のフレームワーク、eZ Componentsの利 用 ● 最終バージョンは4.7 ● 安定しています
  • 10.
    eZ Publish 5 ● 2012年9月にリリース ● Symfony 2ベース ● 新しいカーネル、カーネルAPI、テンプレート。。。 ● eZ Publish 4.7を含んでいる ● 未完成なところもある ● 変更点が多く、ドキュメントは現在に少ない ● 開発者プレビューに近い ● 可能性は広い!
  • 11.
    eZ Publish 4環境 ● LAMP環境 ● PHP 5.2.14以上 ● MySQL 5以上 ● PostgreSQL 8以上でも動く ● IISでも動く
  • 12.
    eZ Publish のインストール ● アーカイブのダウンロード(2012.8はおすすめ) ● アーカイブの解答 ● DBの作成 ● バーチャルホスト・ホストの設定 ● ブラウザからアクセスする ● インストールを完成する ● デモサイト、管理画面を確認する
  • 13.
  • 14.
  • 15.
    eZ Publish の特徴 ● 柔軟なコンテンツエンジン ● 豊富のデフォルト機能 ● 開発の柔軟性 ● 開発の速度・効率
  • 16.
    デフォルト機能(一部) ● 柔軟なコンテンツエンジン ● マルチドメイン ● 多言語 ● 細かいアクセス権限 ● バージョン管理 ● マルチデータベース ● ブログ ● SSO ● 掲示板 ● 高機能検索エンジン ● 画像自動リサイズ ● REST API ● 他段階承認 ● AJAX API ● webdav ● ファイルの一括アップロード ● LDAP ● コンテンツ関連付け ● オフィスファイルインポート・ ● RSS自動生成 エクスポート ● サイトマップ自動生成
  • 17.
    CMSとCMF ● CMSはコンテンツマネジメントシステム ● CMFはコンテンツマネジメントフレームワーク ● eZ PublishはCMFでありながら、CMSである ● と言いますと、eZ Componentsとコンテンツエン ジンを使って、別なCMSを「簡単」に作れます ● 管理画面を簡単に置き換えれ、拡張できる
  • 18.
    プラグインベースCMSと コアベースCMS ● プラグインベースCMS + コミュニティが活発的 + プラグインのチョイスが多い ー バージョン依存が複雑になります ー 品質がばらばら ー コアが浅い ● コアベースCMS + バージョンの依存関係問題はほとんどない +品質が統一されている ー コミュニティ活動が静か ー エクステンションは自作ですることが多い
  • 19.
    eZ Publishに向いてる案件 ● ニーズの高い案件 ● メディアサイト ● マルチドメイン・横展開 ● カタログサイト ● コーポレートサイト (eZ Webin) ● 成長可能性のあるサイト
  • 20.
    夢のようなCMS? ● 機能があるだけハードルがやや高い ● ドキュメンテーションが少ない、わかりにくい ● サイトアクセス、ノード、オブジェクト、ビュー、モ ジュール。。。初心者から掴みづらいCMS ● でもなれると開発時間はかなり短縮できます ● 機能の追加も簡単にできます
  • 21.
    初心者向けの使い方 ● WebInパッケージをインストール ● CSS変更 ● コンテンツの調整 ● コーポレートサイトの出来上がり
  • 22.
    eZ Publishを活用した案件 ● 8ドメイン・10サイト ● 承認ワークフロー ● 2つのデータベース ● 未来公開 ● 多言語(日本語、英 ● 複雑なアクセス権限 語) ● 関連付け(タグ) ● 自動Twitter投稿 ● 画像ギャラリー ● イベントの自動管理 ● 複雑なキャッシュ設定 ● クロスドメイン投稿 ● テンプレート言語の拡 ● 統合RSSフィード 張
  • 23.
  • 24.
    それでも ● ひとつのeZ Publish ● 元コードやテンプレートに一切の変更なし ● 3つのエクステンションで実装 ● 〜150枚のテンプレート ● 簡単に新規サブサイト・機能の追加可能
  • 25.
  • 26.
    eZ Publishの最大特徴! コンテンツエンジン ● コンテンツを無理矢理CMSに合わせるのではなく、CMS はコンテンツに自然に合う ● コンテンツは自由なコンテンツクラスで定義 ● コンテンツクラスはGUIで作れます ● コンテンツクラスは属性の組み合わせ ● 属性はデータタイプで定義できる ● ニーズあれば、カスタムデータタイプは作成できる(PHP)
  • 27.
    eZ Publishの最大特徴! コンテンツエンジン ● 「イベント」のコンテンツクラスを作りましょう! – タイトル[テキスト] – 紹介文[XMLブロック] – 開催日時[日付と時刻] – 終了日時[日時と時刻] – 地図[Google Mapロケーション]
  • 28.
    eZ Publishの最大特徴! コンテンツエンジンのメリット ● 既存クラスに簡単にフィールドを追加できます ● DB、コーラムは一切気にしなくていい ● フィールドで絞り込み、検索できます ● コンテンツクラス別のテンプレート実装 ● コンテンツクラス別のアクセス権限 ● コンテンツレベルにロジック持たせる
  • 29.
    コンテンツクラス、コンテンツツリー オブジェクト、ノード ● コンテンツはコンテンツツリーに作ります ● コンテンツを作る際はコンテンツクラスのインスタ ンス、オブジェクトは作られます ● 同時にコンテンツツリーにノードが作られます ● ノードはオブジェクトの配置先と呼びます ● 一つのオブジェクトは複数のノードに公開されるこ とができます
  • 30.
    コンテンツクラス、コンテンツツリー オブジェクト、ノード コンテンツツリー オブジェクトプール ノードID:2 オブジェクトID:3 オブジェクトID:3 ノードID:12 ノードID:16 オブジェクトID:15 オブジェクトID:25 オブジェクトID:15 ノードID:34 オブジェクトID:25 オブジェクトID:25
  • 31.
    ノード・オブジェクトの骨組み ノード オブジェクト 言語(日本語) 言語(英語) バージョン(5) バージョン(5) 属性 属性 タイトル:ほげほげ タイトル:FOO 属性B 属性B バージョン(4) バージョン(4)
  • 32.
    コンテンツエンジン 最後の一言 ● 実際ノードとオブジェクトの境線は薄い ● ノード・オブジェクトの全属性をテンプレートからア クセスできます ● メディアリソースとユーザ管理もコンテンツツリー の一部 ● コンテンツツリー内のノードのURLは属性で決め れます
  • 33.
    コンテンツエンジン ● イベントクラスコンテンツの作成 ● ノードとオブジェクト関係の確認 ● 配置先の確認
  • 34.
    しっかりとしたアクセス権限 ● 行動別で権限を設定できます – 作成 – 編集 – 削除 ● コンテンツ別で権限を設定できます – セクション別 – サブツリー別 – 言語別 – 作成ユーザのグループ別
  • 35.
    アクセス権限の骨組み ポリシー、ロール、ユーザ ● ポリシーはひとつの権限となります – 例「日本語のイベントを作成できる」 ● ポリシーは基本的にカーネルの一つのモジュー ルの一つのファンクションにアクセスを許可します ● ロールはポリシーの組み合わせ ● ユーザ(又はユーザグループ)にロールを割り当 てれる ● ロールを割り当てるときにコンテンツ制限(サブツ リー又はセクション)をつけることができます
  • 36.
    アクセス権限の骨組み ポリシー、ロール、ユーザ ロールとポリシー ユーザ管理 ロールA ユーザグループ1 ポリシーA ユーザ2 ポリシーB ユーザ3 ロールC ポリシーD ポリシーE
  • 37.
    アクセス権限 最後の一言 ● ユーザは普通のオブジェクト・ノードであります ● ユーザアカウント属性を持つノーづはすべて有効 ユーザとなります ● オブジェクトの複数配置先を利用すれば、同じ ユーザを数ユーザグループに入れることができま す ● ロール割り当て制限をうまく使うとロールは簡単 に再利用できます
  • 38.
    アクセス権限 ● ユーザグループの作成 ● ユーザの作成 ● ロールの作成 ● ロールを割り当てる
  • 39.
    豊富な設定 設定とサイトアクセス ● 基本の設定ファイルはsettingsフォルダー直下に入っています ● iniファイルとなっています ● ブロックとルールの組み合わせになります ● 設定ファイルはたくさんあります! ● 一番重要な設定ファイルはsite.ini ● 基本の設定は – デフォルト設定: settings/直下 – オーバーライド設定: settings/override/直下 – サイトアクセス設定: settings/siteaccess/の下 ● デフォルト以外は.ini.append.phpの拡張をつける(セキュリ ティのため)
  • 40.
    豊富な設定 設定とサイトアクセス ● 設定の優先順位は – オーバーライド – サイトアクセス – デフォルト ● サイトアクセスは設定の組み合わせ ● サイトアクセスは特別な条件で読み込まれる設定 – 特定なホスト名 www.site.com/ – 特定なポート www.site.com:8080/ – 特定なパス www.site.com/admin/
  • 41.
    設定で管理できるもの ● 利用するデザイン ● 利用する言語 ● 利用するDB ● デバッグの有効 ● テンプレートの設定 ● イメージの自動リサイズパータン ● など
  • 42.
    サイトアクセス ● サイトアクセスを利用することで – 多言語サイト – 複数DBサイト – 複数デザイン – 管理画面(ただのデザイン) – モバイルサイト(ただのデザイン) – などの実装ができます
  • 43.
    エクステンションと設定 ● エクステンションで設定を管理できる – デフォルト – サイトアクセス ● あわせて(優先順位で) – オーバーライド – デフォルトサイトアクセス – エクステンションサイトアクセス – エクステンションデフォルト – デフォルト ● の設定場所があります ● 多くて混乱しやすいので、管理画面で確認しましょう! (システム設定 > INIファイル)
  • 44.
    設定の変更 ● オーバーライドでデバッグモードの有効 /settings/override/site.ini.append.phpに #################### # 開発設定 #################### [ContentSettings] ViewCaching=disabled [DebugSettings] DebugOutput=enabled [TemplateSettings] Debug=enabled ShowXHTMLCode=disabled TemplateCompile=disabled TemplateCache=disabled ShowUsedTemplates=enabled [OverrideSettings] Cache=disabled ● キャッシュの削除 php bin/php/ezcache --clear-all ● 結果の確認
  • 45.
    デザインとは ● テンプレートはデザインでまとめます ● デザインは/design直下のフォルダーです ● デザインはテンプレート、CSS、JS、コンテンツでな い画像などを含めます ● 一つのサイトアクセスは複数なデザインを利用しま す – メインデザイン – 追加デザイン(任意、複数可能) – デフォルトデザイン ● site.iniで管理されます
  • 46.
    デザインフォールバック ● メインデザインでリソースを見つけない場合には 優先順位の次のデザインに探します ● 最終的に「standard」デザインに探します ● standardデザインはすべての基本テンプレート を含めます ● デザインフォールバックをうまく利用すれば、作る テンプレート量を減らすことができます ● デザインを抽象的な使い方もできます!
  • 47.
    デザインフォールバック design/design3/templates/pagelayout.tpl
  • 48.
  • 49.
    デザインの抽象・構造 ● design/hospital – 基本の病院テンプレート ● design/ophthalmologist – 眼科の一般テンプレート ● design/dermatologist – 皮膚科の一般テンプレート ● design/dentist/ – 歯科の一般テンプレート ● design/dermatologist_a – 皮膚科 A 特定の画像やテンプレート
  • 50.
    テンプレート ● 必ずデザインに入っています ● テンプレート言語はsmartyに似ている ● HTMLと{}で囲めたeZ Publishコード ● テンプレート言語を独自オペーレーターで拡張で きる ● 一つのページには複数のテンプレートでできてい ます ● テンプレートは2種類あります、レイアウトテンプ レートとコンテンツテンプレート
  • 51.
    レイアウトテンプレートと コンテンツテンプレート pagelayout.tpl(レイアウトテンプレート) ヘッダー コンテンツテンプレート ナビゲーション フッター
  • 52.
  • 53.
    2種類のコンテンツテンプレート ● ノードを表示する時の「ノードテンプレート」 /company/news /blog ● カーネルの機能をアクセスする時の「システムテ ンプレート」 /user/login /content/edit /モジュール名/ファンクション名
  • 54.
    システムテンプレート ● カーネルのインターフェースとなるテンプレート ● URLは /モジュール名/ビュー名 ● 読み込まれるテンプレートファイルは モジュール名/ビュー名.tpl user/login.tpl user/logout.tpl
  • 55.
    ノードテンプレート ● コンテンツ(ノード)を表示する際に必ず利用され ます ● URLはノードのコンテンツツリーの位置できまりま す ● システムURLでもアクセスできます /content/view/full/ノードID ● 読み込まれるテンプレートファイルは必ず node/view/full.tpl
  • 56.
    テンプレートオーバーライド ● ノードテンプレートはすべて同じテンプレートを利用します ● テンプレートオーバーライドを利用することで、好きな条件 で別なテンプレートを読み込むことができます – 特定なコンテンツクラスのインスタンス – 特定なノードIDやオブジェクトID – 特定なセクションに入ってるノード – など ● どのテンプレートにオーバーライド使える! (利用できる条件は異なります) ● http://doc.ez.no/eZ-Publish/Technical- manual/4.x/Reference/Template-override- conditions
  • 57.
    テンプレートオーバーライド ● override.ini 設定ファイルで管理されます ● オーバーライドブロックをの組み合わせ ● 順番でブロックが読み込まれて、最初マッチするも のは利用されます ● 一つのブロックで複数の条件を設定できます (ANDとなります) ● オーバーライドブロックは下記のよう(基本) – 元のテンプレート – 代わりに利用するテンプレート – 条件
  • 58.
    オーバーライドブロック ブロックタイトル [full_article] 元テンプレート Source=node/view/full.tpl 利用テンプレート MatchFile=full/article.tpl テンプレートフォルダー Subdir=templates 条件 Match[class_identifier]=article
  • 59.
    テンプレートビューモード ● テンプレートのビューモードはオーバーライドブ ロックの元テンプレートの「node/view/ビュー モード.tpl」 ● デフォルトのビューモードは「full」となります ● ノードのURLはシステム的に /content/view/full/ノードID ● 一言で言いますとビューモードは求めるテンプ レートです ● ビューモードにいろいろの可能性があります! /content/view/sitemap/ノードID
  • 60.
  • 61.
    テンプレートの場所 ● テンプレートはデザインに入ります – /design/デザイン名/templates 標準テンプレート – /design/デザイン名/override/templates オーバーライドテンプレート ● テンプレートのパスは深くなりますので、間違いや すい(特にエクステンションを利用する際)
  • 62.
    テンプレート言語 ● HTMLとeZ Publishコードの組み合わせ ● eZ Publishコードは{}で囲む ● eZ Publishコードでは – 変数の定義と呼び出し – オペーレーターによる処理 – ファンクションによる処理(フェッチ、インクルード等) – ループ、IF等のブロック処理 ● 独自オペーレーターで拡張できます
  • 63.
    テンプレート変数 ● テンプレートで利用できる変数 ● 「$」で始まる ● 2種類あります – モジュールが提供する変数 $nodeなど – テンプレートで作る変数 ● 変数のタイプは – 数字 – 文字列 – 配列 – オブジェクト – ブーリアン
  • 64.
    テンプレート変数 ● {def}ファンクションで作れます {def $name='foo'} ● {set}ファンクションで変更できます {set $name='bar'} ● 各タイプの変数 – {set $a=3.14} 数字 – {set $a='pi'} 文字列 – {set $a=array(1.61, 3.14)} 配列 – {set $a=hash('phi', 1.61, 'pi', 3.14)} ハッシュ
  • 65.
    $node変数 ● ノードテンプレートで利用できます ● eZContentObjectTreeNodeオブジェクトのインスタンス ● $nodeから簡単に属性、オブジェクト、親ノード、子ノードなど の情報を習得できます – {$node.parent} 親ノード – {$node.data_map} 属性情報 – {$node.children} 子ノードの配列 – {$node.object} オブジェクト – {$node.url_alias} ノードのURL ● http://doc.ez.no/eZ-Publish/Technical- manual/4.x/Reference/Objects/ezcontentobjecttree node
  • 66.
    テンプレートオペレーター ● テンプレート内でロジックを実行できる特別なキー ワード ● 基本的はインプットに対して、アウトプットを生成し ます – {concat('hello',' world')} => 'hello world' ● 「|」でオペレーターを繋げれる – {10|inc()|dec()} => 10 ● デフォルトで140オペーレーター以上があります ● PHPで独自オペーレーターが作れる
  • 67.
    テンプレートファンクション ● オペーレーターに似ていますが、インプットを渡す ことができません ● 代表的に他のテンプレートの呼び出しとコンテン ツを取得するフェッチを含めます – {include uri='design:footer.html'} ● フェッチファンクション以外、独自ファンクションは あんまり作らない
  • 68.
    テンプレートブロック ● ブロックはIFロジック、ループなどを実行します {if eq($i,5)} <p>5 x 5 = {mul(5,5)}</p> {/if} ● ループの基本はforeach(forとwhileもあります) {foreach $array as $item} <p>{$item}</p> {/foreach} {foreach $array as $key => $item} <p>{$key} - {$item}</p> {/foreach}
  • 69.
    eZ Publishのforeachは強力! ● reverse – 逆順でループする {foreach $array as $item reverse} ● max – 最大のループ数 {foreach $array as $item max 3} ● offset – ループのスタートを決める {foreach $array as $item offset 3} ● sequence – ループする追加配列(CSSに便利) {foreach $array as $item sequence array('light','dark') as $style}
  • 70.
    fetchファンクション ● fetchファンクションでモデルにクエリーを送れま す(コンテンツの取得) ● モジュール毎に設定されています ● 公式ドキュメントにほとんどドキュメントされていま す ● 独自fetchファンクションを追加することができま す ● 書き方は {fetch('モジュール名','fetchファンクション名', [パラメーター])}
  • 71.
    代表的fetchファンクション ● 主に使われるfetchファンクションは3つとなりま す ● 一つのノードをfetchする {fetch('content','node',hash('node_id',2)) } ● 複数のノードをfetchする {fetch('content','list',hash('parent_node_i d',2))} ● 現在のユーザをfetchする {fetch('user','current_user')}
  • 72.
    fetch – content, node ● 単独のノードをフェッチする ● ノードオブジェクト [eZContentObjectTreeNode]を戻す ● 使い方 {def $node=fetch('content','node',hash( 'node_id', ノードID ))} ● 追加パラメーター – 'language-code' 特定な言語でフェッチする
  • 73.
    fetch – content, list ● 複数のノードをフェッチする ● ノードオブジェクト[eZContentObjectTreeNode]の配列を戻す ● 使い方 {def $nodes=fetch('content','list',hash( 'parent_node_id', ノードID ))} ● 追加パラメーター – 'sort_by' ソート順の設定 [配列] – 'limit' 戻すノードの数 [数字] – 'offset' 結果のスタート位置 [数字] – 'class_filter_type' コンテンツクラス絞り込みロジック ['include'|'exclude'] – 'class_filter_array' コンテンツクラスの絞り込み [配列] – 'attribute_filter' 属性ベース絞り込み [配列] – 'depth' ツリーの深さ [数字]
  • 74.
    fetch – content, list例 ● ページネーションの実装 {def $nodes=fetch('content','list',hash( 'parent_node_id', ノードID, 'offset', mul(sub($page_nb,1), $items_per_page), 'limit', $items_per_page ))} ● フォルダーインスタンスコンテンツのfetch {def $nodes=fetch('content','list',hash( 'parent_node_id', ノードID, 'class_filter_type', 'include', 'class_filter_array', array('folder') ))}
  • 75.
    テンプレート呼び出し ● テンプレート内から、オーバーライドルールに従っ て、テンプレートを呼び出すことができます ● 最も使われるのは – ノードテンプレートを呼び出す {node_view_gui} – 属性テンプレートを呼び出す {attribute_view_gui} ● テンプレート作成の最高の味方!
  • 76.
    node_view_gui ● ノードをオーバーライドルールに合ったテンプレートを利用し て、表示する ● パラメーター – content_node 表示したいノードオブジェクト [eZContentObjectTreeNode] – view 利用するビューモード [文字列] view='line' – カスタム変数 (任意) foo='bar' ● 例 {node_view_gui content_node=$a_node view='line'} {node_view_gui content_node=$a_node view='line' foo='bar'}
  • 77.
    node_view_gui・例 ● 子ノードを'line'ビューモードで表示する {foreach $node.children as $child} {node_view_gui content_node=$child view='line'} {/foreach} ● パンくずを生成する {node_view_gui content_node=$node view='breadcrumb'} ● node_view_guiをうまく使えば、綺麗なテンプ レート、テンプレートの因数分解ができて、効率が どんどんアップ!
  • 78.
    attribute_view_gui ● 属性をオーバーライドルールに合ったテンプレートを利用して、 表示する ● パラメーター – attribute表示したい属性オブジェクト [eZContentObjectAttribute] attribute=$node.data_map.title – カスタム変数 (任意) foo='bar' ● 例 {attribute_view_gui attribute=$node.data_map.title} {attribute_view_gui attribute=$node.data_map.image image_class='thumbnail'}
  • 79.
    テンプレートベストプラクティス ● 変数の中身を見たい時はattributeオペーレー ターを使う {$var|attribute(show,1)} ● できるだけテンプレートの因数分解をして、数少な い、わかりやすいテンプレートを作りましょう ● テンプレート言語のスピードはやや遅い(PHPに 比べれば)、できることが限られていますので、テ ンプレート言語で実装が難しいものはカスタムオ ペーレーターで実装
  • 80.
    例:簡単なニュース一覧の設計 ● 下記の仕様にあったニュースの一覧を表示したい – 最新の10ニュースを表示する – 最新のニュースはタイトル、概要テキストと画像 – 次の4ニュースタイトルと概要 – 残りの5ニュースはタイトルのみ ● 3つのビューモードを利用します – headline – detailed – line
  • 81.
    例:簡単なニュース一覧の設計 ● ニュース一覧テンプレート {def $viewmode=''} {foreach $news_list as $index => $news_item max 10} {if lt($index,1)} {set $viewmode='headline'} {elseif le($index,5)} {set $viewmode='detailed'} {else} {set $viewmode='line'} {/if} {node_view_gui content_node=$news_item view=$viewmode} {/foreach}
  • 82.
  • 83.
    エクステンション ● 普段開発する際はエクステンションのみで行います ● 元のdesignと関わらなくて、まとまりもいい ● eZ Publishでエクステンションはほとんどの機能を実装で きます – 設定・サイトアクセス – デザイン・テンプレート – テンプレートオペーレーター – 翻訳 – PHPクラス – データタイプ – カーネルオーバーライド – 管理画面の拡張
  • 84.
    エクステンション ベストプラクティス ● サイトアクセス、設定はすべてエクステンションに持っていく ● オバーライドテンプレートは綺麗にまとめる – コンテンツクラスベースオーバーライドは /extension/エステンション名/design/デザイン名/override/templates/classes/コンテンツクラス名/ ビュー名.tpl – ノードID・オブジェクトIDベースオーバーライドは /extension/エステンション名/design/デザイン名/override/templates/pages/ページの/パス.tpl ● テンプレートで5行以上の再利用できるロジックはオペーレー ターにする ● オペーレーターのコードはできるだけPHPクラスに移す ● 実装が早い、デバッグは簡単、テンプレートはわかりやすい、 可能性が広がる
  • 85.
    eZ Publishのここがすごい! eZ Components ● eZ Publishのライブラリーに含まれている /lib/ezc/ ● PHP自体の開発に関わったDerick Rethansが生み出 した高品質のPHPライブラリー ● 現在はApacheファンデーションでZeta Components に生まれ変わっています ● グラフとメールコンポーネントは特にすごい ● カスタムオペレーターで簡単にeZ Publishとインター フェースできる ● eZ Publish 5ではどんどんSymfonyに置き換えられる 予定
  • 86.
    eZ Publishのここがすごい! オンラインエディター・eZ OE ● XMLブロックデータタイプを利用すると、編集画面 にeZ OE、リッチテキストエディターが利用できま す ● TinyMCEベース ● コンテンツをXML形式で保存する ● タグ毎にテンプレートを利用し、タグ毎のテンプ レートをオーバーライドできる! ● カスタムタグの追加可能、既存タグのカスタマイす 可能 ● タグの属性タイプも準備されています
  • 87.
    eZ Publishのここがすごい! eZ Find ● 高機能検索エンジン ● JavaのSolrベース ● 日本語対応 ● 絞り込み検索「ファセット」 ● カスタマイズできて、属性の拡張できる ● 本来のfetchの代わりにもなれる ● 外部コンテンツ、複数eZ Publishを同時に検索 可能 ● パーフォーマンスはかなり早い
  • 88.
  • 89.
  • 90.
    Easy CMSの機能紹介 ● メインの機能は2つ – フラグ機能 – テンプレート選択機能 ● ライセンスはGPL3 ● 「フラグ絞り込み」データタイプの追加 ● モジュールの追加「flag」と「template」 ● fetchファンクションの追加 ● https://bitbucket.org/ericsagnes/ez-easycms/  からダウンロードできます
  • 91.
    Easy CMSのユースケース ● カタログサイト ● 柔軟な運用が必要の場合 ● デザインパターンが多いサイト
  • 92.
    テンプレート機能 ● オーバーライドルールを書かずにテンプレートや ビューモードを管理画面で選択できる ● 3種類のテンプレートが設定できる – ノードテンプレート – 子ノードテンプレート – ノードレイアウト ● テンプレートの設定は親子関係で継承されます ● デフォルトでは2選択できます – 継承 [選択されています] – デフォルト
  • 93.
  • 94.
    テンプレート機能 ノードテンプレート ● 実際はノードテンプレートに利用されるビューモード ● easycms.ini設定ファイルで追加できます [Templates] viewmodes[] viewmodes[inherit]=継承する viewmodes[default]=デフォルト ● 仕組みはfullビューモードにfetchファンクションで設定さ れているビューモードを代わりに読み込みます ● 注意! override.iniのルールは「node/view/full.tpl」 でなく、「node/view/default.tpl」と設定する必要があり ます
  • 95.
    テンプレート機能 ノードレイアウト ● ページレイアウトを選択できます ● 設定ファイルでできます [Templates] layouts[] layouts[inherit]=継承する layouts[default]=デフォルト ● 標準の「pagelayout.tpl」を「pagelayout_ノードレイア ウト.tpl」に変更します ● 仕組みはpagelayout.tplからfetchでノードレイアウトを 取得し、「pagelayout_ノードレイアウト.tpl」を読み込む ● 注意! pagelayout.tplベースオーバライドと一緒に利用 できません
  • 96.
    テンプレート機能 ユースケース ● 広告キャンペーン ● テーマ的な使い方 ● デザインの運用が必要な場合 ● サブサイト
  • 97.
    フラグ機能 ● テンプレートコードを書かずにフェッチを実装できる ● ノードを「コンテナー」と「コンテンツ」にわける ● 「コンテンツ」と「コンテナー」の区別は設定ファイルで できます ● 「コンテナー」はフラグを持つことができます ● 「コンテンツ」にフラグをつけることができます ● 「コンテンツ」に付けれるフラグはノードのパスに含ま れたコンテナーアイテムのみとなります ● 「コンテナー」に「フラグ絞り込み」属性をつければ、 バーチャルフォルダーを実装できる
  • 98.
  • 99.
  • 100.
  • 101.
    例:カタログ ● アイテムをすべて「アイテム一覧」フォルダーに作 成 ● 「アイテム一覧」フォルダーにフラグを作る、 ● 空フォルダーを作って、フラグ絞り込みのターゲッ トを「アイテム一覧」にし、絞り込むフラグを選択し ます ● 自動的に絞り込みページができます ● デモ
  • 102.
    インストール ● 多少複雑 ● eZ Publishをインストール ● easy cmsをダウンロード git clone [email protected]:ericsagnes/ez-easycms.git extension/easycms ● extension/easycms/doc/install.txt を参照
  • 103.
    課題 ● インストールを簡単にする ● 全fetchファンクションをドキュメントする ● eZ Findと連動させる ● 機能を追加する 
  • 104.