Source for file Ethna_InfoManager.php

Documentation is available at Ethna_InfoManager.php

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4.  *  Ethna_InfoManager.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. // {{{ Ethna_InfoManager
  13. /**
  14.  *  Ethnaマネージャクラス
  15.  *
  16.  *  @author     Masaki Fujimoto <fujimoto@php.net>
  17.  *  @access     public
  18.  *  @package    Ethna
  19.  */
  20. {
  21.     /**#@+
  22.      *  @access private
  23.      */
  24.     
  25.     /** @var    object  Ethna_Controller    コントローラオブジェクト */
  26.     var $ctl;
  27.  
  28.     /** @var    object  Ethna_ClassFactory  クラスファクトリオブジェクト */
  29.     var $class_factory;
  30.  
  31.     /** @var    array   アクションスクリプト解析結果キャッシュファイル */
  32.     var $cache_class_list_file;
  33.  
  34.     /** @var    array   アクションスクリプト解析結果キャッシュ */
  35.     var $cache_class_list;
  36.  
  37.     /** @var    array   [属性]DBタイプ一覧 */
  38.     var $db_type_list = array(
  39.         DB_TYPE_RW      => array('name' => 'DB_TYPE_RW'),
  40.         DB_TYPE_RO      => array('name' => 'DB_TYPE_RO'),
  41.         DB_TYPE_MISC    => array('name' => 'DB_TYPE_MISC'),
  42.     );
  43.  
  44.     /** @var    array   [属性]フォーム型一覧 */
  45.     var $form_type_list;
  46.  
  47.     /** @var    array   [属性]変数型一覧 */
  48.     var $var_type_list;
  49.  
  50.     /**#@-*/
  51.  
  52.     /**
  53.      *  Ethna_InfoManagerのコンストラクタ
  54.      *
  55.      *  @access public
  56.      *  @param  object  Ethna_Backend   &$backend   Ethna_Backendオブジェクト
  57.      */
  58.     function Ethna_InfoManager(&$backend)
  59.     {
  60.         $this->form_type_list = array(
  61.                                     FORM_TYPE_TEXT => array('name' => _et('TextBox')),
  62.                                     FORM_TYPE_PASSWORD  => array('name' => _et('Password')),
  63.                                     FORM_TYPE_TEXTAREA  => array('name' => _et('TextArea')),
  64.                                     FORM_TYPE_SELECT    => array('name' => _et('SelectBox')),
  65.                                     FORM_TYPE_RADIO     => array('name' => _et('RadioButton')),
  66.                                     FORM_TYPE_CHECKBOX  => array('name' => _et('CheckBox')),
  67.                                     FORM_TYPE_SUBMIT    => array('name' => _et('SubmitButton')),
  68.                                     FORM_TYPE_FILE      => array('name' => _et('File')),
  69.                                 );
  70.  
  71.         $this->var_type_list = array(
  72.                                     VAR_TYPE_INT        => array('name' => _et('Integer')),
  73.                                     VAR_TYPE_FLOAT      => array('name' => _et('Float')),
  74.                                     VAR_TYPE_STRING     => array('name' => _et('String')),
  75.                                     VAR_TYPE_DATETIME   => array('name' => _et('Datetime')),
  76.                                     VAR_TYPE_BOOLEAN    => array('name' => _et('Boolean')),
  77.                                     VAR_TYPE_FILE       => array('name' => _et('File')),
  78.                                );
  79.  
  80.         parent::Ethna_AppManager($backend);
  81.         $this->ctl =& Ethna_Controller::getInstance();
  82.         $this->class_factory =& $this->ctl->getClassFactory();
  83.  
  84.         // アクションスクリプト解析結果キャッシュ取得
  85.         $this->cache_class_list_file = sprintf('%s/ethna_info_class_list',
  86.                                                $this->ctl->getDirectory('tmp')
  87.                                        );
  88.         if (file_exists($this->cache_class_list_file)
  89.          && filesize($this->cache_class_list_file) > 0) {
  90.             $fp = fopen($this->cache_class_list_file, 'r');
  91.             $s = fread($fp, filesize($this->cache_class_list_file));
  92.             fclose($fp);
  93.             $this->cache_class_list = unserialize($s);
  94.         }
  95.     }
  96.  
  97.     /**
  98.      *  定義済みアクション一覧を取得する
  99.      *
  100.      *  @access public
  101.      *  @return array   アクション一覧
  102.      */
  103.     function getActionList()
  104.     {
  105.         $r = array();
  106.  
  107.         // アクションスクリプトを解析する
  108.         $class_list = $this->_analyzeActionList();
  109.  
  110.         // アクション定義エントリ一覧
  111.         list($manifest_action_list, $manifest_class_list) = $this->_getActionList_Manifest($class_list);
  112.  
  113.         // アクション定義省略エントリ一覧
  114.         $implicit_action_list = $this->_getActionList_Implicit($class_list, $manifest_action_list, $manifest_class_list);
  115.  
  116.         $r = array_merge($manifest_action_list, $implicit_action_list);
  117.         ksort($r);
  118.  
  119.         // アクション定義情報補完
  120.         $r = $this->_addActionList($r);
  121.  
  122.         return $r;
  123.     }
  124.  
  125.     /**
  126.      *  定義済み遷移先一覧を取得する
  127.      *
  128.      *  @access public
  129.      *  @return array   遷移先一覧
  130.      */
  131.     function getForwardList()
  132.     {
  133.         $r = array();
  134.  
  135.         // テンプレート/ビュースクリプトを解析する
  136.         $forward_list = $this->_analyzeForwardList();
  137.  
  138.         // ビュー定義エントリ一覧
  139.         $manifest_forward_list = $this->_getForwardList_Manifest();
  140.  
  141.         // ビュー定義省略エントリ一覧
  142.         $implicit_forward_list = $this->_getForwardList_Implicit($forward_list, $manifest_forward_list);
  143.  
  144.         $r = array_merge($manifest_forward_list, $implicit_forward_list);
  145.         ksort($r);
  146.  
  147.         return $r;
  148.     }
  149.  
  150.     /**
  151.      *  ディレクトリ以下のアクションスクリプトを解析する
  152.      *
  153.      *  @access private
  154.      *  @param  string  $action_dir     解析対象のディレクトリ
  155.      *  @return array   アクションクラス定義一覧
  156.      */
  157.     function _analyzeActionList($action_dir = null)
  158.     {
  159.         $r = array();
  160.         $cache_update = false;
  161.  
  162.         if (is_null($action_dir)) {
  163.             $cache_update = true;
  164.             $action_dir = $this->ctl->getActiondir();
  165.         }
  166.         $prefix_len = strlen($this->ctl->getActiondir());
  167.  
  168.         $child_dir_list = array();
  169.  
  170.         $dh = opendir($action_dir);
  171.         if ($dh == false) {
  172.             return;
  173.         }
  174.  
  175.         $ext = $this->ctl->getExt('php');
  176.         while (($file = readdir($dh)) !== false) {
  177.             if ($file == "." || $file == "..") {
  178.                 continue;
  179.             }
  180.             $file = $action_dir . $file;
  181.  
  182.             if (is_dir($file)) {
  183.                 $child_dir_list[] = $file;
  184.                 continue;
  185.             }
  186.  
  187.             if (preg_match("/\.$ext\$/", $file) == 0) {
  188.                 continue;
  189.             }
  190.  
  191.             $key = substr($file, $prefix_len);
  192.             
  193.             // キャッシュチェック
  194.             include_once $file;
  195.             if ($this->cache_class_list[$key]['.mtime'] >= filemtime($file)) {
  196.                 $class_list = $this->cache_class_list[$key];
  197.             } else {
  198.                 $class_list = $this->_analyzeActionScript($file);
  199.             }
  200.             if (is_null($class_list) == false) {
  201.                 $r[$key] = $class_list;
  202.             }
  203.         }
  204.  
  205.         closedir($dh);
  206.  
  207.         foreach ($child_dir_list as $child_dir) {
  208.             $tmp = $this->_analyzeActionList($child_dir . "/");
  209.             $r = array_merge($r, $tmp);
  210.         }
  211.  
  212.         if ($cache_update) {
  213.             // キャッシュファイル更新
  214.             $fp = fopen($this->cache_class_list_file, 'w');
  215.             fwrite($fp, serialize($r));
  216.             fclose($fp);
  217.         }
  218.  
  219.         return $r;
  220.     }
  221.  
  222.     /**
  223.      *  アクションスクリプトを解析する
  224.      *
  225.      *  @access private
  226.      *  @param  string  $script ファイル名
  227.      *  @return array   アクションクラス定義一覧
  228.      */
  229.     function _analyzeActionScript($script)
  230.     {
  231.         $class_list = array();
  232.         $class_list['.mtime'] = filemtime($script);
  233.  
  234.         $source = "";
  235.         $fp = fopen($script, 'r');
  236.         if ($fp == false) {
  237.             return null;
  238.         }
  239.         while (feof($fp) == false) {
  240.             $source .= fgets($fp, 8192);
  241.         }
  242.         fclose($fp);
  243.  
  244.         // トークンに分割してクラス定義情報を取得
  245.         $token_list = token_get_all($source);
  246.         $state = 'T_OUT';
  247.         $nest = 0;
  248.         $method_nest = 0;
  249.         $current = null;
  250.         for ($i = 0; $i < count($token_list); $i++) {
  251.             $token = $token_list[$i];
  252.  
  253.             if (is_string($token)) {
  254.                 if ($token == '{') {
  255.                     $nest++;
  256.                 } else if ($token == '}') {
  257.                     $nest--;
  258.                     if ($state == 'T_PREPARE' || $state == 'T_PERFORM') {
  259.                         if ($nest == $method_nest) {
  260.                             $state = 'T_ACTION_CLASS';
  261.                         }
  262.                     } else if ($nest == 0) {
  263.                         $state = 'T_OUT';
  264.                     }
  265.                 }
  266.                 continue;
  267.             }
  268.  
  269.             if ($token[0] == T_CLASS) {
  270.                 // クラス定義開始
  271.                 $i += 2;
  272.                 $class_name = $token_list[$i][1];       // should be T_STRING
  273.                 if ($this->_isSubclassOf($class_name, 'Ethna_ActionClass')) {
  274.                     $state = 'T_ACTION_CLASS';
  275.                     $current = $class_name;
  276.                     $class_list[$current] = array('type' => 'action_class');
  277.                 } else if ($this->_isSubclassOf($class_name, 'Ethna_ActionForm')) {
  278.                     $state = 'T_ACTION_FORM';
  279.                     $current = $class_name;
  280.                     $class_list[$current] = array('type' => 'action_form');
  281.                 }
  282.                 $nest = 0;  // for safe
  283.             } else if ($token[0] == T_COMMENT && strncmp($token[1], "/**", 3) == 0 && is_array($token_list[$i+2]) && $token_list[$i+2][0] == T_CLASS) {
  284.                 // DocComment for class
  285.             } else if ($state == 'T_ACTION_CLASS' && $token[0] == T_FUNCTION) {
  286.                 $i += 2;
  287.                 $method_name = $token_list[$i][1];
  288.                 if (strcasecmp($method_name, 'prepare') == 0) {
  289.                     $state = 'T_PREPARE';
  290.                     $method_nest = $nest;
  291.                 } else if (strcasecmp($method_name, 'perform') == 0) {
  292.                     $state = 'T_PERFORM';
  293.                     $method_nest = $nest;
  294.                 }
  295.             } else if (($state == 'T_PREPARE' || $state == 'T_PERFORM') && $token[0] == T_RETURN) {
  296.                 $s = "";
  297.                 $n = 1;
  298.                 while ($token_list[$i+$n] !== ";") {
  299.                     $s .= is_string($token_list[$i+$n]) ? $token_list[$i+$n] : $token_list[$i+$n][1];
  300.                     $n++;
  301.                 }
  302.                 $key = $state == 'T_PREPARE' ? 'prepare' : 'perform';
  303.                 $class_list[$current]['return'][$key][] = $s;
  304.             }
  305.         }
  306.  
  307.         if (count($class_list) == 0) {
  308.             return null;
  309.         }
  310.         return $class_list;
  311.     }
  312.  
  313.     /**
  314.      *  指定されたクラス名を継承しているかどうかを返す
  315.      *
  316.      *  @access private
  317.      *  @param  string  $class_name     チェック対象のクラス名
  318.      *  @param  string  $parent_name    親クラス名
  319.      *  @return bool    true:継承している false:いない
  320.      */
  321.     function _isSubclassOf($class_name, $parent_name)
  322.     {
  323.         while ($tmp = get_parent_class($class_name)) {
  324.             if (strcasecmp($tmp, $parent_name) == 0) {
  325.                 return true;
  326.             }
  327.             $class_name = $tmp;
  328.         }
  329.         return false;
  330.     }
  331.  
  332.     /**
  333.      *  コントローラに明示的に定義されているアクション一覧を取得する
  334.      *
  335.      *  @access private
  336.      *  @param  array   定義されているクラス一覧
  337.      *  @return array   array(アクション一覧, クラス一覧)
  338.      */
  339.     function _getActionList_Manifest($class_list)
  340.     {
  341.         $manifest_action_list = array();
  342.         $manifest_class_list = array();
  343.         foreach ($this->ctl->action as $action_name => $action) {
  344.             if ($action_name == '__ethna_info__') {
  345.                 continue;
  346.             }
  347.             $action = $this->ctl->_getAction($action_name);
  348.  
  349.             $elt = array();
  350.             // _analyzeActionList()で取得したクラス定義データから対応関係を取得
  351.             foreach ($class_list as $file => $elts) {
  352.                 foreach ($elts as $class_name => $def) {
  353.                     if ($def['type'] == 'action_class' && strcasecmp($class_name, $action['class_name']) == 0) {
  354.                         $elt['action_class'] = $class_name;
  355.                         $elt['action_class_file'] = $file;
  356.                         $elt['action_class_info'] = $def;
  357.                     } else if ($def['type'] == 'action_form' && strcasecmp($class_name, $action['form_name']) == 0) {
  358.                         $elt['action_form'] = $class_name;
  359.                         $elt['action_form_file'] = $file;
  360.                         $elt['action_form_info'] = $def;
  361.                     }
  362.                 }
  363.             }
  364.  
  365.             // 未定義チェック
  366.             if (isset($elt['action_class']) == false) {
  367.                 $elt['action_class'] = $action['class_name'];
  368.                 if (class_exists($action['class_name']) == false) {
  369.                     $elt['action_class_info'] = array('undef' => true);
  370.                 }
  371.             }
  372.             if (isset($elt['action_form']) == false && $action['form_name'] != 'Ethna_ActionForm') {
  373.                 $elt['action_form'] = $action['form_name'];
  374.                 if (class_exists($action['form_name']) == false) {
  375.                     $elt['action_form_info'] = array('undef' => true);
  376.                 }
  377.             }
  378.             $manifest_action_list[$action_name] = $elt;
  379.             $manifest_class_list[] = strtolower($elt['action_class']);
  380.         }
  381.  
  382.         return array($manifest_action_list, $manifest_class_list);
  383.     }
  384.  
  385.     /**
  386.      *  暗黙に定義されているアクション一覧を取得する
  387.      *
  388.      *  @access private
  389.      *  @param  array   $class_list             定義されているクラス一覧
  390.      *  @param  array   $manifest_action_list   明示的に定義済みのアクション一覧
  391.      *  @param  array   $manifest_class_list    明示的に定義済みのクラス一覧
  392.      *  @return array   array:アクション一覧
  393.      */
  394.     function _getActionList_Implicit($class_list, $manifest_action_list, $manifest_class_list)
  395.     {
  396.         $implicit_action_list = array();
  397.  
  398.         foreach ($class_list as $file => $elts) {
  399.             foreach ($elts as $class_name => $def) {
  400.                 if (in_array(strtolower($class_name), $manifest_class_list)) {
  401.                     continue;
  402.                 }
  403.  
  404.                 // クラス名からアクション名を取得
  405.                 if ($def['type'] == 'action_class') {
  406.                     $action_name = $this->ctl->actionClassToName($class_name);
  407.                     if (array_key_exists($action_name, $manifest_action_list)) {
  408.                         continue;
  409.                     }
  410.                     $implicit_action_list[$action_name]['action_class'] = $class_name;
  411.                     $implicit_action_list[$action_name]['action_class_file'] = $file;
  412.                     $implicit_action_list[$action_name]['action_class_info'] = $def;
  413.                 } else if ($def['type'] == 'action_form') {
  414.                     $action_name = $this->ctl->actionFormToName($class_name);
  415.                     if (array_key_exists($action_name, $manifest_action_list)) {
  416.                         continue;
  417.                     }
  418.                     $implicit_action_list[$action_name]['action_form'] = $class_name;
  419.                     $implicit_action_list[$action_name]['action_form_file'] = $file;
  420.                     $implicit_action_list[$action_name]['action_form_info'] = $def;
  421.                 } else {
  422.                     continue;
  423.                 }
  424.             }
  425.         }
  426.  
  427.         return $implicit_action_list;
  428.     }
  429.     
  430.     /**
  431.      *  アクション定義一覧を補完する
  432.      *
  433.      *  @access private
  434.      *  @param  array   $action_list    取得したアクション一覧
  435.      *  @return array   修正後のアクション一覧
  436.      */
  437.     function _addActionList($action_list)
  438.     {
  439.         foreach ($action_list as $action_name => $action) {
  440.             // アクションフォームにフォーム定義情報を追加
  441.             $form_name = $action['action_form'];
  442.             if (class_exists($form_name) == false) {
  443.                 continue;
  444.             }
  445.             $af =& new $form_name($this->ctl);
  446.  
  447.             $form = array();
  448.             foreach ($af->getDef() as $name => $def) {
  449.                 $form[$name]['required'] = $def['required'] ? 'true' : 'false';
  450.                 foreach (array('name', 'max', 'min', 'regexp', 'custom') as $key) {
  451.                     $form[$name][$key] = $def[$key];
  452.                 }
  453.                 $form[$name]['filter'] = str_replace(",", "\n", $def['filter']);
  454.                 $form[$name]['form_type'] = $this->getAttrName('form_type', $def['form_type']);
  455.                 $form[$name]['type_is_array'] = is_array($def['type']);
  456.                 $form[$name]['type'] = $this->getAttrName('var_type', is_array($def['type'])
  457.                                      ? $def['type'][0] : $def['type']);
  458.             }
  459.             $action['action_form_info']['form'] = $form;
  460.             $action_list[$action_name] = $action;
  461.         }
  462.  
  463.         return $action_list;
  464.     }
  465.  
  466.     /**
  467.      *  ディレクトリ以下のテンプレートを解析する
  468.      *
  469.      *  @access private
  470.      *  @param  string  $action_dir     解析対象のディレクトリ
  471.      *  @return array   遷移定義一覧
  472.      */
  473.     function _analyzeForwardList($template_dir = null)
  474.     {
  475.         $r = array();
  476.  
  477.         if (is_null($template_dir)) {
  478.             $template_dir = $this->ctl->getTemplatedir();
  479.         }
  480.         $prefix_len = strlen($this->ctl->getTemplatedir());
  481.  
  482.         $child_dir_list = array();
  483.  
  484.         $dh = opendir($template_dir);
  485.         if ($dh == false) {
  486.             return;
  487.         }
  488.  
  489.         $ext = $this->ctl->getExt('tpl');
  490.         while (($file = readdir($dh)) !== false) {
  491.             if ($file == "." || $file == "..") {
  492.                 continue;
  493.             }
  494.             $file = $template_dir . '/' . $file;
  495.  
  496.             if (is_dir($file)) {
  497.                 $child_dir_list[] = $file;
  498.                 continue;
  499.             }
  500.  
  501.             if (preg_match("/\.$ext\$/", $file) == 0) {
  502.                 continue;
  503.             }
  504.  
  505.             $tpl = substr($file, $prefix_len);
  506.             $r[] = $this->ctl->forwardPathToName($tpl);
  507.         }
  508.  
  509.         closedir($dh);
  510.  
  511.         foreach ($child_dir_list as $child_dir) {
  512.             $tmp = $this->_analyzeForwardList($child_dir);
  513.             $r = array_merge($r, $tmp);
  514.         }
  515.  
  516.         return $r;
  517.     }
  518.  
  519.     /**
  520.      *  コントローラに明示的に定義されている遷移先一覧を取得する
  521.      *
  522.      *  @access private
  523.      *  @return array   ビュー一覧
  524.      */
  525.     function _getForwardList_Manifest()
  526.     {
  527.         $manifest_forward_list = array();
  528.         foreach ($this->ctl->forward as $forward_name => $forward) {
  529.             if ($forward_name == '__ethna_info__') {
  530.                 continue;
  531.             }
  532.  
  533.             $elt = array();
  534.             $elt['template_file'] = $this->ctl->_getForwardPath($forward_name);
  535.             if (file_exists(sprintf("%s/%s", $this->ctl->getTemplatedir(), $elt['template_file'])) == false) {
  536.                 $elt['template_file_info'] = array('undef' => true);
  537.             }
  538.  
  539.             $elt['view_class'] = $this->ctl->getViewClassName($forward_name);
  540.             if ($elt['view_class'] == 'Ethna_ViewClass') {
  541.                 $elt['view_class'] = null;
  542.             } else if (class_exists($elt['view_class']) == false) {
  543.                 $elt['view_class_info'] = array('undef' => true);
  544.             }
  545.  
  546.             if (isset($forward['view_path']) && $forward['view_path']) {
  547.                 $elt['view_path'] = $forward['view_path'];
  548.             } else if ($this->_isSubclassOf($elt['view_class'], 'Ethna_ViewClass')) {
  549.                 $elt['view_class_file'] = $this->ctl->getDefaultViewPath($forward_name);
  550.             } else {
  551.                 foreach ($this->cache_class_list as $file => $elts) {
  552.                     foreach ($elts as $name => $def) {
  553.                         if (strcasecmp($elt['view_class'], $name) == 0) {
  554.                             $elt['view_class_file'] = $file;
  555.                             break 2;
  556.                         }
  557.                     }
  558.                 }
  559.             }
  560.  
  561.             $manifest_forward_list[$forward_name] = $elt;
  562.         }
  563.  
  564.         return $manifest_forward_list;
  565.     }
  566.  
  567.     /**
  568.      *  暗黙に定義されているビュー一覧を取得する
  569.      *
  570.      *  @access private
  571.      *  @param  array   $forward_list           定義されている遷移名一覧
  572.      *  @param  array   $manifest_forward_list  明示的に定義済みのビュー一覧
  573.      *  @return array   array:ビュー一覧
  574.      */
  575.     function _getForwardList_Implicit($forward_list, $manifest_forward_list)
  576.     {
  577.         $implicit_forward_list = array();
  578.         $manifest_forward_name_list = array_keys($manifest_forward_list);
  579.  
  580.         foreach ($forward_list as $forward_name) {
  581.             if (in_array($forward_name, $manifest_forward_name_list)) {
  582.                 continue;
  583.             }
  584.  
  585.             $elt = array();
  586.             $elt['template_file'] = $this->ctl->_getForwardPath($forward_name);
  587.             $elt['view_class'] = $this->ctl->getViewClassName($forward_name);
  588.             if ($elt['view_class'] == 'Ethna_ViewClass') {
  589.                 $elt['view_class'] = null;
  590.             } else if (class_exists($elt['view_class']) == false) {
  591.                 $elt['view_class'] = null;
  592.             } else {
  593.                 $elt['view_class_file'] = $this->ctl->getDefaultViewPath($forward_name);
  594.             }
  595.  
  596.             $implicit_forward_list[$forward_name] = $elt;
  597.         }
  598.  
  599.         return $implicit_forward_list;
  600.     }
  601.  
  602.     /**
  603.      *  Ethnaの設定一覧を取得する
  604.      *
  605.      *  @access public
  606.      *  @return array   設定一覧を格納した配列
  607.      *  @todo   respect access controll
  608.      */
  609.     function getConfiguration()
  610.     {
  611.         $r = array();
  612.  
  613.         // core
  614.         $elts = array();
  615.         $elts[_et('Application ID')] = $this->ctl->getAppId();
  616.         $elts[_et('Application URL')] = $this->ctl->getURL();
  617.         $elts[_et('Ethna Version')] = ETHNA_VERSION;
  618.         $elts[_et('Ethna Base Directory')] = ETHNA_BASE;
  619.         $r['Core'] = $elts;
  620.  
  621.         // class
  622.         $elts = array();
  623.         $elts[_et('Backend')] = $this->class_factory->getObjectName('backend');
  624.         $elts[_et('ClassFactory')] = $this->class_factory->getObjectName('class');
  625.         $elts[_et('Config')] = $this->class_factory->getObjectName('config');
  626.         $elts['DB'] = $this->class_factory->getObjectName('db');
  627.         $elts[_et('Error')] = $this->class_factory->getObjectName('error');
  628.         $elts[_et('Form')] = $this->class_factory->getObjectName('form');
  629.         $elts[_et('Log')] = $this->class_factory->getObjectName('logger');
  630.         $elts['i18n'] = $this->class_factory->getObjectName('i18n');
  631.         $elts[_et('Plugin')] = $this->class_factory->getObjectName('plugin');
  632.         $elts[_et('Session')] = $this->class_factory->getObjectName('session');
  633.         $elts['SQL'] = $this->class_factory->getObjectName('sql');
  634.         $elts[_et('View')] = $this->class_factory->getObjectName('view');
  635.         $r[_et('Class')] = $elts;
  636.  
  637.         // DB
  638.         $elts = array();
  639.         $db_list = array();
  640.         foreach ($this->ctl->db as $key => $db) {
  641.             if ($key == "") {
  642.                 $tmp = '$db';
  643.             } else {
  644.                 $tmp = sprintf('$db_%s', $key);
  645.             }
  646.             $elts[$tmp] = $this->getAttrName('db_type', $db);
  647.             $db_list[$key] = $tmp;
  648.         }
  649.         $r[_et('DB Type')] = $elts;
  650.  
  651.         // DSN
  652.         $elts = array();
  653.         foreach ($db_list as $key => $name) {
  654.             $config_key = "dsn";
  655.             if ($key != "") {
  656.                 $config_key .= "_$key";
  657.             }
  658.             $dsn = $this->config->get($config_key);
  659.             if ($dsn) {
  660.                 $elts[$name] = implode("\n", to_array($dsn));
  661.             }
  662.         }
  663.         $r['DSN'] = $elts;
  664.  
  665.         // directory
  666.         $elts = array();
  667.         $elts[_et('Application')] = $this->ctl->getBasedir();
  668.         $elts[_et('Action')] = $this->ctl->getActiondir();
  669.         $elts[_et('View')] = $this->ctl->getViewdir();
  670.         $elts[_et('Filter')] = $this->ctl->getDirectory('filter');
  671.         $elts[_et('Plugin')] = $this->ctl->getDirectory('plugin');
  672.         $elts[_et('Template')] = $this->ctl->getTemplatedir();
  673.         $elts[_et('Template Cache')] = $this->ctl->getDirectory('template_c');
  674.         $elts[_et('Smarty Plugin')] = implode(',', $this->ctl->getDirectory('plugins'));
  675.         $elts[_et('Configuration File')] = $this->ctl->getDirectory('etc');
  676.         $elts[_et('Locale')] = $this->ctl->getDirectory('locale');
  677.         $elts[_et('Logging')] = $this->ctl->getDirectory('log');
  678.         $elts[_et('Temporary File')] = $this->ctl->getDirectory('tmp');
  679.         $r[_et('Directory')] = $elts;
  680.  
  681.         // ext
  682.         $elts = array();
  683.         $elts[_et('Template')] = $this->ctl->getExt('tpl');
  684.         $elts[_et('PHP Script')] = $this->ctl->getExt('php');
  685.         $r[_et('File Extention')] = $elts;
  686.  
  687.         // filter
  688.         $elts = array();
  689.         $n = 1;
  690.         foreach ($this->ctl->filter as $filter) {
  691.             $key = sprintf(_et('Filter(%d)'), $n);
  692.             if (class_exists($filter)) {
  693.                 $elts[$key] = $filter;
  694.                 $n++;
  695.             }
  696.         }
  697.         $r[_et('Filter')] = $elts;
  698.  
  699.         // manager
  700.         $elts = array();
  701.         foreach ($this->ctl->getManagerList() as $key => $manager) {
  702.             $name = sprintf('$%s', $key);
  703.             $elts[$name] = $this->ctl->getManagerClassName($manager);
  704.         }
  705.         $r[_et('Application Manager')] = $elts;
  706.  
  707.         return $r;
  708.     }
  709.  
  710.     /**
  711.      *  プラグインの一覧を取得する
  712.      *
  713.      *  @access public
  714.      *  @return array   設定一覧を格納した配列
  715.      *  @todo   respect access controll
  716.      */
  717.     function getPluginList()
  718.     {
  719.         $r = array();
  720.         $plugin = $this->ctl->getPlugin();
  721.         foreach ($plugin->searchAllPluginType() as $type) {
  722.             $plugin->searchAllPluginSrc($type);
  723.             if (isset($plugin->src_registry[$type])) {
  724.                 $elts = array();
  725.                 foreach ($plugin->src_registry[$type] as $name => $src) {
  726.                     if (empty($src)) {
  727.                         continue;
  728.                     }
  729.                     $elts[$name] = $src[2];
  730.                 }
  731.                 ksort($elts);
  732.                 $r[$type] = $elts;
  733.             }
  734.         }
  735.         ksort($r);
  736.         return $r;
  737.     }
  738. }
  739. // }}}
  740.  
  741. ?>

Documentation generated on Fri, 11 Nov 2011 03:59:51 +0900 by phpDocumentor 1.4.3