Example #1
0
 /**
  * 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;
 }