public function updateCMSFlexiTabs(TabSet $fields, TabSet $settings_tab, $flexi)
 {
     parent::updateCMSFlexiTabs($fields, $settings_tab, $flexi);
     // Submissions
     //////////////
     $submissions_tab = new Tab('Submissions');
     $fields->insertBefore($submissions_tab, 'Settings');
     $submissions_tab->push(new GridField('FlexiFormSubmissions', 'Submissions', $this->getFormSubmissions($flexi), new GridFieldConfig_FlexiFormSubmission($flexi)));
 }
 public function onAfterWrite()
 {
     $conf = $this->FlexiFormConf();
     // ensure valid config
     //////////////////////
     if (!$conf->exists()) {
         if ($name = $this->getFlexiFormDefaultHandlerName()) {
             if ($handler = FlexiFormHandler::get()->filter('HandlerName', $name)->first()) {
                 $conf->HandlerID = $handler->ID;
             }
         }
         $conf->FlexiFormID = $this->owner->ID;
         $conf->FlexiFormClass = $this->owner->class;
         $conf->write();
         $this->owner->FlexiFormConfigID = $conf->ID;
         $this->owner->write();
     }
     // initialize fields on new forms
     /////////////////////////////////
     if (!$this->FlexiFormConf('InitializedFields')) {
         $definitions = $this->getFlexiFormInitialFields();
         if (!empty($definitions)) {
             $fields = $this->owner->FlexiFormFields();
             foreach ($definitions as $definition) {
                 if (!is_array($definition) || !isset($definition['Name']) || !isset($definition['Type'])) {
                     throw new ValidationException('Initial Field Definitions must be an associative array, with at least Name and Type provided.');
                 }
                 // lookup field name, prioritizing Readonly fields
                 if (!($field = FlexiFormField::get()->sort('Readonly', 'DESC')->filter(array('FieldName' => $definition['Name'], 'ClassName' => $definition['Type']))->first())) {
                     $field = FlexiFormUtil::CreateFlexiField($definition['Type'], $definition);
                 }
                 $extraFields = array();
                 foreach (array_intersect_key($definition, $fields->getExtraFields()) as $property => $value) {
                     $extraFields[$property] = $value;
                 }
                 $fields->add($field, $extraFields);
             }
             $conf->InitializedFields = true;
             $conf->write();
         }
     }
     // seed Form Identifier
     ///////////////////////
     if (!$this->FlexiFormID()) {
         $conf = $this->FlexiFormConf();
         // @TODO perhaps base on title of extended object??
         $conf->FormIdentifier = "{$this->owner->class}_{$this->owner->ID}";
         $conf->write();
     }
     return parent::onAfterWrite();
 }
 public static function AutoCreateFlexiHandler($className, $definition)
 {
     // Handler Names are Unique.
     $filter = array('HandlerName' => $definition['Name']);
     // only create handler it doesn't yet exist
     if (!FlexiFormHandler::get()->filter($filter)->first()) {
         if ($obj = FlexiFormUtil::CreateFlexiHandler($className, $definition)) {
             DB::alteration_message("flexiform - Created {$className} named `{$obj->HandlerName}`.", "created");
         }
     }
 }