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

Documentation generated on Thu, 08 May 2008 00:14:54 +0900 by phpDocumentor 1.4.2