Source of file DependentGroupedDropdownField.php
Size: 3,480 Bytes - Last Modified: 2021-12-24T06:48:21+00:00
/var/www/docs.ssmods.com/process/src/src/Forms/DependentGroupedDropdownField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | <?php namespace Fromholdio\DependentGroupedDropdownField\Forms; use SilverStripe\Control\HTTPResponse; use SilverStripe\Core\Convert; use SilverStripe\Forms\FormField; use SilverStripe\Forms\GroupedDropdownField; use SilverStripe\ORM\Map; use SilverStripe\View\Requirements; class DependentGroupedDropdownField extends GroupedDropdownField { private static $allowed_actions = [ 'load' ]; protected $depends; protected $unselected; protected $sourceCallback; public function __construct($name, $title = null, ?callable $source = null, $value = '', $form = null, $emptyString = null) { parent::__construct($name, $title, [], $value); if (is_null($source)) { throw new \UnexpectedValueException( 'You must provide a callable $source value to ' . static::class . '.' ); } // we are unable to store Closure as a normal source $this->sourceCallback = $source; $this ->addExtraClass('dependent-grouped-dropdown') ->addExtraClass('groupeddropdown') ->addExtraClass('dropdown'); } public function load($request) { $response = new HTTPResponse(); $response->addHeader('Content-Type', 'application/json'); $items = call_user_func($this->sourceCallback, $request->getVar('val')); $results = []; if ($items) { foreach ($items as $k => $v) { $results[] = ['k' => $k, 'v' => $v]; } } $response->setBody(Convert::array2json($results)); return $response; } public function getDepends() { return $this->depends; } public function setDepends(FormField $field) { $this->depends = $field; return $this; } public function getUnselectedString() { return $this->unselected; } public function setUnselectedString($string) { $this->unselected = $string; return $this; } public function getSource() { $val = $this->depends->Value(); if ( !$val && method_exists($this->depends, 'getHasEmptyDefault') && !$this->depends->getHasEmptyDefault() ) { $dependsSource = array_keys($this->depends->getSource()); $val = isset($dependsSource[0]) ? $dependsSource[0] : null; } if (!$val) { $source = []; } else { $source = call_user_func($this->sourceCallback, $val); if ($source instanceof Map) { $source = $source->toArray(); } } if ($this->getHasEmptyDefault()) { return ['' => $this->getEmptyString()] + (array) $source; } else { return $source; } } public function Field($properties = []) { Requirements::javascript('fromholdio/silverstripe-dependentgroupeddropdownfield:client/js/dependentgroupeddropdown.js'); $this->setAttribute('data-link', $this->Link('load')); $this->setAttribute('data-depends', $this->getDepends()->getName()); $this->setAttribute('data-empty', $this->getEmptyString()); $this->setAttribute('data-unselected', $this->getUnselectedString()); return parent::Field($properties); } public function Type() { return 'dependentgroupeddropdown groupeddropdown dropdown'; } } |