Source for file InfoManager.php

Documentation is available at InfoManager.php

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

Documentation generated on Fri, 11 Nov 2011 03:58:26 +0900 by phpDocumentor 1.4.3