From 8910983c8e62be4d4c056b742f9dbd867b7db434 Mon Sep 17 00:00:00 2001 From: nathangray Date: Thu, 17 Dec 2020 09:17:38 -0700 Subject: [PATCH] Etemplate: Fix for some attributes not getting set --- .../etemplate/et2_extension_customfields.js | 4 +-- .../etemplate/et2_extension_customfields.ts | 4 +-- api/src/Etemplate/Widget.php | 4 +-- api/src/Etemplate/Widget/Customfields.php | 30 +++++++++++++------ 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/api/js/etemplate/et2_extension_customfields.js b/api/js/etemplate/et2_extension_customfields.js index ce2ef9e254..89ae9184d1 100644 --- a/api/js/etemplate/et2_extension_customfields.js +++ b/api/js/etemplate/et2_extension_customfields.js @@ -119,7 +119,7 @@ var et2_customfields_list = /** @class */ (function (_super) { if (!this.options || !this.options.customfields) return; // Already set up - avoid duplicates in nextmatch - if (this.getType() == 'customfields-list' && !this.isInTree()) + if (this.getType() == 'customfields-list' && !this.isInTree() && Object.keys(this.widgets).length > 0) return; if (!jQuery.isEmptyObject(this.widgets)) return; @@ -282,7 +282,7 @@ var et2_customfields_list = /** @class */ (function (_super) { // Make sure widget is created, and has the needed function if (!this.widgets[field_name] || !this.widgets[field_name].set_value) continue; - var value = _value[this.options.prefix + field_name] ? _value[et2_customfields_list.PREFIX + field_name] : null; + var value = _value[this.options.prefix + field_name] ? _value[this.options.prefix + field_name] : null; // Check if ID was missing if (value == null && this.id == et2_customfields_list.DEFAULT_ID && this.getArrayMgr("content").getEntry(this.options.prefix + field_name)) { value = this.getArrayMgr("content").getEntry(this.options.prefix + field_name); diff --git a/api/js/etemplate/et2_extension_customfields.ts b/api/js/etemplate/et2_extension_customfields.ts index 34207a96df..2d1a8f0ac7 100644 --- a/api/js/etemplate/et2_extension_customfields.ts +++ b/api/js/etemplate/et2_extension_customfields.ts @@ -189,7 +189,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac if(!this.options || !this.options.customfields) return; // Already set up - avoid duplicates in nextmatch - if(this.getType() == 'customfields-list' && !this.isInTree()) return; + if(this.getType() == 'customfields-list' && !this.isInTree() && Object.keys(this.widgets).length > 0) return; if(!jQuery.isEmptyObject(this.widgets)) return; // Check for global setting changes (visibility) @@ -391,7 +391,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac // Make sure widget is created, and has the needed function if(!this.widgets[field_name] || !this.widgets[field_name].set_value) continue; - let value = _value[this.options.prefix + field_name] ? _value[et2_customfields_list.PREFIX + field_name] : null; + let value = _value[this.options.prefix + field_name] ? _value[this.options.prefix + field_name] : null; // Check if ID was missing if(value == null && this.id == et2_customfields_list.DEFAULT_ID && this.getArrayMgr("content").getEntry(this.options.prefix + field_name)) diff --git a/api/src/Etemplate/Widget.php b/api/src/Etemplate/Widget.php index faba8b99d2..b706dfd4d0 100644 --- a/api/src/Etemplate/Widget.php +++ b/api/src/Etemplate/Widget.php @@ -195,7 +195,7 @@ class Widget $template = $this; while($reader->moveToNextAttribute()) { - if ($reader->name != 'id' && $template->attr[$reader->name] != $reader->value) + if ($reader->name != 'id' && $template->attr[$reader->name] !== $reader->value) { if (!$cloned) { @@ -209,7 +209,7 @@ class Widget // expand attributes values, otherwise eg. validation can not use attrs referencing to content if ($value[0] == '@' || strpos($value, '$cont') !== false) { - $value = self::expand_name($value, null, null, null, null, + $template->attrs[$reader->name] = $value = self::expand_name($value, null, null, null, null, isset(self::$cont) ? self::$cont : self::$request->content); } diff --git a/api/src/Etemplate/Widget/Customfields.php b/api/src/Etemplate/Widget/Customfields.php index e2a89778b7..6aa0cecb81 100644 --- a/api/src/Etemplate/Widget/Customfields.php +++ b/api/src/Etemplate/Widget/Customfields.php @@ -78,6 +78,7 @@ class Customfields extends Transformer public function __construct($xml) { + $this->attrs['prefix'] = self::$prefix; parent::__construct($xml); } @@ -124,7 +125,7 @@ class Customfields extends Transformer $customfields =& $this->getElementAttribute(self::GLOBAL_VALS, 'customfields'); } - if(!$app) + if(!$app && !$customfields) { $app =& $this->setElementAttribute(self::GLOBAL_VALS, 'app', $GLOBALS['egw_info']['flags']['currentapp']); if ($this->attrs['sub-app']) $app .= '-'.$this->attrs['sub-app']; @@ -138,6 +139,10 @@ class Customfields extends Transformer // app changed $customfields =& Api\Storage\Customfields::get($app); } + if($this->attrs['customfields']) + { + $customfields = $this->attrs['customfields']; + } // Filter fields if($this->attrs['field-names']) { @@ -174,20 +179,20 @@ class Customfields extends Transformer // Rmove fields for none private cutomfields when name refers to a single custom field $matches = null; - if (($pos=strpos($form_name,self::$prefix)) !== false && - preg_match($preg = '/'.self::$prefix.'([^\]]+)/',$form_name,$matches) && !isset($fields[$name=$matches[1]])) + if (($pos=strpos($form_name,$this->attrs['prefix'])) !== false && + preg_match($preg = '/'.$this->attrs['prefix'].'([^\]]+)/',$form_name,$matches) && !isset($fields[$name=$matches[1]])) { unset($fields[$key]); } } // check if name refers to a single custom field --> show only that $matches = null; - if (($pos=strpos($form_name,self::$prefix)) !== false && // allow the prefixed name to be an array index too - preg_match($preg = '/'.self::$prefix.'([^\]]+)/',$form_name,$matches) && isset($fields[$name=$matches[1]])) + if (($pos=strpos($form_name,$this->attrs['prefix'])) !== false && // allow the prefixed name to be an array index too + preg_match($preg = '/'.$this->attrs['prefix'].'([^\]]+)/',$form_name,$matches) && isset($fields[$name=$matches[1]])) { $fields = array($name => $fields[$name]); - $value = array(self::$prefix.$name => $value); - $form_name = self::$prefix.$name; + $value = array($this->attrs['prefix'].$name => $value); + $form_name = $this->attrs['prefix'].$name; } if(!is_array($fields)) $fields = array(); @@ -216,7 +221,7 @@ class Customfields extends Transformer { if (!empty($this->attrs['sub-type']) && !empty($field['type2']) && strpos(','.$field['type2'].',',','.$field['type2'].',') === false) continue; // not for our content type// - if (isset($value[self::$prefix.$lname]) && $value[self::$prefix.$lname] !== '') //break; + if (isset($value[$this->attrs['prefix'].$lname]) && $value[$this->attrs['prefix'].$lname] !== '') //break; { $fields_with_vals[]=$lname; } @@ -400,7 +405,14 @@ class Customfields extends Transformer // if we have no id / use self::GLOBAL_ID, we have to set $value_in in global namespace for regular widgets validation to find if (!$this->id) $content = array_merge($content, $value_in); //error_log(__METHOD__."($cname, ...) form_name=$form_name, use-private={$this->attrs['use-private']}, value_in=".array2string($value_in)); - $customfields =& $this->getElementAttribute(self::GLOBAL_VALS, 'customfields'); + if($this->getElementAttribute($form_name, 'customfields')) + { + $customfields =& $this->getElementAttribute($form_name, 'customfields'); + } + else + { + $customfields =& $this->getElementAttribute(self::GLOBAL_VALS, 'customfields'); + } if(is_array($value_in)) { foreach(array_keys($value_in) as $field)