/** * 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); }
/** * 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 ''; }
/** * 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; }