From 1d0dc756b60d40e564839290a39b1d5b5fbe390b Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 25 Oct 2019 10:06:18 -0400 Subject: [PATCH] Add support for custom type-specific Inputfield classes and attributes to be added via markup array in InputfieldWrapper --- wire/core/InputfieldWrapper.php | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/wire/core/InputfieldWrapper.php b/wire/core/InputfieldWrapper.php index db8cc7ac..e3fd45b7 100644 --- a/wire/core/InputfieldWrapper.php +++ b/wire/core/InputfieldWrapper.php @@ -424,6 +424,34 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre return $children; } + /** + * Cached class parents indexed by Inputfield class name + * + * @var array + * + */ + static protected $classParents = array(); + + /** + * Get array of parent Inputfield classes for given Inputfield (excluding the base Inputfield class) + * + * @param Inputfield|string $inputfield + * @return array + * + */ + protected function classParents($inputfield) { + $p = &self::$classParents; + $c = is_object($inputfield) ? $inputfield->className() : $inputfield; + if(!isset($p[$c])) { + $p[$c] = array(); + foreach(wireClassParents($inputfield) as $parentClass) { + if(strpos($parentClass, 'Inputfield') !== 0 || $parentClass === 'Inputfield') break; + $p[$c][] = $parentClass; + } + } + return $p[$c]; + } + /** * Render this Inputfield and the output of its children. * @@ -483,6 +511,24 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre if($collapsed == Inputfield::collapsedHidden) continue; if($collapsed == Inputfield::collapsedNoLocked || $collapsed == Inputfield::collapsedYesLocked) $renderValueMode = true; + + // allow adding custom classes and/or attributes at runtime (since 3.0.143) + $classParents = $this->classParents($inputfield); + $classParents[] = $inputfieldClass; + foreach($classParents as $classParent) { + if(!isset($_markup[$classParent])) continue; + $markupParent = $_markup[$classParent]; + foreach(array('class', 'wrapClass', 'headerClass', 'contentClass') as $classKey) { + if(!empty($markupParent[$classKey])) $inputfield->addClass($markupParent[$classKey], $classKey); + } + foreach(array('attr', 'wrapAttr') as $attrKey) { + if(!empty($markupParent[$attrKey]) && is_array($markupParent[$attrKey])) { + foreach($markupParent[$attrKey] as $k => $v) { + $inputfield->$attrKey($k, $v); + } + } + } + } $ffOut = $this->renderInputfield($inputfield, $renderValueMode); if(!strlen($ffOut)) continue;