From 5965f3ecead424bb969261a33279dd592e5b799e Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Sat, 16 Mar 2013 23:02:51 +0100 Subject: [PATCH 1/5] Split locating JS and CSS files to their own class --- lib/template/cssresourcelocator.php | 43 ++++++++++ lib/template/jsresourcelocator.php | 43 ++++++++++ lib/template/resourcelocator.php | 70 +++++++++++++++ lib/templatelayout.php | 114 +++---------------------- tests/lib/template/resourcelocator.php | 69 +++++++++++++++ 5 files changed, 235 insertions(+), 104 deletions(-) create mode 100644 lib/template/cssresourcelocator.php create mode 100644 lib/template/jsresourcelocator.php create mode 100644 lib/template/resourcelocator.php create mode 100644 tests/lib/template/resourcelocator.php diff --git a/lib/template/cssresourcelocator.php b/lib/template/cssresourcelocator.php new file mode 100644 index 0000000000..e27296d9f5 --- /dev/null +++ b/lib/template/cssresourcelocator.php @@ -0,0 +1,43 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Template; + +class CSSResourceLocator extends ResourceLocator { + public function doFind( $style ) { + if (strpos($style, '3rdparty') === 0 + && $this->appendIfExist($this->thirdpartyroot, $style.'.css') + || $this->appendIfExist($this->serverroot, $style.$this->form_factor.'.css') + || $this->appendIfExist($this->serverroot, $style.'.css') + || $this->appendIfExist($this->serverroot, 'core/'.$style.$this->form_factor.'.css') + || $this->appendIfExist($this->serverroot, 'core/'.$style.'.css') + ) { + return; + } + $app = substr($style, 0, strpos($style, '/')); + $style = substr($style, strpos($style, '/')+1); + $app_path = OC_App::getAppPath($app); + $app_url = $this->webroot . '/index.php/apps/' . $app; + if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url) + || $this->appendIfExist($app_path, $style.'.css', $ap_url) + ) { + return; + } + throw new \Exception('css file not found: style:'.$style); + } + + public function doFindTheme( $style ) { + $theme_dir = 'themes/'.$this->theme.'/'; + $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$style.$this->form_factor.'.css') + || $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$style.'.css') + || $this->appendIfExist($this->serverroot, $theme_dir.$style.$this->form_factor.'.css') + || $this->appendIfExist($this->serverroot, $theme_dir.$style.'.css') + || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$style.$this->form_factor.'.css') + || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$style.'.css'); + } +} diff --git a/lib/template/jsresourcelocator.php b/lib/template/jsresourcelocator.php new file mode 100644 index 0000000000..a1382edf2d --- /dev/null +++ b/lib/template/jsresourcelocator.php @@ -0,0 +1,43 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Template; + +class JSResourceLocator extends ResourceLocator { + public function doFind( $script ) { + $theme_dir = 'themes/'.$this->theme.'/'; + if (strpos($script, '3rdparty') === 0 + && $this->appendIfExist($this->thirdpartyroot, $script.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$script.$this->form_factor.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$script.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.$script.$this->form_factor.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.$script.'.js') + || $this->appendIfExist($this->serverroot, $script.$this->form_factor.'.js') + || $this->appendIfExist($this->serverroot, $script.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$script.$this->form_factor.'.js') + || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$script.'.js') + || $this->appendIfExist($this->serverroot, 'core/'.$script.$this->form_factor.'.js') + || $this->appendIfExist($this->serverroot, 'core/'.$script.'.js') + ) { + return; + } + $app = substr($script, 0, strpos($script, '/')); + $script = substr($script, strpos($script, '/')+1); + $app_path = OC_App::getAppPath($app); + $app_url = OC_App::getAppWebPath($app); + if ($this->appendIfExist($app_path, $script.$this->form_factor.'.js', $app_url) + || $this->appendIfExist($app_path, $script.'.js', $ap_url) + ) { + return; + } + throw new \Exception('js file not found: script:'.$script); + } + + public function doFindTheme( $script ) { + } +} diff --git a/lib/template/resourcelocator.php b/lib/template/resourcelocator.php new file mode 100644 index 0000000000..9f83673664 --- /dev/null +++ b/lib/template/resourcelocator.php @@ -0,0 +1,70 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Template; + +abstract class ResourceLocator { + protected $theme; + protected $form_factor; + + protected $mapping; + protected $serverroot; + protected $thirdpartyroot; + protected $webroot; + + protected $resources = array(); + + public function __construct( $theme, $form_factor, $core_map, $party_map ) { + $this->theme = $theme; + $this->form_factor = $form_factor; + $this->mapping = $core_map + $party_map; + $this->serverroot = key($core_map); + $this->thirdpartyroot = key($party_map); + $this->webroot = $this->mapping[$this->serverroot]; + } + + abstract public function doFind( $resource ); + abstract public function doFindTheme( $resource ); + + public function find( $resources ) { + try { + foreach($resources as $resource) { + $this->doFind($resource); + } + if (!empty($this->theme)) { + foreach($resources as $resource) { + $this->doFindTheme($resource); + } + } + } catch (\Exception $e) { + throw new \Exception($e->getMessage().' formfactor:'.$this->form_factor + .' serverroot:'.$this->serverroot); + } + } + + /* + * @brief append the $file resource if exist at $root + * @param $root path to check + * @param $file the filename + * @param $web base for path, default map $root to $webroot + */ + protected function appendIfExist($root, $file, $webroot = null) { + if (is_file($root.'/'.$file)) { + if (!$webroot) { + $webroot = $this->mapping[$root]; + } + $this->resources[] = array($root, $webroot, $file); + return true; + } + return false; + } + + public function getResources() { + return $this->resources; + } +} diff --git a/lib/templatelayout.php b/lib/templatelayout.php index 7115b8f030..0024c9d496 100644 --- a/lib/templatelayout.php +++ b/lib/templatelayout.php @@ -83,21 +83,6 @@ class OC_TemplateLayout extends OC_Template { } } - /* - * @brief append the $file-url if exist at $root - * @param $files array to append file info to - * @param $root path to check - * @param $web base for path - * @param $file the filename - */ - static public function appendIfExist(&$files, $root, $webroot, $file) { - if (is_file($root.'/'.$file)) { - $files[] = array($root, $webroot, $file); - return true; - } - return false; - } - static public function findStylesheetFiles($styles) { // Read the selected theme from the config file $theme = OC_Util::getTheme(); @@ -105,51 +90,11 @@ class OC_TemplateLayout extends OC_Template { // Read the detected formfactor and use the right file name. $fext = self::getFormFactorExtension(); - $files = array(); - foreach($styles as $style) { - // is it in 3rdparty? - if(strpos($style, '3rdparty') === 0 && - self::appendIfExist($files, OC::$THIRDPARTYROOT, OC::$THIRDPARTYWEBROOT, $style.'.css')) { - - // or in the owncloud root? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "$style$fext.css" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "$style.css" )) { - - // or in core ? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "core/$style$fext.css" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "core/$style.css" )) { - - }else{ - $app = substr($style, 0, strpos($style, '/')); - $style = substr($style, strpos($style, '/')+1); - $app_path = OC_App::getAppPath($app); - $app_url = OC::$WEBROOT . '/index.php/apps/' . $app; - if(self::appendIfExist($files, $app_path, $app_url, "$style$fext.css")) { - } - elseif(self::appendIfExist($files, $app_path, $app_url, "$style.css")) { - } - else { - echo('css file not found: style:'.$style.' formfactor:'.$fext - .' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT); - die(); - } - } - } - // Add the theme css files. you can override the default values here - if(!empty($theme)) { - foreach($styles as $style) { - if(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/apps/$style$fext.css" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/apps/$style.css" )) { - - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/$style$fext.css" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/$style.css" )) { - - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/core/$style$fext.css" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/core/$style.css" )) { - } - } - } - return $files; + $locator = new \OC\Template\CSSResourceLocator( $theme, $fext, + array( OC::$SERVERROOT => OC::$WEBROOT ), + array( OC::$THIRDPARTYROOT => OC::$THIRDPARTYWEBROOT )); + $locator->find($styles); + return $locator->getResources(); } static public function findJavascriptFiles($scripts) { @@ -159,49 +104,10 @@ class OC_TemplateLayout extends OC_Template { // Read the detected formfactor and use the right file name. $fext = self::getFormFactorExtension(); - $files = array(); - foreach($scripts as $script) { - // Is it in 3rd party? - if(strpos($script, '3rdparty') === 0 && - self::appendIfExist($files, OC::$THIRDPARTYROOT, OC::$THIRDPARTYWEBROOT, $script.'.js')) { - - // Is it in apps and overwritten by the theme? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/apps/$script$fext.js" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/apps/$script.js" )) { - - // Is it in the owncloud root but overwritten by the theme? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/$script$fext.js" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/$script.js" )) { - - // Is it in the owncloud root ? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "$script$fext.js" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "$script.js" )) { - - // Is in core but overwritten by a theme? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/core/$script$fext.js" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "themes/$theme/core/$script.js" )) { - - // Is it in core? - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "core/$script$fext.js" )) { - }elseif(self::appendIfExist($files, OC::$SERVERROOT, OC::$WEBROOT, "core/$script.js" )) { - - }else{ - // Is it part of an app? - $app = substr($script, 0, strpos($script, '/')); - $script = substr($script, strpos($script, '/')+1); - $app_path = OC_App::getAppPath($app); - $app_url = OC_App::getAppWebPath($app); - if(self::appendIfExist($files, $app_path, $app_url, "$script$fext.js")) { - } - elseif(self::appendIfExist($files, $app_path, $app_url, "$script.js")) { - } - else { - echo('js file not found: script:'.$script.' formfactor:'.$fext - .' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT); - die(); - } - } - } - return $files; + $locator = new \OC\Template\JSResourceLocator( $theme, $fext, + array( OC::$SERVERROOT => OC::$WEBROOT ), + array( OC::$THIRDPARTYROOT => OC::$THIRDPARTYWEBROOT )); + $locator->find($scripts); + return $locator->getResources(); } } diff --git a/tests/lib/template/resourcelocator.php b/tests/lib/template/resourcelocator.php new file mode 100644 index 0000000000..d80d222e2c --- /dev/null +++ b/tests/lib/template/resourcelocator.php @@ -0,0 +1,69 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class Test_ResourceLocator extends PHPUnit_Framework_TestCase { + public function getResourceLocator( $theme, $form_factor, $core_map, $party_map, $appsroots ) { + return $this->getMockForAbstractClass('OC\Template\ResourceLocator', + array( $theme, $form_factor, $core_map, $party_map, $appsroots ), + '', true, true, true, array()); + } + + public function testConstructor() { + $locator = $this->getResourceLocator('theme', 'form_factor', + array('core'=>'map'), array('3rd'=>'party'), array('foo'=>'bar')); + $this->assertAttributeEquals('theme', 'theme', $locator); + $this->assertAttributeEquals('form_factor', 'form_factor', $locator); + $this->assertAttributeEquals('core', 'serverroot', $locator); + $this->assertAttributeEquals(array('core'=>'map','3rd'=>'party'), 'mapping', $locator); + $this->assertAttributeEquals('3rd', 'thirdpartyroot', $locator); + $this->assertAttributeEquals('map', 'webroot', $locator); + $this->assertAttributeEquals(array(), 'resources', $locator); + } + + public function testFind() { + $locator = $this->getResourceLocator('theme', 'form_factor', + array('core'=>'map'), array('3rd'=>'party'), array('foo'=>'bar')); + $locator->expects($this->once()) + ->method('doFind') + ->with('foo'); + $locator->expects($this->once()) + ->method('doFindTheme') + ->with('foo'); + $locator->find(array('foo')); + + $locator = $this->getResourceLocator('theme', 'form_factor', + array('core'=>'map'), array('3rd'=>'party'), array('foo'=>'bar')); + $locator->expects($this->once()) + ->method('doFind') + ->with('foo') + ->will($this->throwException(new Exception('test'))); + try { + $locator->find(array('foo')); + } catch (\Exception $e) { + $this->assertEquals('test formfactor:form_factor serverroot:core', $e->getMessage()); + } + } + + public function testAppendIfExist() { + $locator = $this->getResourceLocator('theme', 'form_factor', + array(__DIR__=>'map'), array('3rd'=>'party'), array('foo'=>'bar')); + $method = new ReflectionMethod($locator, 'appendIfExist'); + $method->setAccessible(true); + + $method->invoke($locator, __DIR__, basename(__FILE__), 'webroot'); + $resource1 = array(__DIR__, 'webroot', basename(__FILE__)); + $this->assertEquals(array($resource1), $locator->getResources()); + + $method->invoke($locator, __DIR__, basename(__FILE__)); + $resource2 = array(__DIR__, 'map', basename(__FILE__)); + $this->assertEquals(array($resource1, $resource2), $locator->getResources()); + + $method->invoke($locator, __DIR__, 'does-not-exist'); + $this->assertEquals(array($resource1, $resource2), $locator->getResources()); + } +} From 2593395561628b02169cfec62f0880ee0dac8f5c Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Mon, 18 Mar 2013 17:36:52 +0100 Subject: [PATCH 2/5] Move template functions to there own file --- lib/template.php | 113 +--------------------------------- lib/template/functions.php | 120 +++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 112 deletions(-) create mode 100644 lib/template/functions.php diff --git a/lib/template.php b/lib/template.php index d48e3b3682..f1b03d6883 100644 --- a/lib/template.php +++ b/lib/template.php @@ -21,118 +21,7 @@ * */ -/** - * Prints an XSS escaped string - * @param string $string the string which will be escaped and printed - */ -function p($string) { - print(OC_Util::sanitizeHTML($string)); -} - -/** - * Prints an unescaped string - * @param string $string the string which will be printed as it is - */ -function print_unescaped($string) { - print($string); -} - -/** - * @brief make OC_Helper::linkTo available as a simple function - * @param string $app app - * @param string $file file - * @param array $args array with param=>value, will be appended to the returned url - * @return string link to the file - * - * For further information have a look at OC_Helper::linkTo - */ -function link_to( $app, $file, $args = array() ) { - return OC_Helper::linkTo( $app, $file, $args ); -} - -/** - * @brief make OC_Helper::imagePath available as a simple function - * @param string $app app - * @param string $image image - * @return string link to the image - * - * For further information have a look at OC_Helper::imagePath - */ -function image_path( $app, $image ) { - return OC_Helper::imagePath( $app, $image ); -} - -/** - * @brief make OC_Helper::mimetypeIcon available as a simple function - * @param string $mimetype mimetype - * @return string link to the image - * - * For further information have a look at OC_Helper::mimetypeIcon - */ -function mimetype_icon( $mimetype ) { - return OC_Helper::mimetypeIcon( $mimetype ); -} - -/** - * @brief make OC_Helper::humanFileSize available as a simple function - * @param int $bytes size in bytes - * @return string size as string - * - * For further information have a look at OC_Helper::humanFileSize - */ -function human_file_size( $bytes ) { - return OC_Helper::humanFileSize( $bytes ); -} - -function relative_modified_date($timestamp) { - $l=OC_L10N::get('lib'); - $timediff = time() - $timestamp; - $diffminutes = round($timediff/60); - $diffhours = round($diffminutes/60); - $diffdays = round($diffhours/24); - $diffmonths = round($diffdays/31); - - if($timediff < 60) { return $l->t('seconds ago'); } - else if($timediff < 120) { return $l->t('1 minute ago'); } - else if($timediff < 3600) { return $l->t('%d minutes ago', $diffminutes); } - else if($timediff < 7200) { return $l->t('1 hour ago'); } - else if($timediff < 86400) { return $l->t('%d hours ago', $diffhours); } - else if((date('G')-$diffhours) > 0) { return $l->t('today'); } - else if((date('G')-$diffhours) > -24) { return $l->t('yesterday'); } - else if($timediff < 2678400) { return $l->t('%d days ago', $diffdays); } - else if($timediff < 5184000) { return $l->t('last month'); } - else if((date('n')-$diffmonths) > 0) { return $l->t('%d months ago', $diffmonths); } - else if($timediff < 63113852) { return $l->t('last year'); } - else { return $l->t('years ago'); } -} - -function html_select_options($options, $selected, $params=array()) { - if (!is_array($selected)) { - $selected=array($selected); - } - if (isset($params['combine']) && $params['combine']) { - $options = array_combine($options, $options); - } - $value_name = $label_name = false; - if (isset($params['value'])) { - $value_name = $params['value']; - } - if (isset($params['label'])) { - $label_name = $params['label']; - } - $html = ''; - foreach($options as $value => $label) { - if ($value_name && is_array($label)) { - $value = $label[$value_name]; - } - if ($label_name && is_array($label)) { - $label = $label[$label_name]; - } - $select = in_array($value, $selected) ? ' selected="selected"' : ''; - $html .= ''."\n"; - } - return $html; -} +require_once __DIR__.'/template/functions.php'; /** * This class provides the templates for owncloud. diff --git a/lib/template/functions.php b/lib/template/functions.php new file mode 100644 index 0000000000..2d43cae1c0 --- /dev/null +++ b/lib/template/functions.php @@ -0,0 +1,120 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/** + * Prints an XSS escaped string + * @param string $string the string which will be escaped and printed + */ +function p($string) { + print(OC_Util::sanitizeHTML($string)); +} + +/** + * Prints an unescaped string + * @param string $string the string which will be printed as it is + */ +function print_unescaped($string) { + print($string); +} + +/** + * @brief make OC_Helper::linkTo available as a simple function + * @param string $app app + * @param string $file file + * @param array $args array with param=>value, will be appended to the returned url + * @return string link to the file + * + * For further information have a look at OC_Helper::linkTo + */ +function link_to( $app, $file, $args = array() ) { + return OC_Helper::linkTo( $app, $file, $args ); +} + +/** + * @brief make OC_Helper::imagePath available as a simple function + * @param string $app app + * @param string $image image + * @return string link to the image + * + * For further information have a look at OC_Helper::imagePath + */ +function image_path( $app, $image ) { + return OC_Helper::imagePath( $app, $image ); +} + +/** + * @brief make OC_Helper::mimetypeIcon available as a simple function + * @param string $mimetype mimetype + * @return string link to the image + * + * For further information have a look at OC_Helper::mimetypeIcon + */ +function mimetype_icon( $mimetype ) { + return OC_Helper::mimetypeIcon( $mimetype ); +} + +/** + * @brief make OC_Helper::humanFileSize available as a simple function + * @param int $bytes size in bytes + * @return string size as string + * + * For further information have a look at OC_Helper::humanFileSize + */ +function human_file_size( $bytes ) { + return OC_Helper::humanFileSize( $bytes ); +} + +function relative_modified_date($timestamp) { + $l=OC_L10N::get('lib'); + $timediff = time() - $timestamp; + $diffminutes = round($timediff/60); + $diffhours = round($diffminutes/60); + $diffdays = round($diffhours/24); + $diffmonths = round($diffdays/31); + + if($timediff < 60) { return $l->t('seconds ago'); } + else if($timediff < 120) { return $l->t('1 minute ago'); } + else if($timediff < 3600) { return $l->t('%d minutes ago', $diffminutes); } + else if($timediff < 7200) { return $l->t('1 hour ago'); } + else if($timediff < 86400) { return $l->t('%d hours ago', $diffhours); } + else if((date('G')-$diffhours) > 0) { return $l->t('today'); } + else if((date('G')-$diffhours) > -24) { return $l->t('yesterday'); } + else if($timediff < 2678400) { return $l->t('%d days ago', $diffdays); } + else if($timediff < 5184000) { return $l->t('last month'); } + else if((date('n')-$diffmonths) > 0) { return $l->t('%d months ago', $diffmonths); } + else if($timediff < 63113852) { return $l->t('last year'); } + else { return $l->t('years ago'); } +} + +function html_select_options($options, $selected, $params=array()) { + if (!is_array($selected)) { + $selected=array($selected); + } + if (isset($params['combine']) && $params['combine']) { + $options = array_combine($options, $options); + } + $value_name = $label_name = false; + if (isset($params['value'])) { + $value_name = $params['value']; + } + if (isset($params['label'])) { + $label_name = $params['label']; + } + $html = ''; + foreach($options as $value => $label) { + if ($value_name && is_array($label)) { + $value = $label[$value_name]; + } + if ($label_name && is_array($label)) { + $label = $label[$label_name]; + } + $select = in_array($value, $selected) ? ' selected="selected"' : ''; + $html .= ''."\n"; + } + return $html; +} From 3de8570e3547116b422e6c578ee4f50c53ed1855 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Mon, 18 Mar 2013 22:32:32 +0100 Subject: [PATCH 3/5] Move basic template functions to their own class --- lib/template.php | 196 +++++---------------------- lib/template/base.php | 131 ++++++++++++++++++ lib/template/templatefilelocator.php | 43 ++++++ 3 files changed, 205 insertions(+), 165 deletions(-) create mode 100644 lib/template/base.php create mode 100644 lib/template/templatefilelocator.php diff --git a/lib/template.php b/lib/template.php index f1b03d6883..fc3c6b6d54 100644 --- a/lib/template.php +++ b/lib/template.php @@ -26,12 +26,9 @@ require_once __DIR__.'/template/functions.php'; /** * This class provides the templates for owncloud. */ -class OC_Template{ +class OC_Template extends \OC\Template\Base { private $renderas; // Create a full page? - private $application; // template Application - private $vars; // Vars - private $template; // The path to the template - private $l10n; // The l10n-Object + private $path; // The path to the template private $headers=array(); //custom headers /** @@ -48,13 +45,24 @@ class OC_Template{ * "admin". */ public function __construct( $app, $name, $renderas = "" ) { + // Read the selected theme from the config file + $theme = OC_Util::getTheme(); + + // Read the detected formfactor and use the right file name. + $fext = self::getFormFactorExtension(); + + $requesttoken = OC::$session ? OC_Util::callRegister() : ''; + + $parts = explode('/', $app); // fix translation when app is something like core/lostpassword + $l10n = OC_L10N::get($parts[0]); + + list($path, $template) = $this->findTemplate($theme, $app, $name, $fext); + // Set the private data $this->renderas = $renderas; - $this->application = $app; - $this->vars = array(); - $this->vars['requesttoken'] = OC::$session ? OC_Util::callRegister() : ''; - $parts = explode('/', $app); // fix translation when app is something like core/lostpassword - $this->l10n = OC_L10N::get($parts[0]); + $this->path = $path; + + parent::__construct($template, $requesttoken, $l10n); // Some headers to enhance security header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters @@ -78,7 +86,6 @@ class OC_Template{ .'media-src *'); header('Content-Security-Policy:'.$policy); // Standard - $this->findTemplate($name); } /** @@ -149,106 +156,17 @@ class OC_Template{ * Will select the template file for the selected theme and formfactor. * Checking all the possible locations. */ - protected function findTemplate($name) - { - // Read the selected theme from the config file - $theme = OC_Util::getTheme(); - - // Read the detected formfactor and use the right file name. - $fext = self::getFormFactorExtension(); - - $app = $this->application; + protected function findTemplate($theme, $app, $name, $fext) { // Check if it is a app template or not. - if( $app != "" ) { - // Check if the app is in the app folder or in the root - if( file_exists(OC_App::getAppPath($app)."/templates/" )) { - // Check if the template is overwritten by the selected theme - if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/apps/$app/templates/", $name, $fext)) { - }elseif ($this->checkPathForTemplate(OC_App::getAppPath($app)."/templates/", $name, $fext)) { - } - }else{ - // Check if the template is overwritten by the selected theme - if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/$app/templates/", $name, $fext)) { - }elseif ($this->checkPathForTemplate(OC::$SERVERROOT."/$app/templates/", $name, $fext)) { - }else{ - echo('template not found: template:'.$name.' formfactor:'.$fext - .' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT); - die(); - } - - } - }else{ - // Check if the template is overwritten by the selected theme - if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/core/templates/", $name, $fext)) { - } elseif ($this->checkPathForTemplate(OC::$SERVERROOT."/core/templates/", $name, $fext)) { - }else{ - echo('template not found: template:'.$name.' formfactor:'.$fext - .' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT); - die(); - } - } - } - - /** - * @brief check Path For Template with and without $fext - * @param string $path to check - * @param string $name of the template file (without suffix) - * @param string $fext formfactor extension - * @return bool true when found - * - * Will set $this->template and $this->path if there is a template at - * the specific $path - */ - protected function checkPathForTemplate($path, $name, $fext) - { - if ($name =='') return false; - $template = null; - if( is_file( $path.$name.$fext.'.php' )) { - $template = $path.$name.$fext.'.php'; - }elseif( is_file( $path.$name.'.php' )) { - $template = $path.$name.'.php'; - } - if ($template) { - $this->template = $template; - $this->path = $path; - return true; - } - return false; - } - - /** - * @brief Assign variables - * @param string $key key - * @param string $value value - * @return bool - * - * This function assigns a variable. It can be accessed via $_[$key] in - * the template. - * - * If the key existed before, it will be overwritten - */ - public function assign( $key, $value) { - $this->vars[$key] = $value; - return true; - } - - /** - * @brief Appends a variable - * @param string $key key - * @param string $value value - * @return bool - * - * This function assigns a variable in an array context. If the key already - * exists, the value will be appended. It can be accessed via - * $_[$key][$position] in the template. - */ - public function append( $key, $value ) { - if( array_key_exists( $key, $this->vars )) { - $this->vars[$key][] = $value; - } - else{ - $this->vars[$key] = array( $value ); + if( $app != '' ) { + $dirs = $this->getAppTemplateDirs($theme, $app, OC::$SERVERROOT, OC_App::getAppPath($app)); + } else { + $dirs = $this->getCoreTemplateDirs($theme, OC::$SERVERROOT); } + $locator = new \OC\Template\TemplateFileLocator( $fext, $dirs ); + $template = $locator->find($name); + $path = $locator->getPath(); + return array($path, $template); } /** @@ -262,31 +180,14 @@ class OC_Template{ } /** - * @brief Prints the proceeded template + * @brief Process the template * @return bool * - * This function proceeds the template and prints its output. - */ - public function printPage() { - $data = $this->fetchPage(); - if( $data === false ) { - return false; - } - else{ - print $data; - return true; - } - } - - /** - * @brief Proceeds the template - * @return bool - * - * This function proceeds the template. If $this->renderas is set, it + * This function process the template. If $this->renderas is set, it * will produce a full page. */ public function fetchPage() { - $data = $this->_fetch(); + $data = parent::fetchPage(); if( $this->renderas ) { $page = new OC_TemplateLayout($this->renderas); @@ -305,27 +206,6 @@ class OC_Template{ } } - /** - * @brief doing the actual work - * @return string content - * - * Includes the template file, fetches its output - */ - private function _fetch() { - // Register the variables - $_ = $this->vars; - $l = $this->l10n; - - // Execute the template - ob_start(); - include $this->template; // <-- we have to use include because we pass $_! - $data = ob_get_contents(); - @ob_end_clean(); - - // return the data - return $data; - } - /** * @brief Include template * @return string returns content of included template @@ -334,21 +214,7 @@ class OC_Template{ * do this. */ public function inc( $file, $additionalparams = null ) { - $_ = $this->vars; - $l = $this->l10n; - - if( !is_null($additionalparams)) { - $_ = array_merge( $additionalparams, $this->vars ); - } - - // Include - ob_start(); - include $this->path.$file.'.php'; - $data = ob_get_contents(); - @ob_end_clean(); - - // Return data - return $data; + return $this->load($this->path.$file.'.php', $additionalparams); } /** diff --git a/lib/template/base.php b/lib/template/base.php new file mode 100644 index 0000000000..c7ddaa2e8e --- /dev/null +++ b/lib/template/base.php @@ -0,0 +1,131 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Template; + +class Base { + private $template; // The template + private $vars; // Vars + private $l10n; // The l10n-Object + + public function __construct( $template, $requesttoken, $l10n ) { + $this->vars = array(); + $this->vars['requesttoken'] = $requesttoken; + $this->l10n = $l10n; + $this->template = $template; + } + + protected function getAppTemplateDirs($theme, $app, $serverroot, $app_dir) { + // Check if the app is in the app folder or in the root + if( file_exists($app_dir.'/templates/' )) { + return array( + $serverroot.'/themes/'.$theme.'/apps/'.$app.'/templates/', + $app_dir.'/templates/', + ); + } + return array( + $serverroot.'/themes/'.$theme.'/'.$app.'/templates/', + $serverroot.'/'.$app.'/templates/', + ); + } + + protected function getCoreTemplateDirs($theme, $serverroot) { + return array( + $serverroot.'/themes/'.$theme.'/core/templates/', + $serverroot.'/core/templates/', + ); + } + + /** + * @brief Assign variables + * @param string $key key + * @param string $value value + * @return bool + * + * This function assigns a variable. It can be accessed via $_[$key] in + * the template. + * + * If the key existed before, it will be overwritten + */ + public function assign( $key, $value) { + $this->vars[$key] = $value; + return true; + } + + /** + * @brief Appends a variable + * @param string $key key + * @param string $value value + * @return bool + * + * This function assigns a variable in an array context. If the key already + * exists, the value will be appended. It can be accessed via + * $_[$key][$position] in the template. + */ + public function append( $key, $value ) { + if( array_key_exists( $key, $this->vars )) { + $this->vars[$key][] = $value; + } + else{ + $this->vars[$key] = array( $value ); + } + } + + /** + * @brief Prints the proceeded template + * @return bool + * + * This function proceeds the template and prints its output. + */ + public function printPage() { + $data = $this->fetchPage(); + if( $data === false ) { + return false; + } + else{ + print $data; + return true; + } + } + + /** + * @brief Process the template + * @return bool + * + * This function processes the template. + */ + public function fetchPage() { + return $this->load($this->template); + } + + /** + * @brief doing the actual work + * @return string content + * + * Includes the template file, fetches its output + */ + protected function load( $file, $additionalparams = null ) { + // Register the variables + $_ = $this->vars; + $l = $this->l10n; + + if( !is_null($additionalparams)) { + $_ = array_merge( $additionalparams, $this->vars ); + } + + // Include + ob_start(); + include $file; + $data = ob_get_contents(); + @ob_end_clean(); + + // Return data + return $data; + } + +} diff --git a/lib/template/templatefilelocator.php b/lib/template/templatefilelocator.php new file mode 100644 index 0000000000..eeb27c139a --- /dev/null +++ b/lib/template/templatefilelocator.php @@ -0,0 +1,43 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Template; + +class TemplateFileLocator { + protected $form_factor; + protected $dirs; + + public function __construct( $form_factor, $dirs ) { + $this->form_factor = $form_factor; + $this->dirs = $dirs; + } + + public function find( $template ) { + if ($template == '') { + throw new \InvalidArgumentException('Empty template name'); + } + + foreach($this->dirs as $dir) { + $file = $dir.$template.$this->form_factor.'.php'; + if (is_file($file)) { + $this->path = $dir; + return $file; + } + $file = $dir.$template.'.php'; + if (is_file($file)) { + $this->path = $dir; + return $file; + } + } + throw new \Exception('template file not found: template:'.$template.' formfactor:'.$this->form_factor); + } + + public function getPath() { + return $this->path; + } +} From 01c39cf2bea11d6ebfb7c5abf60d5c6878dc3ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 17 Jul 2013 23:27:25 +0200 Subject: [PATCH 4/5] fixing typos, PHPDoc and missing namespace \ --- lib/template.php | 10 +++++----- lib/template/cssresourcelocator.php | 4 ++-- lib/template/jsresourcelocator.php | 6 +++--- lib/template/templatefilelocator.php | 1 + 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/template.php b/lib/template.php index fc3c6b6d54..646d9b1123 100644 --- a/lib/template.php +++ b/lib/template.php @@ -24,7 +24,7 @@ require_once __DIR__.'/template/functions.php'; /** - * This class provides the templates for owncloud. + * This class provides the templates for ownCloud. */ class OC_Template extends \OC\Template\Base { private $renderas; // Create a full page? @@ -34,7 +34,7 @@ class OC_Template extends \OC\Template\Base { /** * @brief Constructor * @param string $app app providing the template - * @param string $file name of the template file (without suffix) + * @param string $name of the template file (without suffix) * @param string $renderas = ""; produce a full page * @return OC_Template object * @@ -172,7 +172,7 @@ class OC_Template extends \OC\Template\Base { /** * @brief Add a custom element to the header * @param string $tag tag name of the element - * @param array $attributes array of attrobutes for the element + * @param array $attributes array of attributes for the element * @param string $text the text content for the element */ public function addHeader( $tag, $attributes, $text='') { @@ -264,8 +264,8 @@ class OC_Template extends \OC\Template\Base { /** * @brief Print a fatal error page and terminates the script - * @param string $error The error message to show - * @param string $hint An optional hint message + * @param string $error_msg The error message to show + * @param string $hint An optional hint message * Warning: All data passed to $hint needs to get sanitized using OC_Util::sanitizeHTML */ public static function printErrorPage( $error_msg, $hint = '' ) { diff --git a/lib/template/cssresourcelocator.php b/lib/template/cssresourcelocator.php index e27296d9f5..8e7831ca54 100644 --- a/lib/template/cssresourcelocator.php +++ b/lib/template/cssresourcelocator.php @@ -21,10 +21,10 @@ class CSSResourceLocator extends ResourceLocator { } $app = substr($style, 0, strpos($style, '/')); $style = substr($style, strpos($style, '/')+1); - $app_path = OC_App::getAppPath($app); + $app_path = \OC_App::getAppPath($app); $app_url = $this->webroot . '/index.php/apps/' . $app; if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url) - || $this->appendIfExist($app_path, $style.'.css', $ap_url) + || $this->appendIfExist($app_path, $style.'.css', $app_url) ) { return; } diff --git a/lib/template/jsresourcelocator.php b/lib/template/jsresourcelocator.php index a1382edf2d..f8fe3817ce 100644 --- a/lib/template/jsresourcelocator.php +++ b/lib/template/jsresourcelocator.php @@ -28,10 +28,10 @@ class JSResourceLocator extends ResourceLocator { } $app = substr($script, 0, strpos($script, '/')); $script = substr($script, strpos($script, '/')+1); - $app_path = OC_App::getAppPath($app); - $app_url = OC_App::getAppWebPath($app); + $app_path = \OC_App::getAppPath($app); + $app_url = \OC_App::getAppWebPath($app); if ($this->appendIfExist($app_path, $script.$this->form_factor.'.js', $app_url) - || $this->appendIfExist($app_path, $script.'.js', $ap_url) + || $this->appendIfExist($app_path, $script.'.js', $app_url) ) { return; } diff --git a/lib/template/templatefilelocator.php b/lib/template/templatefilelocator.php index eeb27c139a..cc5e88771f 100644 --- a/lib/template/templatefilelocator.php +++ b/lib/template/templatefilelocator.php @@ -11,6 +11,7 @@ namespace OC\Template; class TemplateFileLocator { protected $form_factor; protected $dirs; + private $path; public function __construct( $form_factor, $dirs ) { $this->form_factor = $form_factor; From 6d39e0ad6f8cc59566f83c5c9c6a227b2f569f94 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 19 Jul 2013 17:40:07 +0200 Subject: [PATCH 5/5] Change to use !== and === --- lib/template.php | 10 +++++----- lib/template/templatefilelocator.php | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/template.php b/lib/template.php index 646d9b1123..4b77b7ff77 100644 --- a/lib/template.php +++ b/lib/template.php @@ -135,13 +135,13 @@ class OC_Template extends \OC\Template\Base { \OC::$session->set('formfactor', $_GET['formfactor']); } $formfactor = \OC::$session->get('formfactor'); - if($formfactor=='default') { + if($formfactor==='default') { $fext=''; - }elseif($formfactor=='mobile') { + }elseif($formfactor==='mobile') { $fext='.mobile'; - }elseif($formfactor=='tablet') { + }elseif($formfactor==='tablet') { $fext='.tablet'; - }elseif($formfactor=='standalone') { + }elseif($formfactor==='standalone') { $fext='.standalone'; }else{ $fext=''; @@ -158,7 +158,7 @@ class OC_Template extends \OC\Template\Base { */ protected function findTemplate($theme, $app, $name, $fext) { // Check if it is a app template or not. - if( $app != '' ) { + if( $app !== '' ) { $dirs = $this->getAppTemplateDirs($theme, $app, OC::$SERVERROOT, OC_App::getAppPath($app)); } else { $dirs = $this->getCoreTemplateDirs($theme, OC::$SERVERROOT); diff --git a/lib/template/templatefilelocator.php b/lib/template/templatefilelocator.php index cc5e88771f..d5a484b1a1 100644 --- a/lib/template/templatefilelocator.php +++ b/lib/template/templatefilelocator.php @@ -19,7 +19,7 @@ class TemplateFileLocator { } public function find( $template ) { - if ($template == '') { + if ($template === '') { throw new \InvalidArgumentException('Empty template name'); }