id = 'field-'.$name; $this->name = $name; $this->label = $label; $this->viewName = $viewName; } // setting attributes via magic method public function __call($method, $args) { static $cssProps = [ 'height', 'minHeight', 'maxHeight' ]; if (empty($args)) $args = [null]; $arg = $args[0]; // css $lccamel = $method; if (in_array($lccamel, $cssProps)) { return $this->css(kebab_case($lccamel), $arg); } if (property_exists($this, $method)) { $this->$method = $arg; } else { $this->attributesArray[kebab_case($method)] = $arg; } return $this; } /** Explicitly set a CSS rule */ public function css($prop, $val) { $this->styleArray[$prop] = $val; return $this; } /** Explicitly set an attribute */ public function attr($attr, $val) { $this->attributesArray[$attr] = $val; return $this; } /** Configure a text field for automatic alias generation */ public function autoAlias($targetName, $delimiter='_') { return $this->attr('data-autoalias', $targetName)->attr('data-aa-delimiter', $delimiter); } /** Apply a given layout (bootstrap grid, 12 cols total) */ public function layout($labelCols, $fieldCols) { $this->labelCols = $labelCols; $this->fieldCols = $fieldCols; return $this; } public function __get($name) { if ($name == 'attributes') { return $this->compileAttribs(); } if ($name == 'value') { return old($this->name, $this->value); } if (property_exists($this, $name)) { return $this->$name; } return null; } public function compileAttribs() { // compile attribs string $attribs_s = array_reduce(array_keys($this->attributesArray), function ($carry, $key) { if ($this->attributesArray[$key] === null) { // simple attribs like 'required' return $carry . ' ' . $key; } else { return $carry . ' ' . $key . '="' . e($this->attributesArray[$key]) . '"'; } }, ''); // add a compiled list of styles if (!empty($this->styleArray)) { $attribs_s .= ' style="'.trim(e(array_reduce(array_keys($this->styleArray), function ($carry, $key) { return $carry . $key . ': ' . $this->styleArray[$key] . '; '; }, ''))).'"'; } return trim($attribs_s); } public function render() { return view('form.'.$this->viewName)->with(['w' => $this]); } public function __toString() { return (string) $this->render(); } }