예제 #1
0
 /**
  * Check if a email field is in the fields array
  * @param $emailField
  * @param $fields
  * @return bool
  */
 public function hasSameEmailField($emailField, $fields)
 {
     $emailFields = ArrayHelper::filter($fields, 'email', 'type');
     $emailsArray = ArrayHelper::column($emailFields, 'label', 'name');
     return array_key_exists($emailField, $emailsArray);
 }
예제 #2
0
 /**
  * Update form
  *
  * @param $id
  * @return array|string
  * @throws \yii\db\Exception
  */
 public function actionUpdateForm($id)
 {
     if (Yii::$app->request->isAjax) {
         // Response fornat
         Yii::$app->response->format = Response::FORMAT_JSON;
         // Extract FormBuilder data from post request
         $post = Yii::$app->request->post();
         $data = ['FormBuilder' => Json::decode($post['FormBuilder'], true)];
         $formBuilder = new FormBuilder();
         $success = false;
         $message = '';
         $code = 0;
         // Form Builder Validation
         if ($formBuilder->load($data) && $formBuilder->validate()) {
             // Save data in single transaction
             $transaction = Form::getDb()->beginTransaction();
             try {
                 // Parse html form fields to array
                 $formDOM = new FormDOM();
                 // If two elements has same id, throw a exception
                 $formDOM->loadHTML(ArrayHelper::getValue($data, 'FormBuilder.html'));
                 $formDOM->loadXpath();
                 $formDOM->loadFields();
                 // Get Form Model
                 $formModel = $this->findFormModel($id);
                 // Get FormData Model
                 $formDataModel = $formModel->formData;
                 // Get FormEmail Model
                 $formEmailModel = $formModel->formEmail;
                 // Filter reCaptcha component
                 $reCaptchaComponent = ArrayHelper::filter(ArrayHelper::getValue($data, 'FormBuilder.data.initForm'), 'recaptcha', 'name');
                 // Post Form
                 $postForm = ['Form' => ['name' => ArrayHelper::getValue($data, 'FormBuilder.data.settings.name'), 'recaptcha' => count($reCaptchaComponent) > 0 ? 1 : 0]];
                 // Post Form Data
                 $postFormData = ['FormData' => ['form_id' => $id, 'builder' => Json::htmlEncode(ArrayHelper::getValue($data, 'FormBuilder.data')), 'fields' => $formDOM->getFieldsAsJSON(), 'html' => Html::encode(ArrayHelper::getValue($data, 'FormBuilder.html')), 'height' => ArrayHelper::getValue($data, 'FormBuilder.data.height')]];
                 if (!$formModel->load($postForm) || !$formModel->save()) {
                     throw new Exception(Yii::t('app', 'Error saving data'), 1);
                 }
                 if (!$formDataModel->load($postFormData) || !$formDataModel->validate() || !$formDataModel->save()) {
                     throw new Exception(Yii::t('app', 'Error saving data'), 2);
                 }
                 // If From Field of Form Email Model is not a email
                 if (!$formEmailModel->fromIsEmail()) {
                     // Get form fields
                     $fields = Json::decode($formDOM->getFieldsAsJSON(), true);
                     // If the Email Field was modified
                     if (!$formBuilder->hasSameEmailField($formEmailModel->from, $fields)) {
                         // Delete From Field of FormEmail Model
                         $formEmailModel->from = null;
                         if (!$formEmailModel->save()) {
                             throw new Exception(Yii::t('app', 'Error saving data'), 3);
                         }
                     }
                 }
                 $transaction->commit();
                 // Change success flag and message
                 $success = true;
                 $message = Yii::t("app", "The form has been successfully updated");
             } catch (Exception $e) {
                 // Rolls back the transaction
                 $transaction->rollBack();
                 // Rethrow the exception
                 // throw $e;
                 $message = $e->getMessage();
                 $code = $e->getCode();
             }
         }
         // Response to Client
         $res = array('success' => $success, 'id' => $id, 'action' => 'update', 'message' => $message, 'code' => $code);
         return $res;
     }
     return '';
 }
예제 #3
0
 /**
  * Return ID of the first recaptcha component
  *
  * Used by Form model
  *
  * @return null|string
  */
 public function getRecaptchaFieldID()
 {
     // Filter reCaptcha components
     $builder = Json::decode($this->builder, true);
     $recaptchaComponent = ArrayHelper::filter($builder['initForm'], 'recaptcha', 'name');
     // Get the first value of the array
     $component = array_shift($recaptchaComponent);
     return isset($component) && isset($component['fields']) && isset($component['fields']['id']) && $component['fields']['id']['value'] ? $component['fields']['id']['value'] : null;
 }