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:
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();