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); }
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; }