PDFフレームワークをちょっと試してみた。

SugarCRMv5.5からSugarPDFフレームワークが新しく導入されました。SugarCRMv5.2以前まではPDFで帳票出力などを行いたい場合、EclipseBirtを使ったり、TCPDFなどのPDFを作成するためのライブラリを用意し、ごりごりとロジックを書く必要がありました。ようやくその苦行から解き放たれることができるかも!ってことで個人的にはv5.5で一番うれしい新機能です。そんなわけで、簡単なPDF出力サンプルをつくってみたのでメモがてらにまとめてみます。

続きを読む

displayParamsで指定可能なパラメータ(3)

3回で終わらせる予定だったこのまとめですが、予想以上にパラメータが多くて終われませんw現在調査済みの範囲ですべてなら、次のエントリあたりでまとめ終わると思います。未知のパラメータが芋づる式に増えるようならもうしらんorz

さて、今回紹介するパラメータですが、今までとはちょっと毛色が違くて実際の表示部分にはほとんど関与しません。内容的にはコールバック関数周りで指定可能なパラメータとなります。恐らくパラメータの一覧を出しただけでは、ただでさえわかりにくい文章がさらにわかりづらくなると思います。なので、まずは簡単に実際の画面で説明します。

図は取引先と取引先担当者(Contacts)の編集画面です(標準のものです)。取引先では、二つの住所:billing_address(請求先住所)とshipping_address(出荷先住所)を入力することが出来ます。取引先担当者の編集画面では、同じようにprimary_address(主となる住所)とalt_address(他の住所)を入力することが出来ます。また、取引先担当者の画面では取引先を選択すると、デフォルトでは自動的にphone_work(会社電話)とprimary_address_street(主となる住所)に、選択された取引先のphone_office(会社電話)とshipping_address_street(請求先住所)が埋め込まれます。

続きを読む

displayParamsで指定可能なパラメータ(1)

editviewdefs.php等では表示フィールドに対して"displayParams"というパラメータを設定することが出来ます。このパラメータを指定すると、画面表示時のテキストフィールドのサイズを変えたり、ボタンを非表示にすることができます。ある程度抑えておくと、ロジックが減らせるケースもでてくる(かも)知れないので、調べた範囲でまとめてみます。ただ、指定可能なパラメータは量が結構多いので、3回くらいのエントリに分けてまとめます。

続きを読む

SugarCRMのビュー表示プロセス

とりあえずざっくりと。ロジックはSugarCE5.5.0GAのものとなります。(5.2系でも基本的には大差ないと思います。)

index.php

  • SugarApplication#execut() をコール

incluce/MVC/SugarApplication.php

  • ControllerFactory#getController() => コントローラオブジェクト(controller)を取得
  • controller#preProces() をコール
  • controller#execute() をコール

include/MVC/Controller/ControllerFactory.php

getController()はコントローラオブジェクトを返す。返されるコントローラオブジェクトのベースとなるクラスを定義するphpファイルは、以下の順序で検索される。

1. custom/modules/<モジュール名>/controller.php
2. modules/<モジュール名>/controller.php
3. custom/include/MVC/Controller/SugarController.php
4. include/MVC/Controller/SugarController.php

 また、上記順序に加えてクラス名が"<モジュール名>.CustomController"と定義されているものがさらに優先される。
(例) custom/modules/Accounts/controller.phpを作成した場合、AccountsCustomControllerクラスの存在が最初にチェックされ、存在しない場合AccountsControllerをチェックする。

controller#execute()

  • controller#processView() をコール
  • ViewFactory#loadView()をコール => ビューオブジェクト(view)を取得
  • view#process()をコール

include/MVC/View/ViewFactory.php

loadView()はアクションに応じた "view.xxx.php"を読み込み、その内容に従い画面を構築する。ファイルは以下の順序で読み込まれる。

1. custom/modules/<モジュール名>/views/view.<アクション名>.php
2. modules/<モジュール名>/views/view.<アクション名>.php
3. custom/include/MVC/View/views/view.<アクション名>.php
4. include/MVC/View/views/view.<アクション名>.php

view#process()

  • view#preDisplay() をコール
  • view#display() をコール

view.<アクション名>.php#preDisplay()

画面表示の定義ファイル(<アクション名>viewdefs.php)を読み込み、setup()をコールする。定義ファイルは以下の順序で読み込まれる。(EditViewを表示すると仮定)

1. custom/modules/<モジュール名>/metadata/editviewdefs.php
2. custom/modules/<モジュール名>/metadata/metafiles.php の $metafiles['モジュール名']['editviewdefs']に指定されたファイル
3. modules/<モジュール名>/metadata/metafiles.php の $metafiles['モジュール名']['editviewdefs']に指定されたファイル
4. modules/<モジュール名>/metadata/editviewdefs.php



実際はもうちょっと複雑に各種ビューの定義ファイルの取得やアクションマッピングの設定を行っていますが、単純なビューのカスタマイズ程度ならこのフローを知っていれば困らないと思います。むしろ、editviewdefs.php等で利用可能なパラメータを知ってた方がカスタマイズしやすかったりします。

Tomcatのディレクトリ構成

Tomcat 5.x

  • common
    • Tomcat内部クラスからも、すべての Webアプリケーションからも参照可能になっている追加クラス
  • server
    • Tomcat5そのものを実装するのに必要なクラスやリソース
  • shared
    • すべてのWebアプリケーションを通して共有したいクラスやリソース
  • webapps
    • 作成したwebアプリケーションが参照可能なクラス/パッケージ
  webapps/my_app/WEB-INF/lib     : jarファイル
                        /classes : クラスファイル



Tomcat 6.0

  • lib
    • Tomcatが利用するクラス/パッケージ
  • webapps
    • 作成したwebアプリケーションが参照可能なクラス/パッケージ
  webapps/my_app/WEB-INF/lib     : jarファイル
                        /classes : クラスファイル

参考URL
Tomcat5 サーブレット/JSP コンテナクラスローダの手引き
The Apache Tomcat 5.5 Servlet/JSP Container Class Loader HOW-TO
Apache Tomcat 6.0 Class Loader HOW-TO