Changeset 1635

Show
Ignore:
Timestamp:
02/04/07 00:36:48 (22 months ago)
Author:
david
Message:

finally: caching. one config file per action, definitions can be specific to one or more request-method, each definition can contain settings specific to one or more output types, groups (like in smarty, multiple sources like string, locale, request param etc), cache TTL ('2 days 4 hours'), caching can be controlled on a per layer level, slots can be included in the cache, action attribs, template vars and request attribs (yes, with namespace) can be restored, restrictable to certain views, closes #78. also did some minor fixes here and there, added slots to sample app.

Location:
branches/0.11
Files:
6 added
1 removed
16 modified

Legend:

Unmodified
Added
Removed
  • branches/0.11/samples/app/config/output_types.xml

    r1621 r1635  
    11<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    22<configurations xmlns:xi="http://www.w3.org/2001/XInclude"> 
     3 
     4  <sandbox> 
     5 
     6    <renderers default="php"> 
     7      <renderer name="php" class="AgaviPhpRenderer"> 
     8        <parameter name="assigns"> 
     9          <parameter name="routing">ro</parameter> 
     10          <parameter name="request">rq</parameter> 
     11          <parameter name="controller">ct</parameter> 
     12          <parameter name="user">us</parameter> 
     13          <parameter name="translation_manager">tm</parameter> 
     14          <parameter name="request_data">rd</parameter> 
     15        </parameter> 
     16      </renderer> 
     17    </renderers> 
     18     
     19    <layouts default="default"> 
     20       
     21      <layout name="default"> 
     22        <layer name="content" class="AgaviFileTemplateLayer" /> 
     23        <layer name="decorator" class="AgaviFileTemplateLayer"> 
     24          <slot name="menu" module="Default" action="Menu" /> 
     25          <parameter name="template">Master</parameter> 
     26        </layer> 
     27      </layout> 
     28       
     29      <layout name="slot"> 
     30        <layer name="content" class="AgaviFileTemplateLayer" /> 
     31      </layout> 
     32    </layouts> 
     33 
     34  </sandbox> 
    335 
    436  <configuration context="web"> 
     
    638 
    739      <output_type name="html"> 
    8         <renderers default="php"> 
    9           <renderer name="php" class="AgaviPhpRenderer"> 
    10             <parameters> 
    11               <parameter name="assigns"> 
    12                 <parameters> 
    13                   <parameter name="routing">ro</parameter> 
    14                   <parameter name="request">rq</parameter> 
    15                   <parameter name="controller">ct</parameter> 
    16                   <parameter name="user">us</parameter> 
    17                   <parameter name="translation_manager">tm</parameter> 
    18                   <parameter name="request_data">rd</parameter> 
    19                 </parameters> 
    20               </parameter> 
    21             </parameters> 
    22           </renderer> 
    23         </renderers> 
    24         <layouts default="default"> 
    25           <layout name="default"> 
    26             <layers> 
    27               <layer name="content" class="AgaviFileTemplateLayer" /> 
    28               <layer name="decorator" class="AgaviFileTemplateLayer"> 
    29                 <parameters> 
    30                   <parameter name="template">Master</parameter> 
    31                 </parameters> 
    32               </layer> 
    33             </layers> 
    34           </layout> 
    35         </layouts> 
    36         <parameters> 
    37           <parameter name="Content-Type">text/html; charset=UTF-8</parameter> 
    38         </parameters> 
     40        <xi:include href="#xpointer(/configurations/sandbox/renderers)" /> 
     41        <xi:include href="#xpointer(/configurations/sandbox/layouts)" /> 
     42         
     43        <parameter name="Content-Type">text/html; charset=UTF-8</parameter> 
    3944      </output_type> 
    4045 
    4146      <output_type name="xhtml"> 
    42         <xi:include href="#xpointer(//configurations/configuration[@context='web']/output_types/output_type[@name='html']/renderers)" /> 
    43         <xi:include href="#xpointer(//configurations/configuration[@context='web']/output_types/output_type[@name='html']/layouts)" /> 
    44         <parameters> 
    45           <parameter name="Content-Type">application/xhtml+xml; charset=UTF-8</parameter> 
    46         </parameters> 
     47        <xi:include href="#xpointer(/configurations/sandbox/renderers)" /> 
     48        <xi:include href="#xpointer(/configurations/sandbox/layouts)" /> 
     49         
     50        <parameter name="Content-Type">application/xhtml+xml; charset=UTF-8</parameter> 
    4751      </output_type> 
    4852 
     
    5458 
    5559      <output_type name="xmlrpc"> 
    56         <parameters> 
    57           <parameter name="encoding">UTF-8</parameter> 
    58         </parameters> 
     60        <parameter name="encoding">UTF-8</parameter> 
    5961      </output_type> 
    6062 
  • branches/0.11/samples/app/modules/Default/lib/view/AgaviSampleAppDefaultBaseView.class.php

    r1610 r1635  
    1717  } 
    1818 
    19   public function setupHtml(AgaviRequestDataHolder $rd) 
     19  public function setupHtml(AgaviRequestDataHolder $rd, $layout = null) 
    2020  { 
    21     $this->loadLayout(); 
     21    $this->loadLayout($layout); 
    2222 
    2323    // also set a default title just to avoid warnings 
  • branches/0.11/samples/app/modules/Default/templates/Master.php

    r1610 r1635  
    156156<p class="runin"><?php echo $tm->_d($tm->createCalendar()); ?>.<?php if($us->isAuthenticated()): ?> <?php echo $tm->_('You are logged in.', 'default.layout'); ?> <a href="<?php echo $ro->gen('logout'); ?>"><?php echo $tm->_('Log Out', 'default.layout'); ?></a><?php endif; ?></p> 
    157157    <div id="menu"> 
    158       <h3><?php echo $tm->_('Menu', 'default.layout'); ?></h3> 
    159       <ul> 
    160         <li><a href="<?php echo $ro->gen('index'); ?>"><?php echo $tm->_('Home', 'default.menu'); ?></a></li> 
    161 <?php if(!$us->isAuthenticated()): ?> 
    162         <li><a href="<?php echo $ro->gen('login'); ?>"><?php echo $tm->_('Login', 'default.menu'); ?></a></li> 
    163 <?php endif; ?> 
    164         <li><a href="<?php echo $ro->gen('secure'); ?>"><?php echo $tm->_('A Secure Action', 'default.menu'); ?></a></li> 
    165         <li><a href="<?php echo $ro->gen('secure2'); ?>"><?php echo $tm->_('Another Secure Action', 'default.menu'); ?></a></li> 
    166         <li><a href="<?php echo $ro->gen('asdjashdasd'); ?>" onclick="return alert('<?php echo $tm->_('You will now be redirected to an invalid URL. If no rewrite rules are in place, this means you will see a standard 404 page of your web server, unless you configured an ErrorDocument 404 or some similar setting. If rewrite rules are in place (i.e. no index.php part in the URL), you will be shown the Agavi 404 document. This is correct and expected behavior.', 'default.menu'); ?>');"><?php echo $tm->_('Call invalid URL', 'default.menu'); ?></a></li> 
    167         <li><a href="<?php echo $ro->gen('disabled'); ?>"><?php echo $tm->_('Try Disabled Module', 'default.menu'); ?></a></li> 
    168         <li><a href="<?php echo $ro->gen('search_engine_spam', array('name' => $products[array_rand($products = array('nonsense', 'chainsaws', 'brains', 'viagra', 'mad coding skills'))], 'id' => 4815162342)); ?>"><?php echo $tm->_('Search Engine Spam', 'default.menu'); ?></a></li> 
    169       </ul> 
     158<?php echo $slots['menu']; ?> 
    170159    </div> 
    171160    <div id="content"> 
  • branches/0.11/samples/app/modules/Default/templates/SearchEngineSpamSuccess.php

    r1133 r1635  
    1010  </tr> 
    1111</table> 
     12 
     13<?=time()?> 
  • branches/0.11/samples/app/modules/Default/views/LoginInputView.class.php

    r1610 r1635  
    2727  { 
    2828    parent::setupHtml($rd); 
     29    $this->getLayer('decorator')->removeSlot('foo'); 
    2930 
    3031    // set the title 
  • branches/0.11/src/config/defaults/autoload.xml

    r1617 r1635  
    3838 
    3939      <!-- agavi/config --> 
     40      <autoload name="AgaviCachingConfigHandler">%core.agavi_dir%/config/AgaviCachingConfigHandler.class.php</autoload> 
    4041      <autoload name="AgaviCompileConfigHandler">%core.agavi_dir%/config/AgaviCompileConfigHandler.class.php</autoload> 
    4142      <autoload name="AgaviDatabaseConfigHandler">%core.agavi_dir%/config/AgaviDatabaseConfigHandler.class.php</autoload> 
  • branches/0.11/src/config/defaults/config_handlers.xml

    r1568 r1635  
    136136      <handler pattern="%core.module_dir%/*/validate/*.xml" class="AgaviValidatorConfigHandler" validate="%core.agavi_dir%/config/xsd/validators.xsd" /> 
    137137 
     138      <handler pattern="%core.module_dir%/*/cache/*.xml" class="AgaviCachingConfigHandler" validate="%core.agavi_dir%/config/xsd/caching.xsd" /> 
     139 
    138140      <handler pattern="%core.cldr_dir%/locales/*.xml" class="AgaviLdmlConfigHandler" /> 
    139141      <handler pattern="%core.cldr_dir%/supplementalData.xml" class="AgaviLdmlSupplementalConfigHandler" /> 
  • branches/0.11/src/config/xsd/caching.xsd

    r908 r1635  
    11<?xml version="1.0" encoding="utf-8"?> 
    22<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     3 
     4  <xs:include schemaLocation="default_tags.xsd"/>   
     5 
    36  <xs:element name="configurations" type="configurations" /> 
    47  <xs:complexType name="configurations"> 
    58    <xs:sequence> 
     9      <xs:element name="sandbox" type="sandbox" minOccurs="0" /> 
    610      <xs:element name="configuration" minOccurs="0" maxOccurs="unbounded"> 
    711        <xs:complexType> 
    812          <xs:sequence> 
    9             <xs:element name="cachings" type="cachings" /> 
     13            <xs:group ref="cachings" /> 
    1014          </xs:sequence> 
    1115          <xs:attribute name="environment" type="xs:string" /> 
     
    1620    <xs:attribute name="parent" type="xs:string" /> 
    1721  </xs:complexType> 
     22 
     23  <xs:group name="cachings"> 
     24    <xs:choice> 
     25      <xs:element name="cachings" type="cachings" minOccurs="0" /> 
     26      <xs:element name="caching" type="caching" minOccurs="0" maxOccurs="unbounded"/> 
     27    </xs:choice> 
     28  </xs:group> 
    1829  <xs:complexType name="cachings"> 
    1930    <xs:sequence> 
     
    2233  </xs:complexType> 
    2334  <xs:complexType name="caching"> 
     35    <xs:sequence maxOccurs="unbounded"> 
     36      <xs:group ref="groups" /> 
     37      <xs:group ref="views" /> 
     38      <xs:group ref="action_attributes" /> 
     39      <xs:group ref="output_types" /> 
     40    </xs:sequence> 
     41    <xs:attribute name="method" type="php_label" /> 
     42    <xs:attribute name="enabled" type="xs:boolean" /> 
     43    <xs:attribute name="lifetime" type="xs:string" /> 
     44  </xs:complexType> 
     45   
     46  <xs:group name="groups"> 
     47    <xs:choice> 
     48      <xs:element name="groups" type="groups" minOccurs="0" /> 
     49      <xs:element name="group" type="group" minOccurs="0" maxOccurs="unbounded"/> 
     50    </xs:choice> 
     51  </xs:group> 
     52  <xs:complexType name="groups"> 
    2453    <xs:sequence> 
    25       <xs:element name="groups"> 
    26         <xs:complexType> 
    27           <xs:sequence> 
    28             <xs:element name="group" maxOccurs="unbounded"> 
    29               <xs:complexType> 
    30                 <xs:sequence> 
    31                 </xs:sequence> 
    32                 <xs:attribute name="name" type="xs:string" use="required" /> 
    33                 <xs:attribute name="source" type="xs:string" /> 
    34               </xs:complexType> 
    35             </xs:element> 
    36           </xs:sequence> 
    37         </xs:complexType> 
    38       </xs:element> 
    39       <xs:element name="decorator"> 
    40         <xs:complexType> 
    41           <xs:sequence> 
    42             <xs:element name="slots"> 
    43               <xs:complexType> 
    44                 <xs:sequence> 
    45                   <xs:element name="slot" type="xs:string" maxOccurs="unbounded" /> 
    46                 </xs:sequence> 
    47               </xs:complexType> 
    48             </xs:element> 
    49             <xs:element name="variables"> 
    50               <xs:complexType> 
    51                 <xs:sequence> 
    52                   <xs:element name="variable" type="xs:string" maxOccurs="unbounded" /> 
    53                 </xs:sequence> 
    54               </xs:complexType> 
    55             </xs:element> 
    56           </xs:sequence> 
    57           <xs:attribute name="include" type="xs:string" /> 
    58         </xs:complexType> 
    59       </xs:element> 
    60       <xs:element name="views"> 
    61         <xs:complexType> 
    62           <xs:sequence> 
    63             <xs:element name="whitelists"> 
    64               <xs:complexType> 
    65                 <xs:sequence> 
    66                   <xs:element name="whitelist" type="xs:string" maxOccurs="unbounded" /> 
    67                 </xs:sequence> 
    68               </xs:complexType> 
    69             </xs:element> 
    70           </xs:sequence> 
    71         </xs:complexType> 
    72       </xs:element> 
    73       <xs:element name="variables"> 
    74         <xs:complexType> 
    75           <xs:sequence> 
    76             <xs:element name="variable" maxOccurs="unbounded"> 
    77               <xs:complexType> 
    78                 <xs:sequence> 
    79                 </xs:sequence> 
    80                 <xs:attribute name="source" type="xs:string" /> 
    81                 <xs:attribute name="name" type="xs:string" /> 
    82               </xs:complexType> 
    83             </xs:element> 
    84           </xs:sequence> 
    85         </xs:complexType> 
    86       </xs:element> 
     54      <xs:element name="group" type="group" maxOccurs="unbounded" /> 
     55    </xs:sequence> 
     56  </xs:complexType> 
     57  <xs:complexType name="group"> 
     58    <xs:simpleContent> 
     59      <xs:extension base="xs:string"> 
     60        <xs:attribute name="source" type="xs:string" /> 
     61        <xs:attribute name="namespace" type="xs:string" /> 
     62      </xs:extension> 
     63    </xs:simpleContent> 
     64  </xs:complexType> 
     65 
     66  <xs:group name="action_attributes"> 
     67    <xs:choice> 
     68      <xs:element name="action_attributes" type="action_attributes" minOccurs="0" /> 
     69      <xs:element name="action_attribute" type="action_attribute" minOccurs="0" maxOccurs="unbounded"/> 
     70    </xs:choice> 
     71  </xs:group> 
     72  <xs:complexType name="action_attributes"> 
     73    <xs:sequence> 
     74      <xs:element name="action_attribute" type="action_attribute" minOccurs="0" maxOccurs="unbounded" /> 
     75    </xs:sequence> 
     76  </xs:complexType> 
     77  <xs:complexType name="action_attribute"> 
     78    <xs:sequence> 
     79      <xs:element name="action_attribute" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
     80    </xs:sequence> 
     81  </xs:complexType> 
     82 
     83  <xs:group name="views"> 
     84    <xs:choice> 
     85      <xs:element name="views" type="views" minOccurs="0" /> 
     86      <xs:element name="view" type="view" minOccurs="0" maxOccurs="unbounded"/> 
     87    </xs:choice> 
     88  </xs:group> 
     89  <xs:complexType name="views"> 
     90    <xs:sequence> 
     91      <xs:element name="view" type="view" minOccurs="0" maxOccurs="unbounded" /> 
     92    </xs:sequence> 
     93  </xs:complexType> 
     94  <xs:complexType name="view"> 
     95    <xs:simpleContent> 
     96      <xs:extension base="xs:string"> 
     97        <xs:attribute name="module" type="php_label" /> 
     98      </xs:extension> 
     99    </xs:simpleContent> 
     100  </xs:complexType> 
     101 
     102  <xs:group name="output_types"> 
     103    <xs:choice> 
     104      <xs:element name="output_types" type="output_types" minOccurs="0" /> 
     105      <xs:element name="output_type" type="output_type" minOccurs="0" maxOccurs="unbounded"/> 
     106    </xs:choice> 
     107  </xs:group> 
     108  <xs:complexType name="output_types"> 
     109    <xs:sequence> 
     110      <xs:element name="output_type" type="output_type" maxOccurs="unbounded" /> 
     111    </xs:sequence> 
     112  </xs:complexType> 
     113  <xs:complexType name="output_type"> 
     114    <xs:sequence maxOccurs="unbounded"> 
     115      <xs:group ref="request_attributes" /> 
     116      <xs:group ref="template_variables" /> 
     117      <xs:group ref="layers" /> 
     118    </xs:sequence> 
     119    <xs:attribute name="name" type="php_label" /> 
     120  </xs:complexType> 
     121 
     122  <xs:group name="request_attributes"> 
     123    <xs:choice> 
     124      <xs:element name="request_attributes" type="request_attributes" minOccurs="0" /> 
     125      <xs:element name="request_attribute" type="request_attribute" minOccurs="0" maxOccurs="unbounded"/> 
     126    </xs:choice> 
     127  </xs:group> 
     128  <xs:complexType name="request_attributes"> 
     129    <xs:sequence> 
     130      <xs:element name="request_attribute" type="request_attribute" maxOccurs="unbounded" /> 
     131    </xs:sequence> 
     132  </xs:complexType> 
     133  <xs:complexType name="request_attribute"> 
     134    <xs:simpleContent> 
     135      <xs:extension base="xs:string"> 
     136        <xs:attribute name="namespace" type="xs:string" /> 
     137      </xs:extension> 
     138    </xs:simpleContent> 
     139  </xs:complexType> 
     140 
     141  <xs:group name="template_variables"> 
     142    <xs:choice> 
     143      <xs:element name="template_variables" type="template_variables" minOccurs="0" /> 
     144      <xs:element name="template_variable" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
     145    </xs:choice> 
     146  </xs:group> 
     147  <xs:complexType name="template_variables"> 
     148    <xs:sequence> 
     149      <xs:element name="template_variable" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
     150    </xs:sequence> 
     151  </xs:complexType> 
     152 
     153  <xs:group name="layers"> 
     154    <xs:choice> 
     155      <xs:element name="layers" type="layers" minOccurs="0" /> 
     156      <xs:element name="layer" type="layer" minOccurs="0" maxOccurs="unbounded"/> 
     157    </xs:choice> 
     158  </xs:group> 
     159  <xs:complexType name="layers"> 
     160    <xs:sequence> 
     161      <xs:element name="layer" type="layer" maxOccurs="unbounded" /> 
     162    </xs:sequence> 
     163  </xs:complexType> 
     164  <xs:complexType name="layer"> 
     165    <xs:sequence maxOccurs="unbounded"> 
     166      <xs:group ref="slots" /> 
    87167    </xs:sequence> 
    88168    <xs:attribute name="name" type="xs:string" use="required" /> 
    89     <xs:attribute name="enabled" type="xs:string" /> 
     169    <xs:attribute name="include" type="xs:string" /> 
    90170  </xs:complexType> 
     171 
     172  <xs:group name="slots"> 
     173    <xs:choice> 
     174      <xs:element name="slots" type="slots" minOccurs="0" /> 
     175      <xs:element name="slot" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
     176    </xs:choice> 
     177  </xs:group> 
     178  <xs:complexType name="slots"> 
     179    <xs:sequence> 
     180      <xs:element name="slot" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
     181    </xs:sequence> 
     182  </xs:complexType> 
     183 
    91184</xs:schema> 
  • branches/0.11/src/controller/AgaviExecutionContainer.class.php

    r1568 r1635  
    9090   
    9191  /** 
     92   * Pre-serialization callback. 
     93   * 
     94   * Will set the name of the context instead of the instance, and the name of 
     95   * the output type instead of the instance. Both will be restored by __wakeup 
     96   * 
     97   * @author     David Zuelke <dz@bitxtender.com> 
     98   * @since      0.11.0 
     99   */ 
     100  public function __sleep() 
     101  { 
     102    $this->contextName = $this->context->getName(); 
     103    $this->outputTypeName = $this->outputType->getName(); 
     104    $arr = get_object_vars($this); 
     105    unset($arr['context'], $arr['outputType']); 
     106    return array_keys($arr); 
     107  } 
     108   
     109  /** 
     110   * Post-unserialization callback. 
     111   * 
     112   * Will restore the context and output type instances based on their names set 
     113   * by __sleep. 
     114   * 
     115   * @author     David Zuelke <dz@bitxtender.com> 
     116   * @since      0.11.0 
     117   */ 
     118  public function __wakeup() 
     119  { 
     120    $this->context = AgaviContext::getInstance($this->contextName); 
     121    $this->outputType = $this->context->getController()->getOutputType($this->outputTypeName); 
     122    unset($this->contextName, $this->outputTypeName); 
     123  } 
     124   
     125  /** 
    92126   * Initialize the container. This will create a response instance. 
    93127   * 
     
    105139     
    106140    $this->parameters = $parameters; 
    107      
    108     // create a new response instance for this action 
    109     $rfi = $this->context->getFactoryInfo('response'); 
    110     $this->response = new $rfi['class']; 
    111     $this->response->initialize($this->context, $rfi['parameters']); 
    112141  } 
    113142   
  • branches/0.11/src/filter/AgaviExecutionFilter.class.php

    r1621 r1635  
    8686      $group = base64_encode($group); 
    8787    } 
    88     return include(AgaviConfig::get('core.cache_dir') . DIRECTORY_SEPARATOR . self::CACHE_SUBDIR . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $groups) . '.cefcache'); 
     88    return unserialize(file_get_contents(AgaviConfig::get('core.cache_dir') . DIRECTORY_SEPARATOR . self::CACHE_SUBDIR . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $groups) . '.cefcache')); 
    8989  } 
    9090 
     
    106106    } 
    107107    @mkdir(AgaviConfig::get('core.cache_dir') . DIRECTORY_SEPARATOR  . self::CACHE_SUBDIR . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR , array_slice($groups, 0, -1)), 0777, true); 
    108     return file_put_contents(AgaviConfig::get('core.cache_dir') . DIRECTORY_SEPARATOR . self::CACHE_SUBDIR . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $groups) . '.cefcache', '<' . '?' . 'php return ' . var_export($data, true) . ';'); 
     108    return file_put_contents(AgaviConfig::get('core.cache_dir') . DIRECTORY_SEPARATOR . self::CACHE_SUBDIR . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $groups) . '.cefcache', serialize($data)); 
    109109  } 
    110110 
     
    131131 
    132132  /** 
    133    * Builds an array of cache groups 
    134    * 
    135    * @param      array  The configuration 
    136    * @param      string The Action's Module name 
    137    * @param      string The Action's name 
    138    * 
    139    * @return     array An array of groups 
     133   * Builds an array of cache groups using the configuration and a container. 
     134   * 
     135   * @param      array                   The group array from the configuration. 
     136   * @param      AgaviExecutionContainer The execution container. 
     137   * 
     138   * @return     array An array of groups. 
    140139   * 
    141140   * @author     David Zuelke <dz@bitxtender.com> 
    142141   * @since      0.11.0 
    143142   */ 
    144   public function determineGroups(array $cfg, $moduleName, $actionName) 
    145   { 
    146     $groups = array(); 
    147  
    148     if(isset($cfg['groups'])) { 
    149       foreach($cfg['groups'] as $group) { 
    150         $group += array('name' => null, 'source' => null, 'namespace' => null); 
    151         $val = $this->getVariable($group['name'], $group['source'], $group['namespace']); 
    152         if($val === null) { 
    153           $val = "0"; 
    154         } 
    155         $groups[] = $val; 
    156       } 
    157     } 
    158  
    159     $groups[] = $moduleName . '_' . $actionName; 
    160  
    161     return $groups; 
     143  public function determineGroups(array $groups, $container) 
     144  { 
     145    $retval = array(); 
     146     
     147    foreach($groups as $group) { 
     148      $group += array('name' => null, 'source' => null, 'namespace' => null); 
     149      $val = $this->getVariable($group['name'], $group['source'], $group['namespace']); 
     150      if($val === null) { 
     151        $val = "0"; 
     152      } 
     153      $retval[] = $val; 
     154    } 
     155     
     156    $retval[] = $container->getModuleName() . '_' . $container->getActionName(); 
     157     
     158    return $retval; 
    162159  } 
    163160   
     
    171168        $val = $this->context->getTranslationManager()->getCurrentLocaleIdentifier(); 
    172169        break; 
    173       case 'requestParameter': 
    174         $val = $this->context->getRequest()->getParameter($name); 
    175         break; 
    176       case 'requestAttribute': 
     170      case 'request_parameter': 
     171        $val = $this->context->getRequest()->getRequestData()->getParameter($name); 
     172        break; 
     173      case 'request_attribute': 
    177174        $val = $this->context->getRequest()->getAttribute($name, $namespace); 
    178175        break; 
    179       case 'userParameter': 
     176      case 'user_parameter': 
    180177        $val = $this->context->getUser()->getParameter($name); 
    181178        break; 
    182       case 'userAttribute': 
     179      case 'user_attribute': 
    183180        $val = $this->context->getUser()->getAttribute($name, $namespace); 
    184181        break; 
    185       case 'userCredential': 
     182      case 'user_credential': 
    186183        $val = $this->context->getUser()->hasCredential($name); 
    187184        break; 
     
    209206  public function execute(AgaviFilterChain $filterChain, AgaviExecutionContainer $container) 
    210207  { 
    211     $response = $container->getResponse(); 
    212      
    213208    $lm = $this->context->getLoggerManager(); 
    214209    // get the context, controller and validator manager 
    215210    $controller = $this->context->getController(); 
    216  
     211     
    217212    // get the current action information 
    218213    $actionName = $container->getActionName(); 
    219214    $moduleName = $container->getModuleName(); 
    220  
     215     
    221216    $request = $this->context->getRequest(); 
    222  
     217     
    223218    $isCacheable = false;