Source of file FormScaffolder.php
Size: 8,212 Bytes - Last Modified: 2021-12-23T10:21:36+00:00
/var/www/docs.ssmods.com/process/src/src/Forms/FormScaffolder.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | <?php namespace SilverCart\Forms; use SilverCart\Admin\Controllers\ModelAdmin_ExclusiveRelationInterface; use SilverCart\Admin\Controllers\ModelAdmin_ReadonlyInterface; use SilverCart\Admin\Forms\GridField\GridFieldConfig_ExclusiveRelationEditor; use SilverCart\Admin\Forms\GridField\GridFieldConfig_Readonly; use SilverCart\Admin\Forms\GridField\GridFieldConfig_RelationEditor; use SilverCart\Model\Translation\TranslationExtension; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\Tab; use SilverStripe\Forms\TabSet; use SilverStripe\Forms\GridField\GridField; /** * Extension for every DataObject * * @package SilverCart * @subpackage Forms * @author Sebastian Diel <sdiel@pixeltricks.de> * @since 26.09.2017 * @copyright 2017 pixeltricks GmbH * @license see license file in modules root directory */ class FormScaffolder extends \SilverStripe\Forms\FormScaffolder { /** * Gets the form fields as defined through the metadata * on {@link $obj} and the custom parameters passed to FormScaffolder. * Depending on those parameters, the fields can be used in ajax-context, * contain {@link TabSet}s etc. * * Uses SilverCart\Admin\Forms\GridField\GridFieldConfig_RelationEditor and * SilverCart\Admin\Forms\GridField\GridFieldConfig_ExclusiveRelationEditor instead of * SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor. * * @return FieldList */ public function getFieldList() : FieldList { $fields = new FieldList(); $excludeFromScaffolding = []; if ($this->obj->hasMethod('excludeFromScaffolding')) { $excludeFromScaffolding = $this->obj->excludeFromScaffolding(); } // tabbed or untabbed if ($this->tabbed) { $fields->push(new TabSet("Root", $mainTab = new Tab("Main"))); $mainTab->setTitle(_t(__CLASS__ . '.TABMAIN', 'Main')); } // Add logical fields directly specified in db config foreach ($this->obj->config()->get('db') as $fieldName => $fieldType) { // Skip restricted fields if ($this->restrictFields && !in_array($fieldName, $this->restrictFields)) { continue; } // Skip excluded fields if (in_array($fieldName, $excludeFromScaffolding)) { continue; } // @todo Pass localized title if ($this->fieldClasses && isset($this->fieldClasses[$fieldName])) { $fieldClass = $this->fieldClasses[$fieldName]; $fieldObject = new $fieldClass($fieldName); } else { $fieldObject = $this ->obj ->dbObject($fieldName) ->scaffoldFormField(null, $this->getParamsArray()); } // Allow fields to opt-out of scaffolding if (!$fieldObject) { continue; } $fieldObject->setTitle($this->obj->fieldLabel($fieldName)); if ($this->tabbed) { $fields->addFieldToTab("Root.Main", $fieldObject); } else { $fields->push($fieldObject); } } // add has_one relation fields if ($this->obj->hasOne()) { foreach ($this->obj->hasOne() as $relationship => $component) { if ($this->restrictFields && !in_array($relationship, $this->restrictFields)) { continue; } // Skip excluded fields if (in_array($relationship, $excludeFromScaffolding)) { continue; } $fieldName = $component === 'SilverStripe\\ORM\\DataObject' ? $relationship // Polymorphic has_one field is composite, so don't refer to ID subfield : "{$relationship}ID"; if ($this->fieldClasses && isset($this->fieldClasses[$fieldName])) { $fieldClass = $this->fieldClasses[$fieldName]; $hasOneField = new $fieldClass($fieldName); } else { $hasOneField = $this->obj->dbObject($fieldName)->scaffoldFormField(null, $this->getParamsArray()); } if (empty($hasOneField)) { continue; // Allow fields to opt out of scaffolding } $hasOneField->setTitle($this->obj->fieldLabel($relationship)); if ($this->tabbed) { $fields->addFieldToTab("Root.Main", $hasOneField); } else { $fields->push($hasOneField); } } } // only add relational fields if an ID is present if ($this->obj->ID) { // add has_many relation fields if ($this->obj->hasMany() && ($this->includeRelations === true || isset($this->includeRelations['has_many'])) ) { foreach ($this->obj->hasMany() as $relationship => $component) { // Skip excluded fields if (in_array($relationship, $excludeFromScaffolding)) { continue; } if ($this->tabbed) { $fields->findOrMakeTab( "Root.$relationship", $this->obj->fieldLabel($relationship) ); } $fieldClass = (isset($this->fieldClasses[$relationship])) ? $this->fieldClasses[$relationship] : GridField::class; if (singleton($component) instanceof ModelAdmin_ReadonlyInterface) { $config = GridFieldConfig_Readonly::create(); } elseif (singleton($component) instanceof ModelAdmin_ExclusiveRelationInterface || $this->obj->has_extension($this->obj->$relationship()->dataClass(), TranslationExtension::class)) { $config = GridFieldConfig_ExclusiveRelationEditor::create(); } else { $config = GridFieldConfig_RelationEditor::create(); } /** @var GridField $grid */ $grid = Injector::inst()->create( $fieldClass, $relationship, $this->obj->fieldLabel($relationship), $this->obj->$relationship(), $config ); if ($this->tabbed) { $fields->addFieldToTab("Root.$relationship", $grid); } else { $fields->push($grid); } } } if ($this->obj->manyMany() && ($this->includeRelations === true || isset($this->includeRelations['many_many'])) ) { foreach ($this->obj->manyMany() as $relationship => $component) { // Skip excluded fields if (in_array($relationship, $excludeFromScaffolding)) { continue; } static::addManyManyRelationshipFields( $fields, $relationship, (isset($this->fieldClasses[$relationship])) ? $this->fieldClasses[$relationship] : null, $this->tabbed, $this->obj ); } } } return $fields; } /** * Return an array suitable for passing on to {@link DBField->scaffoldFormField()} * without tying this call to a FormScaffolder interface. * Adds a reference to the context object. * * @return array */ protected function getParamsArray() : array { return array_merge(parent::getParamsArray(), [ 'object' => $this->obj ]); } } |