2 // vim: foldmethod=marker
6 * @author Masaki Fujimoto <fujimoto@php.net>
7 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
12 /** アプリケーションオブジェクト状態: 使用可能 */
13 define('OBJECT_STATE_ACTIVE', 0);
14 /** アプリケーションオブジェクト状態: 使用不可 */
15 define('OBJECT_STATE_INACTIVE', 100);
18 /** アプリケーションオブジェクトソートフラグ: 昇順 */
19 define('OBJECT_SORT_ASC', 0);
20 /** アプリケーションオブジェクトソートフラグ: 降順 */
21 define('OBJECT_SORT_DESC', 1);
24 /** アプリケーションオブジェクトインポートオプション: NULLプロパティ無変換 */
25 define('OBJECT_IMPORT_IGNORE_NULL', 1);
27 /** アプリケーションオブジェクトインポートオプション: NULLプロパティ→空文字列変換 */
28 define('OBJECT_IMPORT_CONVERT_NULL', 2);
31 // {{{ Ethna_AppManager
33 * アプリケーションマネージャのベースクラス
35 * @author Masaki Fujimoto <fujimoto@php.net>
39 class Ethna_AppManager
45 /** @var object Ethna_Backend backendオブジェクト */
48 /** @var object Ethna_Config 設定オブジェクト */
51 /** @var object Ethna_DB DBオブジェクト */
54 /** @var object Ethna_I18N i18nオブジェクト */
57 /** @var object Ethna_ActionForm アクションフォームオブジェクト */
60 /** @var object Ethna_ActionForm アクションフォームオブジェクト(省略形) */
63 /** @var object Ethna_Session セッションオブジェクト */
69 * Ethna_AppManagerのコンストラクタ
72 * @param object Ethna_Backend &$backend backendオブジェクト
74 function Ethna_AppManager(&$backend)
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();
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'];
97 * @param string $attr_name 属性の名前(変数名)
100 function getAttrList($attr_name)
102 $varname = $attr_name . "_list";
103 return $this->$varname;
110 * @param string $attr_name 属性の名前(変数名)
111 * @param mixed $id 属性ID
112 * @return string 属性の表示名
114 function getAttrName($attr_name, $id)
116 $varname = $attr_name . "_list";
117 if (is_array($this->$varname) == false) {
120 $list =& $this->$varname;
121 if (isset($list[$id]) == false) {
124 return $list[$id]['name'];
131 * @param string $attr_name 属性の名前(変数名)
132 * @param mixed $id 属性ID
133 * @return string 属性の詳細表示名
135 function getAttrLongName($attr_name, $id)
137 $varname = $attr_name . "_list";
138 if (is_array($this->$varname) == false) {
141 $list =& $this->$varname;
142 if (isset($list[$id]['long_name']) == false) {
146 return $list[$id]['long_name'];
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オブジェクトの占有メモリが多い場合)
161 function getObjectList($class, $filter = null,
162 $order = null, $offset = null, $count = null)
164 global $_ETHNA_APP_MANAGER_OL_CACHE;
166 $object_list = array();
167 $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
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();
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];
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);
188 foreach ($prop_list as $prop) {
189 $object =& new $class_name($this->backend, null, null, $prop);
190 $object_list[] = $object;
193 return array($length, $object_list);
199 * getObjectList()メソッドは条件にマッチするIDを元にEthna_AppObjectを生成する
200 * ためコストがかかる。こちらはプロパティのみをSELECTするので低コストでデータ
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により指定された件数のプロパティ一覧)
214 function getObjectPropList($class, $keys = null, $filter = null,
215 $order = null, $offset = null, $count = null)
217 global $_ETHNA_APP_MANAGER_OPL_CACHE;
219 $prop_list = array();
220 $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
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();
228 $cache_key = serialize(array($filter, $order, $offset, $count));
229 if (array_key_exists($cache_key, $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class])) {
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);
238 return $_ETHNA_APP_MANAGER_OPL_CACHE[$cache_class][$cache_key];
244 * getObjectPropList()メソッドの簡易版で、$filterにより結果が1エントリに
245 * 制限される場合(プライマリキーでの検索等)に利用する
248 * @param string $class Ethna_AppObjectの継承クラス名
249 * @param array $keys 取得するプロパティ一覧
250 * @param array $filter 検索条件
251 * @return mixed array:プロパティ一覧 null:エントリなし Ethna_Error:エラー
253 function getObjectProp($class, $keys = null, $filter = null)
255 global $_ETHNA_APP_MANAGER_OP_CACHE;
257 $prop_list = array();
258 $class_name = sprintf("%s_%s", $this->backend->getAppId(), $class);
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();
266 $cache_key = serialize(array($filter));
267 if (array_key_exists($cache_key, $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class])) {
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;
277 return $_ETHNA_APP_MANAGER_OP_CACHE[$cache_class][$cache_key];