openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs | README

commit 44db5acbaed8eef95890a9ca46a897f8c68759d8
parent 6e803c3efef3778713d9d36612421890b44d0dfd
Author: Jan Dankert <develop@jandankert.de>
Date:   Sat, 13 Mar 2021 22:38:30 +0100

New filter for using links in text nodes (useful in CSS or script files)

Diffstat:
Mmodules/cms/action/text/TextPreviewAction.class.php | 40++++++++++++++++++++++++++++++++++++++--
Mmodules/cms/generator/BaseContext.class.php | 23+++++++++++++++++++++++
Mmodules/cms/generator/FileContext.class.php | 6++++++
Mmodules/cms/generator/FileGenerator.class.php | 3++-
Mmodules/cms/generator/PageContext.class.php | 15+++------------
Mmodules/cms/generator/filter/AbstractFilter.class.php | 7+++++++
Amodules/cms/generator/filter/LinkToObjectsFilter.class.php | 38++++++++++++++++++++++++++++++++++++++
Mmodules/cms/generator/link/PreviewLink.class.php | 21+++++++++++++--------
Mmodules/util/text/variables/ValueExpression.class.php | 4++--
Mmodules/util/text/variables/VariablesTest.class.php | 16++++++++++++++++
10 files changed, 148 insertions(+), 25 deletions(-)

