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_file0{
  90.             $fp fopen($this->cache_class_list_file'r');
  91.             $s fread($fpfilesize($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($fpserialize($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($fp8192);
  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[$currentarray('type' => 'action_class');
  277.                 else if ($this->_isSubclassOf($class_name'Ethna_ActionForm')) {
  278.                     $state 'T_ACTION_FORM';
  279.                     $current $class_name;
  280.                     $class_list[$currentarray('type' => 'action_form');
  281.                 }
  282.                 $nest 0;  // for safe
  283.             else if ($token[0== T_COMMENT && strncmp($token[1]"/**"3== && 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[$nameimplode("\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[$typeas $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