OSDN Git Service

rename files
[ethna/ethna.git] / class / AppManager.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna_AppManager.php
5  *
6  *  @author     Masaki Fujimoto <fujimoto@php.net>
7  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8  *  @package    Ethna
9  *  @version    $Id$
10  */
11
12 /** アプリケーションオブジェクト状態: 使用可能 */
13 define('OBJECT_STATE_ACTIVE', 0);
14 /** アプリケーションオブジェクト状態: 使用不可 */
15 define('OBJECT_STATE_INACTIVE', 100);
16
17
18 /** アプリケーションオブジェクトソートフラグ: 昇順 */
19 define('OBJECT_SORT_ASC', 0);
20 /** アプリケーションオブジェクトソートフラグ: 降順 */
21 define('OBJECT_SORT_DESC', 1);
22
23
24 /** アプリケーションオブジェクトインポートオプション: NULLプロパティ無変換 */
25 define('OBJECT_IMPORT_IGNORE_NULL', 1);
26
27 /** アプリケーションオブジェクトインポートオプション: NULLプロパティ→空文字列変換 */
28 define('OBJECT_IMPORT_CONVERT_NULL', 2);
29
30
31 // {{{ Ethna_AppManager
32 /**
33  *  アプリケーションマネージャのベースクラス
34  *
35  *  @author     Masaki Fujimoto <fujimoto@php.net>
36  *  @access     public
37  *  @package    Ethna
38  */
39 class Ethna_AppManager
40 {
41     /**#@+
42      *  @access private
43      */
44
45     /** @var    object  Ethna_Backend       backendオブジェクト */
46     var $backend;
47
48     /** @var    object  Ethna_Config        設定オブジェクト */
49     var $config;
50
51     /**  @var    object  Ethna_DB      DBオブジェクト */
52     var $db;
53
54     /** @var    object  Ethna_I18N          i18nオブジェクト */
55     var $i18n;
56
57     /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト */
58     var $action_form;
59
60     /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト(省略形) */
61     var $af;
62
63     /** @var    object  Ethna_Session       セッションオブジェクト */
64     var $session;
65
66     /**#@-*/
67
68     /**
69      *  Ethna_AppManagerのコンストラクタ
70      *
71      *  @access public
72      *  @param  object  Ethna_Backend   &$backend   backendオブジェクト
73      */
74     function Ethna_AppManager(&$backend)
75     {
76         // 基本オブジェクトの設定
77         $this->backend =& $backend;
78         $this->config =& $backend->getConfig();
79         $this->i18n =& $backend->getI18N();
80         $this->action_form =& $backend->getActionForm();
81         $this->af =& $this->action_form;
82         $this->session =& $backend->getSession();
83
84         $db_list = $backend->getDBList();
85         if (Ethna::isError($db_list) == false) {
86             foreach ($db_list as $elt) {
87                 $varname = $elt['varname'];
88                 $this->$varname =& $elt['db'];
89             }
90         }
91     }
92
93     /**
94      *  属性の一覧を返す
95      *
96      *  @access public
97      *  @param  string  $attr_name  属性の名前(変数名)
98      *  @return array   属性値一覧
99      */
100     function getAttrList($attr_name)
101     {
102         $varname = $attr_name . "_list";
103         return $this->$varname;
104     }
105
106     /**
107      *  属性の表示名を返す
108      *
109      *  @access public
110      *  @param  string  $attr_name  属性の名前(変数名)
111      *  @param  mixed   $id         属性ID
112      *  @return string  属性の表示名
113      */
114     function getAttrName($attr_name, $id)
115     {
116         $varname = $attr_name . "_list";
117         if (is_array($this->$varname) == false) {
118             return null;
119         }
120         $list =& $this->$varname;
121         if (isset($list[$id]) == false) {
122             return null;
123         }
124         return $list[$id]['name'];
125     }
126
127     /**
128      *  属性の表示名(詳細)を返す
129      *
130      *  @access public
131      *  @param  string  $attr_name  属性の名前(変数名)
132      *  @param  mixed   $id         属性ID
133      *  @return string  属性の詳細表示名
134      */
135     function getAttrLongName($attr_name, $id)
136     {
137         $varname = $attr_name . "_list";
138         if (is_array($this->$varname) == false) {
139             return null;
140         }
141         $list =& $this->$varname;
142         if (isset($list[$id]['long_name']) == false) {
143             return null;
144         }
145
146         return $list[$id]['long_name'];
147     }
148
149     /**
150      *  オブジェクトの一覧を返す
151      *
152      *  @access public
153      *  @param  string  $class  Ethna_AppObjectの継承クラス名
154      *  @param  array   $filter     検索条件
155      *  @param  array   $order      検索結果ソート条件
156      *  @param  int     $offset     検索結果取得オフセット
157      *  @param  int     $count      検索結果取得数
158      *  @return mixed   array(0 => 検索条件にマッチした件数, 1 => $offset, $countにより指定された件数のオブジェクトID一覧) Ethna_Error:エラー
159      *  @todo   パフォーマンス対策(1オブジェクトの占有メモリが多い場合)
160      */
161     function getObjectList($class, $filter = null,
162                            $order = null, $offset = null, $count = null)
163     {
164         global $_ETHNA_APP_MANAGER_OL_CACHE;
165
166         $object_list = array();
167         $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
168
169         // キャッシュチェック
170         $cache_class = strtolower($class_name);
171         if (is_array($_ETHNA_APP_MANAGER_OL_CACHE) == false
172             || array_key_exists($cache_class, $_ETHNA_APP_MANAGER_OL_CACHE) == false) {
173             $_ETHNA_APP_MANAGER_OL_CACHE[$cache_class] = array();
174         }
175         $cache_key = serialize(array($filter, $order, $offset, $count));
176         if (array_key_exists($cache_key, $_ETHNA_APP_MANAGER_OL_CACHE[$cache_class])) {
177             list($length, $prop_list)
178                 = $_ETHNA_APP_MANAGER_OL_CACHE[$cache_class][$cache_key];
179         } else {
180             // キャッシュ更新
181             $tmp =& new $class_name($this->backend);
182             list($length, $prop_list)
183                 = $tmp->searchProp(null, $filter, $order, $offset, $count);
184             $_ETHNA_APP_MANAGER_OL_CACHE[$cache_class][$cache_key]
185                 = array($length, $prop_list);
186         }
187
188         foreach ($prop_list as $prop) {
189             $object =& new $class_name($this->backend, null, null, $prop);
190             $object_list[] = $object;
191         }
192
193         return array($length, $object_list);
194     }
195
196     /**
197      *  オブジェクトプロパティの一覧を返す
198      *
199      *  getObjectList()メソッドは条件にマッチするIDを元にEthna_AppObjectを生成する
200      *  ためコストがかかる。こちらはプロパティのみをSELECTするので低コストでデータ
201      *  を取得することが可能。
202      *
203      *  @access public
204      *  @param  string  $class      Ethna_AppObjectの継承クラス名
205      *  @param  array   $keys       取得するプロパティ一覧(nullなら全て)
206      *  @param  array   $filter     検索条件
207      *  @param  array   $order      検索結果ソート条件
208      *  @param  int     $offset     検索結果取得オフセット
209      *  @param  int     $count      検索結果取得数
210      *  @return mixed   array(0 => 検索条件にマッチした件数,
211      *                        1 => $offset, $countにより指定された件数のプロパティ一覧)
212      *                  Ethna_Error:エラー
213      */
214     function getObjectPropList($class, $keys = null, $filter = null,
215                                $order = null, $offset = null, $count = null)
216     {
217         global $_ETHNA_APP_MANAGER_OPL_CACHE;
218
219         $prop_list = array();
220         $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
221
222         // キャッシュチェック
223         $cache_class = strtolower($class_name);
224         if (is_array($_ETHNA_APP_MANAGER_OPL_CACHE) == false
225             || array_key_exists($cache_class, $_ETHNA_APP_MANAGER_OPL_CACHE) == false) {
226             $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class] = array();
227         }
228         $cache_key = serialize(array($filter, $order, $offset, $count));
229         if (array_key_exists($cache_key, $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class])) {
230             // skip
231         } else {
232             // キャッシュ更新
233             $tmp =& new $class_name($this->backend);
234             $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class][$cache_key]
235                 = $tmp->searchProp($keys, $filter, $order, $offset, $count);
236         }
237
238         return $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class][$cache_key];
239     }
240
241     /**
242      *  オブジェクトプロパティを返す
243      *
244      *  getObjectPropList()メソッドの簡易版で、$filterにより結果が1エントリに
245      *  制限される場合(プライマリキーでの検索等)に利用する
246      *
247      *  @access public
248      *  @param  string  $class      Ethna_AppObjectの継承クラス名
249      *  @param  array   $keys       取得するプロパティ一覧
250      *  @param  array   $filter     検索条件
251      *  @return mixed   array:プロパティ一覧 null:エントリなし Ethna_Error:エラー
252      */
253     function getObjectProp($class, $keys = null, $filter = null)
254     {
255         global $_ETHNA_APP_MANAGER_OP_CACHE;
256
257         $prop_list = array();
258         $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
259
260         // キャッシュチェック
261         $cache_class = strtolower($class_name);
262         if (is_array($_ETHNA_APP_MANAGER_OP_CACHE) == false
263             || array_key_exists($cache_class, $_ETHNA_APP_MANAGER_OP_CACHE) == false) {
264             $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class] = array();
265         }
266         $cache_key = serialize(array($filter));
267         if (array_key_exists($cache_key, $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class])) {
268             // skip
269         } else {
270             // キャッシュ更新
271             $tmp =& new $class_name($this->backend);
272             list(, $prop) = $tmp->searchProp($keys, $filter);
273             $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class][$cache_key]
274                 = count($prop) > 0 ? $prop[0] : null;
275         }
276
277         return $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class][$cache_key];
278     }
279 }
280 // }}}