diff --git a/modules/cms/action/text/TextPreviewAction.class.php b/modules/cms/action/text/TextPreviewAction.class.php @@ -2,6 +2,11 @@ namespace cms\action\text; use cms\action\Method; use cms\action\TextAction; +use cms\base\Configuration; +use cms\generator\FileContext; +use cms\generator\FileGenerator; +use cms\generator\Producer; +use cms\model\File; class TextPreviewAction extends TextAction implements Method { @@ -9,9 +14,40 @@ class TextPreviewAction extends TextAction implements Method { public function view() { - $this->setTemplateVar('text', $this->text->loadValue()); + $fileContext = new FileContext($this->text->objectid, Producer::SCHEME_PREVIEW ); - parent::previewView(); + $generator = new FileGenerator( $fileContext); + + if ( $this->request->getAlphanum('encoding') == 'base64') + { + $encodingFunction = function($value) { + return base64_encode($value); + }; + $this->setTemplateVar('encoding', 'base64'); + } + else { + $encodingFunction = function($value) { + return $value; + }; + $this->setTemplateVar('encoding', 'none'); + } + + + // Unterscheidung, ob PHP-Code in der Datei ausgefuehrt werden soll. + $publishConfig = Configuration::subset('publish'); + $phpActive = ( $publishConfig->get('enable_php_in_file_content')=='auto' && $this->file->getRealExtension()=='php') || + $publishConfig->get('enable_php_in_file_content' )===true; + + if ( $phpActive ) { + + // PHP-Code ausfuehren + ob_start(); + require( $generator->getCache()->load()->getFilename() ); + $this->setTemplateVar('text',$encodingFunction(ob_get_contents()) ); + ob_end_clean(); + } + else + $this->setTemplateVar('text',$encodingFunction( $generator->getCache()->get() ) ); } public function post() { diff --git a/modules/cms/generator/BaseContext.class.php b/modules/cms/generator/BaseContext.class.php @@ -4,9 +4,32 @@ namespace cms\generator; +use cms\generator\link\PreviewLink; +use cms\generator\link\PublicLink; + abstract class BaseContext { + /** + * Scheme, + * one of PREVIEW or PUBLIC. + * @var int + */ public $scheme; public abstract function getCacheKey(); + + public abstract function getObjectId(); + + public function getLinkScheme() { + + switch( $this->scheme ) { + case Producer::SCHEME_PREVIEW: + return new PreviewLink( $this ); + case Producer::SCHEME_PUBLIC: + return new PublicLink( $this ); + default: + return null; + } + } + } \ No newline at end of file diff --git a/modules/cms/generator/FileContext.class.php b/modules/cms/generator/FileContext.class.php @@ -33,4 +33,10 @@ class FileContext extends BaseContext $this->scheme ]; } + + + public function getObjectId() + { + return $this->sourceObjectId; + } } \ No newline at end of file diff --git a/modules/cms/generator/FileGenerator.class.php b/modules/cms/generator/FileGenerator.class.php @@ -56,7 +56,7 @@ class FileGenerator extends BaseGenerator foreach(\util\ArrayUtils::getSubArray($totalSettings, array( 'filter')) as $filterEntry ) { - $filterName = ucfirst(strtolower(@$filterEntry['name'])); + $filterName = ucfirst(@$filterEntry['name']); $extension = @$filterEntry['extension']; if ( $extension && strtolower($extension) != strtolower($file->getRealExtension()) ) @@ -80,6 +80,7 @@ class FileGenerator extends BaseGenerator /** @var AbstractFilter $filter */ $filter = new $filterClassNameWithNS(); + $filter->context = $this->context; // Copy filter configuration to filter instance. foreach( $parameter as $parameterName=>$parameterValue) { diff --git a/modules/cms/generator/PageContext.class.php b/modules/cms/generator/PageContext.class.php @@ -57,17 +57,8 @@ class PageContext extends BaseContext } - - public function getLinkScheme() { - - switch( $this->scheme ) { - case Producer::SCHEME_PREVIEW: - return new PreviewLink( $this ); - case Producer::SCHEME_PUBLIC: - return new PublicLink( $this ); - default: - return null; - } + public function getObjectId() + { + return $this->sourceObjectId; } - } \ No newline at end of file diff --git a/modules/cms/generator/filter/AbstractFilter.class.php b/modules/cms/generator/filter/AbstractFilter.class.php @@ -3,7 +3,14 @@ namespace cms\generator\filter; +use cms\generator\BaseContext; + abstract class AbstractFilter implements Filter { + /** + * @var BaseContext + */ + public $context; + public abstract function filter( $value ); } \ No newline at end of file diff --git a/modules/cms/generator/filter/LinkToObjectsFilter.class.php b/modules/cms/generator/filter/LinkToObjectsFilter.class.php @@ -0,0 +1,37 @@ +<?php + + +namespace cms\generator\filter; + + +use cms\model\BaseObject; +use util\text\variables\VariableResolver; + +class LinkToObjectsFilter extends AbstractFilter +{ + public function filter($value) + { + $resolver = new VariableResolver(); + + $resolver->addResolver('link',function($key) { + + $targetId = intval( $key ); + + if ( $targetId ) { + + $from = new BaseObject( $this->context->getObjectId() ); + $from->load(); + $target = new BaseObject( $targetId ); + $target->load(); + + $linkScheme = $this->context->getLinkScheme(); + return $linkScheme->linkToObject( $from, $target ); + } else { + return ''; + } + }); + + return $resolver->resolveVariables( $value ); + } + +}+ \ No newline at end of file diff --git a/modules/cms/generator/link/PreviewLink.class.php b/modules/cms/generator/link/PreviewLink.class.php @@ -3,6 +3,7 @@ namespace cms\generator\link; use cms\action\RequestParams; +use cms\generator\BaseContext; use cms\generator\PageContext; use cms\model\Alias; use cms\model\BaseObject; @@ -19,15 +20,15 @@ use util\exception\GeneratorException; class PreviewLink implements LinkFormat { - private $pageContext; + private $context; /** * PublicLink constructor. - * @param $pageContext PageContext + * @param $context BaseContext */ - public function __construct($pageContext) + public function __construct($context) { - $this->pageContext = $pageContext; + $this->context = $context; } @@ -38,10 +39,14 @@ class PreviewLink implements LinkFormat public function linkToObject( BaseObject $from, BaseObject $to ) { - $param = array( - 'oid' => '__OID__'.$to->objectid.'__', - RequestParams::PARAM_MODEL_ID => $this->pageContext->modelId , - RequestParams::PARAM_LANGUAGE_ID => $this->pageContext->languageId ); + $param = [ + 'oid' => '__OID__'.$to->objectid.'__' + ]; + + if ( $this->context instanceof PageContext ) { + $param[ RequestParams::PARAM_MODEL_ID ] = $this->context->modelId; + $param[ RequestParams::PARAM_LANGUAGE_ID ] = $this->context->languageId; + } // Interne Verlinkungen in der Seitenvorschau switch( $to->typeid ) diff --git a/modules/util/text/variables/ValueExpression.class.php b/modules/util/text/variables/ValueExpression.class.php @@ -16,8 +16,8 @@ class ValueExpression */ public function __construct($prefix, $name, $default) { - $this->prefix = $prefix; - $this->name = $name; + $this->prefix = $prefix; + $this->name = $name; $this->default = $default; } } \ No newline at end of file diff --git a/modules/util/text/variables/VariablesTest.class.php b/modules/util/text/variables/VariablesTest.class.php @@ -23,6 +23,22 @@ SRC; $this->assertNotEmpty($res->resolveVariables( $example ) ); } + + /** + * Test variables with a prefix. + */ + public function testNamespaced() { + + $resolver = new VariableResolver(); + $resolver->addDefaultResolver( function($key) { return 'default'; } ); + $resolver->addResolver( 'name', function($key) { return 'me'; } ); + $resolver->addResolver( 'cms', function($key) { return 'orcms'; } ); + + $this->assertEquals( 'default',$resolver->resolveVariables('${x}') ); + $this->assertEquals( 'me',$resolver->resolveVariables('${name.x}') ); + $this->assertEquals( 'orcms',$resolver->resolveVariables('${cms.x}') ); + } + public function testSpecials() { $resolver = new VariableResolver();