/** * Generate \Plethora\Form instance which is based on Model. * * @access public * @return Form * @since 1.0.0-alpha * @version 1.0.0-alpha */ public function generate() { $oConfigFromLocales = NULL; $aDefaultValues = []; $aFieldsFromConfigLocales = []; $oModel = $this->getModel(); $oMetadata = $oModel->getMetadata(); $oMetadataLocales = $oModel->getLocalesMetadata(); $bHasLocales = $oModel->hasLocales(); if ($this->getModel()->hasLocales()) { /* @var $oConfigFromLocales MConfig */ $oConfigFromLocales = call_user_func($this->getModel()->getLocalesClass() . '::getConfig'); $aFieldsFromConfigLocales = $oConfigFromLocales->getFieldsNames(); } $aFieldsFromConfig = array_unique(array_merge($this->getModel()->getConfig()->getFieldsNames(), $aFieldsFromConfigLocales)); // get all default values from model foreach ($aFieldsFromConfig as $sField) { $mValueFromForm = NULL; $sFieldModel = $oMetadata->getFieldName($sField); $sFieldLocales = $oMetadataLocales !== FALSE ? $oMetadataLocales->getFieldName($sField) : NULL; // associations fields from model if ($oMetadata->hasAssociation($sFieldModel)) { $mValuesFromModel = $this->getModel()->{$sFieldModel}; if ($mValuesFromModel !== NULL) { // persistend collection if ($mValuesFromModel instanceof ORM\PersistentCollection || $mValuesFromModel instanceof Doctrine\Common\Collections\ArrayCollection) { $aValuesToOverwrite = []; foreach ($mValuesFromModel as $oModelRow) { /* @var $oModelRow ModelCore */ $aValuesToOverwrite[] = $oModelRow; } $mValueFromForm = ['und' => $aValuesToOverwrite]; unset($aValuesToOverwrite); } else { $mValueFromForm = ['und' => [$mValuesFromModel]]; } } } elseif ($bHasLocales && $oMetadataLocales->hasAssociation($sFieldLocales)) { $aValuesInAllLangs = $this->getModel()->getLocales('all'); foreach ($aValuesInAllLangs as $oLocaleModel) { /* @var $oLocaleModel \Plethora\ModelCore\Locales */ $sLang = $oLocaleModel->getLanguage(); $mValuesFromModel = $oLocaleModel->{$sFieldLocales}; if ($mValuesFromModel !== NULL) { if ($mValuesFromModel instanceof ORM\PersistentCollection || $mValuesFromModel instanceof Doctrine\Common\Collections\ArrayCollection) { // persistend collection $aValuesToOverwrite = []; foreach ($mValuesFromModel as $oModelRow) { /* @var $oModelRow ModelCore */ $aValuesToOverwrite[] = $oModelRow; } $mValueFromForm[$sLang] = $aValuesToOverwrite; unset($aValuesToOverwrite); } else { // single associacion $mValueFromForm[$sLang] = [$mValuesFromModel]; } } } } elseif ($oMetadata->hasField($sFieldModel)) { $mValueFromModel = $this->getModel()->{$sFieldModel}; if ($mValueFromModel !== NULL) { $mValueFromForm = ['und' => is_array($mValueFromModel) ? $mValueFromModel : [$mValueFromModel]]; } unset($mValueFromModel); } elseif ($bHasLocales && $oMetadataLocales->hasField($sFieldLocales)) { $mValueFromForm = []; foreach (Router::getLangs() as $sLang) { $mValueFromForm[$sLang] = []; } foreach ($this->getModel()->getLocales('all') as $oLocales) { /* @var $oLocales \Plethora\ModelCore\Locales */ if ($oLocales->{$sField} !== NULL) { $mValueFromLocale = $oLocales->{$sFieldLocales}; $mValueFromForm[$oLocales->getLanguage()] = is_array($mValueFromLocale) ? $mValueFromLocale : [$oLocales->{$sField}]; unset($mValueFromLocale); } } } // set default values $aDefaultValues[$sField] = $mValueFromForm; // unset temporary variable unset($mValueFromForm); } // creating form object $oForm = new Form($this->getName() . '_form', $aDefaultValues); $oForm->setRelationWithModel($this->getModel()); // create list of fields if ($this->getConfig() !== NULL) { // limit fields to particular list if ($this->getConfig()->getFieldsRestriction() !== []) { $aFieldsFromConfig = array_intersect($aFieldsFromConfig, $this->getConfig()->getFieldsRestriction()); } // remove particular fields from fields list if ($this->getConfig()->getFieldsToRemove() !== []) { foreach ($this->getConfig()->getFieldsToRemove() as $sFieldToRemove) { $mSearchedKey = array_search($sFieldToRemove, $aFieldsFromConfig); if ($mSearchedKey !== FALSE) { unset($aFieldsFromConfig[$mSearchedKey]); } } } } // create form fields and assign them to the form foreach ($aFieldsFromConfig as $sField) { $aMappings = []; $sFieldModel = $oMetadata->getFieldName($sField); $sFieldLocales = $oMetadataLocales !== FALSE ? $oMetadataLocales->getFieldName($sField) : NULL; // get form field if ($bHasLocales && $oConfigFromLocales->hasField($sField)) { $oField = $oConfigFromLocales->getField($sField); } else { $oField = $this->getModel()->getConfig()->getField($sField); } // if it's "add" form, remove "disabled" attribute if ($this->getName() === 'add' && $oField->isDisabled()) { $oField->getAttributes()->removeAttribute('disabled'); } // setting flag if particular field is multilanguaged if ($bHasLocales && !$oMetadata->hasField($sFieldModel) && ($oMetadataLocales->hasField($sFieldLocales) || $oMetadataLocales->hasAssociation($sFieldLocales))) { $oField->setMultilanguage(); } // add field to singleton form $oForm->addSingleton($oField); // adding new additional rules based on annotations from Doctrine ORM if ($oMetadata->hasField($sFieldModel)) { $aMappings = $oMetadata->getFieldMapping($sFieldModel); } elseif ($bHasLocales && $oMetadataLocales->hasField($sFieldLocales)) { $aMappings = $oMetadataLocales->getFieldMapping($sFieldLocales); } // add validation rules by mapping $this->addValidationByMapping($oField, $aMappings); } // alter form $this->alterForm($oForm); // make other, custom operations on Form object if ($oForm->isSubmitted()) { $this->beforeFormValidation($oForm); } // if form is submitted and valid if (!$this->getConfig()->isManualValidation() && $oForm->isSubmittedAndValid()) { $this->sendDataToModel($oForm); } return $oForm; }