1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-16 19:54:24 +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) { 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 ''; if($this->skipLabel & self::skipLabelBlank) return '';
return $this->attributes['name']; return $this->attributes['name'];
} }
if($key == 'attributes') return $this->attributes; if($key === 'name' || $key === 'value' || $key === 'id') return $this->getAttribute($key);
if($key == 'parent') return $this->parent; if($key === 'attributes') return $this->attributes;
if($key === 'parent') return $this->parent;
if(($value = $this->wire($key)) !== null) return $value; if(($value = $this->wire($key)) !== null) return $value;
if(array_key_exists($key, $this->attributes)) return $this->attributes[$key]; if(array_key_exists($key, $this->attributes)) return $this->attributes[$key];
return parent::get($key); return parent::get($key);

View File

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