From 304fc28268c9c2fbac56deef5ec7113851235125 Mon Sep 17 00:00:00 2001 From: Yuriy Bakhtin Date: Tue, 28 Mar 2023 08:54:38 +0300 Subject: [PATCH] Fix compatible `AssetVariable::offsetGet()` between different PHP versions --- modules/template/models/AssetVariable.php | 2 + .../template/models/AssetVariablePhp74.php | 62 +++++++++++++++++++ modules/template/models/Template.php | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 modules/template/models/AssetVariablePhp74.php diff --git a/modules/template/models/AssetVariable.php b/modules/template/models/AssetVariable.php index d587a4a4..31e2bee3 100644 --- a/modules/template/models/AssetVariable.php +++ b/modules/template/models/AssetVariable.php @@ -9,6 +9,8 @@ * * A OwnerContent instance is used to assign a TemplateElement to a specific * Content of a specific type. + * + * @warning Compatible only with PHP8.0+, Don't use for PHP versions <= 7.4! */ class AssetVariable implements \ArrayAccess { diff --git a/modules/template/models/AssetVariablePhp74.php b/modules/template/models/AssetVariablePhp74.php new file mode 100644 index 00000000..2628a538 --- /dev/null +++ b/modules/template/models/AssetVariablePhp74.php @@ -0,0 +1,62 @@ +getModule(); + if($module->isPublished($path)) { + return $this->getModule()->getPublishedUrl($path); + } + return ''; + } + + private function getModule() + { + if($this->module == null) { + $this->module = Yii::$app->getModule('custom_pages'); + } + return $this->module; + } + + public function __toString() + { + return ''; + } + + public function offsetExists($offset): bool + { + return true; + } + + public function offsetGet($offset) + { + return $this->get($offset); + } + + public function offsetSet($offset, $value): void + { + } + + public function offsetUnset($offset): void + { + } + +} diff --git a/modules/template/models/Template.php b/modules/template/models/Template.php index 72f72fd0..b325239e 100644 --- a/modules/template/models/Template.php +++ b/modules/template/models/Template.php @@ -207,7 +207,7 @@ public function render(ActiveRecord $owner = null, $editMode = false, $container $content[$contentElement->element_name] = new OwnerContentVariable(['ownerContent' => $contentElement, 'options' => $options]); } - $content['assets'] = new AssetVariable(); + $content['assets'] = PHP_VERSION_ID >= 80000 ? new AssetVariable() : new AssetVariablePhp74(); if($containerItem) { //$content['item'] = new ContainerItemVariable(['item' => $containerItem]);