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"); } } }