Example #1
0
 public function makeForm($scenario = '', $selectedFields = array(), $requiredFields = array())
 {
     $this->rules = null;
     $specialFields = $this->specialFields($scenario);
     $form = User::form();
     if (!is_array($selectedFields)) {
         $selectedFields = array();
     }
     if (!is_array($requiredFields)) {
         $requiredFields = array();
     }
     if ($scenario == 'update' && !$this->login) {
         array_unshift($selectedFields, 'login');
         array_unshift($requiredFields, 'login');
     }
     $fields = array_unique(array_diff(array_merge(array_merge($specialFields['required'], $requiredFields), $selectedFields), $specialFields['unsafe']));
     if ($scenario == 'update' && !$this->login) {
         array_unshift($fields, 'login');
     }
     foreach ($fields as $name) {
         if (isset($form['elements'][$name])) {
             $formFields[$name] = $form['elements'][$name];
         }
     }
     foreach ($formFields as $name => $field) {
         if ($field['type'] == 'Fields') {
             if (is_array($field['config'])) {
                 foreach ($field['config'] as $key => $extraField) {
                     if (!in_array($extraField['name'], $fields)) {
                         unset($formFields[$name]['config'][$key]);
                     }
                 }
             }
         }
     }
     $oldRules = $this->rules();
     $alreadyRequired = array();
     $rules = array();
     foreach ($oldRules as $rule) {
         if ($scenario) {
             $scenarios = isset($rule['on']) ? is_array($rule['on']) ? $rule['on'] : explode(',', str_replace(' ', '', $rule['on'])) : null;
         }
         if (!$scenario || !$scenarios || in_array($scenario, $scenarios)) {
             if (isset($rule[0], $rule[1])) {
                 if ($rule[1] == 'captcha' && !in_array($rule[0], $selectedFields)) {
                     continue;
                 }
                 if ($rule[1] == 'required') {
                     $validator = CValidator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2));
                     foreach ($validator->attributes as $attr) {
                         if (!in_array($attr, $requiredFields) && !in_array($attr, $specialFields['required'])) {
                             $validator->attributes = array_diff($validator->attributes, array($attr));
                         } else {
                             $alreadyRequired[] = $attr;
                         }
                     }
                     $rule[0] = implode(', ', $validator->attributes);
                 }
                 if ($rule[1] == 'FieldsValidator') {
                     $alreadyRequired[] = $rule[0];
                     if (is_array($rule['config'])) {
                         foreach ($rule['config'] as $key => $field) {
                             if (!in_array($field['name'], $selectedFields)) {
                                 unset($rule['config'][$key]);
                                 continue;
                             }
                             $isRequired = in_array($field['name'], $requiredFields);
                             if (!is_array($rule['config'][$key]['rules'])) {
                                 $rule['config'][$key]['rules'] = array();
                             }
                             foreach ($rule['config'][$key]['rules'] as $i => $_rule) {
                                 if ($_rule[0] == 'required') {
                                     if (!in_array($field['name'], $requiredFields)) {
                                         unset($rule['config'][$key]['rules'][$i]);
                                     }
                                     $isRequired = false;
                                     $alreadyRequired[] = $field['name'];
                                 }
                             }
                             if ($isRequired) {
                                 $rule['config'][$key]['rules'][] = array('required');
                                 $alreadyRequired[] = $field['name'];
                             }
                         }
                     }
                 }
                 if ($rule[0]) {
                     $rules[] = $rule;
                 }
             }
         }
     }
     $neededRequired = array_diff($requiredFields, $alreadyRequired);
     if (!empty($neededRequired)) {
         $rule = array(implode(', ', $neededRequired), 'required');
         if ($scenario) {
             $rule['on'] = $scenario;
         }
         $rules[] = $rule;
     }
     if ($rules) {
         foreach ($rules as $rule) {
             if ($scenario) {
                 $scenarios = isset($rule['on']) ? is_array($rule['on']) ? $rule['on'] : explode(',', str_replace(' ', '', $rule['on'])) : null;
             }
             if (!$scenario || !$scenarios || in_array($scenario, $scenarios)) {
                 if ($rule[1] == 'FieldsValidator') {
                     $attributes = explode(',', str_replace(' ', '', $rule[0]));
                     foreach ($attributes as $attr) {
                         if (isset($formFields[$attr])) {
                             $formFields[$attr]['config'] = $rule['config'];
                         }
                     }
                 }
             }
         }
     }
     if ($scenario == 'update' && !$this->login) {
         foreach ($rules as $index => $rule) {
             if ($rule[0] == 'login' && $rule[1] == 'unsafe') {
                 unset($rules[$index]);
             }
         }
     }
     $this->rules = $rules;
     return array('elements' => $formFields, 'rules' => $rules);
 }
Example #2
0
 protected function makeFields($fields, $user = null)
 {
     if (!is_array($fields)) {
         $fields = array();
     }
     $u = new User();
     $specialFields = $u->specialFields('view');
     $fields = array_diff($fields, $specialFields['unsafe']);
     $form = User::form();
     foreach ($form['elements'] as $name => $field) {
         if ($field['type'] == 'Fields') {
             foreach ($field['config'] as $extraField) {
                 if (in_array($extraField['name'], $fields)) {
                     if ($user) {
                         foreach ($fields as $i => $attr) {
                             if ($attr == $extraField['name']) {
                                 $fields[$i] = array('label' => $extraField['label'][Yii::app()->language], 'value' => $user->{$name}[$extraField['name']], 'name' => $extraField['name']);
                             }
                         }
                     } else {
                         foreach ($fields as $i => $attr) {
                             if ($attr == $extraField['name']) {
                                 $fields[$i] = array('header' => $extraField['label'][Yii::app()->language], 'value' => '$data->' . $name . '[' . $extraField['name'] . ']', 'name' => $extraField['name']);
                             }
                         }
                     }
                 }
             }
             if (in_array($name, $fields)) {
                 $fields = array_diff($fields, array($name));
             }
         }
     }
     foreach ($fields as $key => $field) {
         if ($field == 'email') {
             if ($user) {
                 $fields[$key] = array('name' => 'email', 'value' => $user->email, 'visible' => Yii::app()->user->hasRole($user->show_email) || $user->id == Yii::app()->user->id);
             } else {
                 $fields[$key] = array('name' => 'email', 'value' => 'Yii::app()->user->hasRole($data->show_email) ? $data->email : ""');
             }
         }
     }
     return $fields;
 }