1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-16 03:34:33 +02:00

Update InputfieldWrapper so that it supports the "name=field_name" => [ settings ] calls for setMarkup(), like in LoginRegisterPro

This commit is contained in:
Ryan Cramer
2020-04-13 16:18:19 -04:00
parent 00de278dc7
commit ff6ec3b1b5
2 changed files with 36 additions and 23 deletions

View File

@@ -466,12 +466,15 @@ abstract class Inputfield extends WireData implements Module {
*
*/
public function get($key) {
if($key == 'label' && !parent::get('label')) {
if($key === 'label') {
$value = parent::get('label');
if(strlen($value)) return $value;
if($this->skipLabel & self::skipLabelBlank) return '';
return $this->attributes['name'];
}
if($key == 'attributes') return $this->attributes;
if($key == 'parent') return $this->parent;
if($key === 'name' || $key === 'value' || $key === 'id') return $this->getAttribute($key);
if($key === 'attributes') return $this->attributes;
if($key === 'parent') return $this->parent;
if(($value = $this->wire($key)) !== null) return $value;
if(array_key_exists($key, $this->attributes)) return $this->attributes[$key];
return parent::get($key);

View File

@@ -459,26 +459,32 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
*
* @param Inputfield $inputfield
* @param array $markup
* @param array $classes
* @since 3.0.144
*
*/
private function attributeInputfield(Inputfield $inputfield, &$markup) {
private function attributeInputfield(Inputfield $inputfield, &$markup, &$classes) {
$inputfieldClass = $inputfield->className();
$markupTemplate = array('attr' => array(), 'wrapAttr' => array());
$classParents = $this->classParents($inputfield);
$classParents[] = $inputfieldClass;
$markupTemplate = array('attr' => array(), 'wrapAttr' => array(), 'set' => array());
$markupKeys = array($inputfieldClass, "name=$inputfield->name", "id=$inputfield->id");
$classKeys = array('class', 'wrapClass', 'headerClass', 'contentClass');
$classes = array();
$addClasses = array();
$attr = array();
$wrapAttr = array();
$sets = array();
foreach($markupKeys as $key) {
if(isset($markup[$key])) $markup = array_merge($markup, $markup[$key]);
if(isset($classes[$key])) $classes = array_merge($classes, $classes[$key]);
}
foreach($classParents as $classParent) {
if(!isset($markup[$classParent])) continue;
$markupParent = array_merge($markupTemplate, $markup[$classParent]);
foreach(array_merge($this->classParents($inputfield), $markupKeys) as $key) {
if(!isset($markup[$key])) continue;
$markupParent = array_merge($markupTemplate, $markup[$key]);
foreach($classKeys as $classKey) {
if(!empty($markupParent[$classKey])) {
$classes[$classKey] = $markupParent[$classKey];
$addClasses[$classKey] = $markupParent[$classKey];
}
}
foreach($markupParent['attr'] as $k => $v) {
@@ -487,6 +493,9 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
foreach($markupParent['wrapAttr'] as $k => $v) {
$wrapAttr[$k] = $v;
}
foreach($markupParent['set'] as $k => $v) {
$sets[$k] = $v;
}
}
foreach($attr as $attrName => $attrVal) {
@@ -495,9 +504,12 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
foreach($wrapAttr as $attrName => $attrVal) {
$inputfield->wrapAttr($attrName, $attrVal);
}
foreach($classes as $classKey => $class) {
foreach($addClasses as $classKey => $class) {
$inputfield->addClass($class, $classKey);
}
foreach($sets as $setName => $setVal) {
$inputfield->set($setName, $setVal);
}
}
/**
@@ -546,10 +558,9 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
}
if($skip && !empty($parents)) continue;
}
$inputfieldClass = $inputfield->className();
$markup = isset($_markup[$inputfieldClass]) ? array_merge($_markup, $_markup[$inputfieldClass]) : $_markup;
$classes = isset($_classes[$inputfieldClass]) ? array_merge($_classes, $_classes[$inputfieldClass]) : $_classes;
list($markup, $classes) = array($_markup, $_classes);
$this->attributeInputfield($inputfield, $markup, $classes);
$renderValueMode = $this->getSetting('renderValueMode');
$collapsed = (int) $inputfield->getSetting('collapsed');
@@ -560,7 +571,6 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
if($collapsed == Inputfield::collapsedHidden) continue;
if($collapsed == Inputfield::collapsedNoLocked || $collapsed == Inputfield::collapsedYesLocked) $renderValueMode = true;
$this->attributeInputfield($inputfield, $_markup);
$ffOut = $this->renderInputfield($inputfield, $renderValueMode);
if(!strlen($ffOut)) continue;
$collapsed = (int) $inputfield->getSetting('collapsed'); // retrieve again after render
@@ -610,11 +620,11 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
// The inputfield classname is always used in its wrapping element
$ffAttrs = array(
'class' => str_replace(
array('{class}', '{name}'),
array($inputfield->className(), $inputfield->attr('name')
),
$classes['item'])
);
array('{class}', '{name}'),
array($inputfield->className(), $inputfield->attr('name')
),
$classes['item'])
);
if($inputfield instanceof InputfieldItemList) $ffAttrs['class'] .= " InputfieldItemList";
if($collapsed) $ffAttrs['class'] .= " collapsed$collapsed";