/** * Test for issue #12285 * Variables set by functions handled by eZObjectForwarder (like attribute_view_gui) are not scope safe. * The patch for this issue ensures that, if requested, a template variable can be backed up in a safe namespace * (same var name but different namespace), so that it can't be overridden * @param string $varName * @param string $val * @param string $namespace * @link http://issues.ez.no/12285 * @group issue12285 */ public function testSetScopeSafeVariable() { $namespace = "myNamespace"; $varName = "foo"; $aVal = array( "bar", "baz", "biz" ); // Simulate 3 level of nesting $previousVal = null; $nestingLevel = 0; // Try to set different values to a tpl variable to emulate a nested set like described in the issue foreach ( $aVal as $val ) { $this->tpl->setVariable( $varName, $val, $namespace, true ); self::assertEquals( $val, $this->tpl->variable( $varName, $namespace ), "Template variable has not been correctly set" ); if ( !empty( $previousVal ) ) { $safeNamespace = $namespace . str_repeat( ":safe", $nestingLevel ); self::assertEquals( $previousVal, $this->tpl->variable( $varName, $safeNamespace ), "Template variable has not been backed up in a safe namespace" ); } $previousVal = $val; $nestingLevel++; } // Now unset the tpl variables and check that they are well restored $aUnsetVal = array_reverse( $aVal ); // Nesting level must decrease to 0, so decrease it first $nestingLevel -= 1; foreach ( $aUnsetVal as $val ) { $safeNamespace = $namespace . str_repeat( ":safe", $nestingLevel ); $this->tpl->unsetVariable( $varName, $namespace ); self::assertNull( $this->tpl->variable( $varName, $safeNamespace ), "Backed up tpl variable has not been deleted" ); $nestingLevel--; // Check that backed up value is correctly restored if ( $nestingLevel >= 0 ) { self::assertEquals( $aVal[$nestingLevel], $this->tpl->variable( $varName, $namespace ), "Backed up tpl variable has not been properly restored from safe namespace" ); } else { self::assertNull( $this->tpl->variable( $varName, $namespace ), "Template variable has not been unset" ); } } }
/** * Generate result data for a node view * * @param eZTemplate $tpl * @param eZContentObjectTreeNode $node * @param eZContentObject $object * @param bool|string $languageCode * @param string $viewMode * @param int $offset * @param array $viewParameters * @param bool|array $collectionAttributes * @param bool $validation * @return array Result array for view */ static function generateNodeViewData(eZTemplate $tpl, eZContentObjectTreeNode $node, eZContentObject $object, $languageCode, $viewMode, $offset, array $viewParameters = array('offset' => 0, 'year' => false, 'month' => false, 'day' => false), $collectionAttributes = false, $validation = false) { $section = eZSection::fetch($object->attribute('section_id')); if ($section) { $navigationPartIdentifier = $section->attribute('navigation_part_identifier'); $sectionIdentifier = $section->attribute('identifier'); } else { $navigationPartIdentifier = null; $sectionIdentifier = null; } $keyArray = array(array('object', $object->attribute('id')), array('node', $node->attribute('node_id')), array('parent_node', $node->attribute('parent_node_id')), array('class', $object->attribute('contentclass_id')), array('class_identifier', $node->attribute('class_identifier')), array('view_offset', $offset), array('viewmode', $viewMode), array('remote_id', $object->attribute('remote_id')), array('node_remote_id', $node->attribute('remote_id')), array('navigation_part_identifier', $navigationPartIdentifier), array('depth', $node->attribute('depth')), array('url_alias', $node->attribute('url_alias')), array('class_group', $object->attribute('match_ingroup_id_list')), array('state', $object->attribute('state_id_array')), array('state_identifier', $object->attribute('state_identifier_array')), array('section', $object->attribute('section_id')), array('section_identifier', $sectionIdentifier)); $parentClassID = false; $parentClassIdentifier = false; $parentNodeRemoteID = false; $parentObjectRemoteID = false; $parentNode = $node->attribute('parent'); if (is_object($parentNode)) { $parentNodeRemoteID = $parentNode->attribute('remote_id'); $keyArray[] = array('parent_node_remote_id', $parentNodeRemoteID); $parentObject = $parentNode->attribute('object'); if (is_object($parentObject)) { $parentObjectRemoteID = $parentObject->attribute('remote_id'); $keyArray[] = array('parent_object_remote_id', $parentObjectRemoteID); $parentClass = $parentObject->contentClass(); if (is_object($parentClass)) { $parentClassID = $parentClass->attribute('id'); $parentClassIdentifier = $parentClass->attribute('identifier'); $keyArray[] = array('parent_class', $parentClassID); $keyArray[] = array('parent_class_identifier', $parentClassIdentifier); } } } $res = eZTemplateDesignResource::instance(); $res->setKeys($keyArray); if ($languageCode) { $oldLanguageCode = $node->currentLanguage(); $node->setCurrentLanguage($languageCode); } $tpl->setVariable('node', $node); $tpl->setVariable('viewmode', $viewMode); $tpl->setVariable('language_code', $languageCode); if (isset($viewParameters['_custom'])) { foreach ($viewParameters['_custom'] as $customVarName => $customValue) { $tpl->setVariable($customVarName, $customValue); } unset($viewParameters['_custom']); } $tpl->setVariable('view_parameters', $viewParameters); $tpl->setVariable('collection_attributes', $collectionAttributes); $tpl->setVariable('validation', $validation); $tpl->setVariable('persistent_variable', false); $parents = $node->attribute('path'); $path = array(); $titlePath = array(); foreach ($parents as $parent) { $path[] = array('text' => $parent->attribute('name'), 'url' => '/content/view/full/' . $parent->attribute('node_id'), 'url_alias' => $parent->attribute('url_alias'), 'node_id' => $parent->attribute('node_id')); } $titlePath = $path; $path[] = array('text' => $object->attribute('name'), 'url' => false, 'url_alias' => false, 'node_id' => $node->attribute('node_id')); $titlePath[] = array('text' => $object->attribute('name'), 'url' => false, 'url_alias' => false); $tpl->setVariable('node_path', $path); $event = ezpEvent::getInstance(); $event->notify('content/pre_rendering', array($node, $tpl, $viewMode)); $Result = array(); $Result['content'] = $tpl->fetch('design:node/view/' . $viewMode . '.tpl'); $Result['view_parameters'] = $viewParameters; $Result['path'] = $path; $Result['title_path'] = $titlePath; $Result['section_id'] = $object->attribute('section_id'); $Result['node_id'] = $node->attribute('node_id'); $Result['navigation_part'] = $navigationPartIdentifier; $contentInfoArray = array(); $contentInfoArray['object_id'] = $object->attribute('id'); $contentInfoArray['node_id'] = $node->attribute('node_id'); $contentInfoArray['parent_node_id'] = $node->attribute('parent_node_id'); $contentInfoArray['class_id'] = $object->attribute('contentclass_id'); $contentInfoArray['class_identifier'] = $node->attribute('class_identifier'); $contentInfoArray['remote_id'] = $object->attribute('remote_id'); $contentInfoArray['node_remote_id'] = $node->attribute('remote_id'); $contentInfoArray['offset'] = $offset; $contentInfoArray['viewmode'] = $viewMode; $contentInfoArray['navigation_part_identifier'] = $navigationPartIdentifier; $contentInfoArray['node_depth'] = $node->attribute('depth'); $contentInfoArray['url_alias'] = $node->attribute('url_alias'); $contentInfoArray['current_language'] = $object->attribute('current_language'); $contentInfoArray['language_mask'] = $object->attribute('language_mask'); $contentInfoArray['main_node_id'] = $node->attribute('main_node_id'); $contentInfoArray['main_node_url_alias'] = false; // Add url alias for main node if it is not current node and user has access to it if (!$node->isMain()) { $mainNode = $object->mainNode(); if ($mainNode->canRead()) { $contentInfoArray['main_node_url_alias'] = $mainNode->attribute('url_alias'); } } $contentInfoArray['persistent_variable'] = false; if ($tpl->variable('persistent_variable') !== false) { $contentInfoArray['persistent_variable'] = $tpl->variable('persistent_variable'); $keyArray[] = array('persistent_variable', $contentInfoArray['persistent_variable']); $res->setKeys($keyArray); } $contentInfoArray['class_group'] = $object->attribute('match_ingroup_id_list'); $contentInfoArray['state'] = $object->attribute('state_id_array'); $contentInfoArray['state_identifier'] = $object->attribute('state_identifier_array'); $contentInfoArray['parent_class_id'] = $parentClassID; $contentInfoArray['parent_class_identifier'] = $parentClassIdentifier; $contentInfoArray['parent_node_remote_id'] = $parentNodeRemoteID; $contentInfoArray['parent_object_remote_id'] = $parentObjectRemoteID; $Result['content_info'] = $contentInfoArray; // Store which templates were used to make this cache. $Result['template_list'] = $tpl->templateFetchList(); // Check if time to live is set in template if ($tpl->hasVariable('cache_ttl')) { $cacheTTL = $tpl->variable('cache_ttl'); } if (!isset($cacheTTL)) { $cacheTTL = -1; } $Result['cache_ttl'] = $cacheTTL; // if cache_ttl is set to 0 from the template, we need to add a no-cache advice // to the node's data. That way, the retrieve callback on the next calls // will be able to determine earlier that no cache generation should be started // for this node if ($cacheTTL == 0) { $Result['no_cache'] = true; } if ($languageCode) { $node->setCurrentLanguage($oldLanguageCode); } return $Result; }
/** * Function for setting values to deal with persistent_variable either from * template or internally on {@link self::$persistentVariable} * * @internal * @param string $key Key to store values on * @param string|array $value Value(s) to store * @param eZTemplate $tpl Template object to get values from * @param bool $append Append or prepend value? * @param bool $arrayUnique Make sure array is unique to remove duplicates * @param bool $returnArrayDiff Return diff against existing values instead of resulting array * @param bool $override Override/Wipe out values or merge? * @return array */ public static function setPersistentArray($key, $value, eZTemplate $tpl, $append = true, $arrayUnique = false, $returnArrayDiff = false, $override = false) { $isPageLayout = false; $persistentVariable = array(); if ($tpl->hasVariable('module_result')) { $isPageLayout = true; $moduleResult = $tpl->variable('module_result'); } if (isset($moduleResult['content_info']['persistent_variable'])) { $persistentVariable = $moduleResult['content_info']['persistent_variable']; } else { if (!$isPageLayout && $tpl->hasVariable('persistent_variable')) { $persistentVariable = $tpl->variable('persistent_variable'); } else { if (self::$persistentVariable !== null) { $persistentVariable = self::$persistentVariable; } } } if ($persistentVariable === false || !is_array($persistentVariable)) { // Give warning if value is not array as we depend on it if (!$isPageLayout && $persistentVariable) { eZDebug::writeError('persistent_variable was not an array and where cleared, see ezjscore requriments!', __METHOD__); } $persistentVariable = array(); } // make a copy in case we need to diff value in the end $persistentVariableCopy = $persistentVariable; if (!$override) { if (isset($persistentVariable[$key]) && is_array($persistentVariable[$key])) { if (is_array($value)) { if ($append) { $persistentVariable[$key] = array_merge($persistentVariable[$key], $value); } else { $persistentVariable[$key] = array_merge($value, $persistentVariable[$key]); } } else { if ($append) { $persistentVariable[$key][] = $value; } else { $persistentVariable[$key] = array_merge(array($value), $persistentVariable[$key]); } } } else { if (is_array($value)) { $persistentVariable[$key] = $value; } else { $persistentVariable[$key] = array($value); } } } else { $persistentVariable[$key] = $value; } if ($arrayUnique && isset($persistentVariable[$key][1])) { $persistentVariable[$key] = array_unique($persistentVariable[$key]); } // set the finnished array in the template if ($isPageLayout) { if (isset($moduleResult['content_info']['persistent_variable'])) { $moduleResult['content_info']['persistent_variable'] = $persistentVariable; $tpl->setVariable('module_result', $moduleResult); } } else { $tpl->setVariable('persistent_variable', $persistentVariable); } // storing the value internally as well in case this is not a view that supports persistent_variable (ezpagedata will look for it) self::$persistentVariable = $persistentVariable; if ($returnArrayDiff && isset($persistentVariableCopy[$key][0])) { return array_diff($persistentVariable[$key], $persistentVariableCopy[$key]); } return $persistentVariable[$key]; }
/** * @param eZTemplate $tpl * * @return array */ private function getPath($tpl) { if ($tpl->hasVariable('module_result')) { $moduleResult = $tpl->variable('module_result'); } else { $moduleResult = array(); } // $viewmode = false; // if ( isset( $moduleResult['content_info'] ) ) // { // if ( isset( $moduleResult['content_info']['viewmode'] ) ) // { // $viewmode = $moduleResult['content_info']['viewmode']; // } // } return isset($moduleResult['path']) && is_array($moduleResult['path']) ? $moduleResult['path'] : array(); }