g++ function.cpp main.cpp -o my_openssl_use -I<PATH_TO_OPENSSL/include> -L<PATH_TO_OPENSSL>/lib> -lssl -lcrypt
public function rules()
{
return array(
array('phone', 'length', 'max' => 12),
array('icq', 'length', 'max' => 9),
array('email', 'email'),
array('login', 'length', 'max' => 80),
array('email', 'length', 'max' => 200),
//registration
array('login, email, password, retypePassword', 'required', 'on'=>'registration'),
array('login, email', 'unique', 'on'=>'registration'),
array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'registration'),
array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'registration')
//updateByAdmin
array('login, email, password, retypePassword', 'required', 'on'=>'updateByAdmin'),
array('login, email', 'unique', 'on'=>'updateByAdmin'),
array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'updateByAdmin'),
array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'updateByAdmin')
//updateByModerator
array('email', 'required', 'on'=>'updateByAdmin'),
array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'updateByAdmin'),
array('email', 'unique', 'on'=>'updateByAdmin'),
//changePassword
array('password, currentPassword, retypePassword', 'required', 'on'=>'changePassword'),
array('currentPassword', 'passwordValidator', 'on'=>'changePassword'),
array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'changePassword')
//changeEmail
array('email, currentPassword', 'required', 'on'=>'changeEmail'),
array('email', 'unique', 'on'=>'changeEmail'),
array('currentPassword', 'passwordValidator', 'on'=>'changeEmail'),
);
}
class ActiveRecord extends CActiveRecord {
protected $modelRules = [];
...
/**
* @return array общие (базовые для модели) правила валидации, описанные в формате
* array(
* 'login' => array(
* ['required'],
* ['length', 'max' => 200]
* ),
* 'firstName' => array(
* ['required'],
* ['length', 'max' => 200]
* ),
* )
*/
public function baseRules()
{
return array();
}
/**
* @return array список сценариев с установленными правилами валидации для каждого сценария.
* Правила валидации берутся из массива @see baseRules()
* 'createUser' => ['login','firstName']
* Существует возможность задать индивидуальные правила валидации для отдельного поля в заданном сценарии. Например:
* 'createUser' => array(
* 'login',
* 'firstName' => array(
* '*', //можем унаследовать правила из @see baseRules()
* ['!required'], //можем удалить валидатор "required", указанный в @see baseRules() при наследовании правил
* ['in', 'range' => array('Alex','Jack','Sam','Jane')], //и добавляем новое правило
* ),
* )
*/
public function scenarioRules()
{
return array();
}
/**
* Формирует валидатор в соотстветствии с требованиями Yii
* @param $field string поле модели
* @param $validator array массив с параметрами валидатора
* @param $scenario string сценарий
*/
protected function addBaseRule($field,$validator,$scenario)
{
$validatorName = [];
preg_match('/^(!)?([^!]+)/',$validator[0],$validatorName);
$validator[0] = $validatorName[2];
$ruleKey = $field.'_'.$validator[0].'_'.$scenario;
if (empty($validatorName[1])) {
if (!empty($scenario)) $validator['on'] = $scenario;
$validator[1] = $validator[0];
$validator[0] = $field;
$this->modelRules[$ruleKey] = $validator;
} else unset($this->modelRules[$ruleKey]);
}
/**
* Формирует валидатор в соотстветствии с требованиями Yii из массива @see baseRules()
* @param $field string поле модели
* @param $scenario string сценарий
*/
protected function addBaseRules($field,$scenario)
{
$baseRules = $this->baseRules();
if (isset($baseRules[$field])) foreach($baseRules[$field] as $validator) $this->addBaseRule($field,$validator,$scenario);
}
public function rules()
{
$this->modelRules = [];
$scenarioRules = $this->scenarioRules();
if (empty($scenarioRules)) $scenarioRules = [''];
foreach ($scenarioRules as $scenario => $rules) {
//Если сценариев нет, то устанавливаем общие для всех правила
if ($scenario == 0 && empty($rules)) $rules = array_keys($this->baseRules());
foreach ($rules as $field => $rule) {
//Если в сценариях заданы правила
if (is_array($rule)) {
//Добавляем родительские правила, если есть «*»
if (in_array('*',$rule)) $this->addBaseRules($field,$scenario);
foreach ($rule as $validator) {
//Проверяем, что правило не является маской. Т.е. «*»
if (is_array($validator)) $this->addBaseRule($field,$validator,$scenario);
}
} else $this->addBaseRules($rule,$scenario);
}
}
foreach ($this->modelRules as &$rule) uksort($rule,function($a,$b){
if (is_numeric($a) && is_numeric($b) && $a>$b) return 1;
return is_numeric($a) ? -1 : 1;
});
return $this->modelRules;
}
class User extends CActiveRecord {
public $currentPassword;
public $retypePassword;
pulbic function baseRules()
{
return array(
'login' => array(
array('required')
array('length', 'max' => 80),
array('unique'),
array('match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i'),
),
'email' => array(
array('length', 'max' => 200),
array('unique'),
array('email'),
array('required'),
),
'password' => array(
array('required'),
),
'currentPassword' => array(
array('required'),
array('passwordValidator'),
),
'retypePassword' => array(
array('required'),
array('compare','compareAttribute' => 'password'),
),
'phone' => array(
array('length', 'max' => 12),
),
'icq' => array(
array('length', 'max' => 9),
),
);
}
pulbic function scenarios()
{
return array(
'registration' => array('login','email','icq','phone'),
'updateByAdmin' => array(
'login',
'email',
'icq',
'phone',
'password' => array(
array('default'),
)
),
'updateByModerator' => array('email','icq','phone'),
'changeEmail' => array('email','currentPassword'),
'changePassword' => array('password','retypePassword','currentPassword'),
);
}
}
class Controller extends CController {
public $jsParams = array();
/* ... */
public function actionIndex() {
$oRequest = Yii::app()->getRequest();
$this->jsParams['csrf'] = array($oRequest->csrfTokenName => $oRequest->getCsrfToken());
}
Yii::app()->clientScript->registerScript('js.params', 'var jsParams=' . CJSON::encode($this->jsParams).';', CClientScript::POS_HEAD);
jsParams = jsParams || {};
console.log(jsParams);
var tpl = " <div>\ <input name='name[%%num%%]'>\ <input name='name[%%num%%]'>\ <input name='name[%%num%%]'>\ </div>\ ";
var currentTpl = tpl.replace(/%%num%%/g, counter++)
и вставляете после текущих полей <div id="parentId">
<div>
<nobr><input name="name[1]" type="text" style="width:300px;" />
<select size="1" name="type[1]" style="width:150px;">
<option value="text">Текстовое поле</option>
<option value="int">Целое число</option>
<option value="float">Число-цена</option>
</select>
<a style="color:red;" onclick="return deleteField(this)" href="#">[—]</a>
<input name="url[1]" type="text" style="width:300px;" />
<a style="color:green;" onclick="return addField()" href="#">[+]</a></nobr>
</div>
</div>
<script>
var countOfFields = 1; // Текущее число полей
var curFieldNameId = 1; // Уникальное значение для атрибута name
var maxFieldLimit = 25; // Максимальное число возможных полей
function deleteField(a) {
if (countOfFields > 1)
{
// Получаем доступ к ДИВу, содержащему поле
var contDiv = a.parentNode;
// Удаляем этот ДИВ из DOM-дерева
contDiv.parentNode.removeChild(contDiv);
// Уменьшаем значение текущего числа полей
countOfFields--;
}
// Возвращаем false, чтобы не было перехода по сслыке
return false;
}
function addField() {
// Проверяем, не достигло ли число полей максимума
if (countOfFields >= maxFieldLimit) {
alert("Число полей достигло своего максимума = " + maxFieldLimit);
return false;
}
// Увеличиваем текущее значение числа полей
countOfFields++;
// Увеличиваем ID
curFieldNameId++;
// Создаем элемент ДИВ
var div = document.createElement("div");
// Добавляем HTML-контент с пом. свойства innerHTML
div.innerHTML = "<nobr><input name=\"name[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" /> <select size=\"1\" name=\"type[" + curFieldNameId + "]\" style=\"width:150px;\"><option value=\"text\">Текстовое поле</option><option value=\"int\">Целое число</option><option value=\"float\">Число-цена</option></select> <a style=\"color:red;\" onclick=\"return deleteField(this)\" href=\"#\">[—]</a> <input name=\"url[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" /> <a style=\"color:green;\" onclick=\"return addField()\" href=\"#\">[+]</a></nobr>";
// Добавляем новый узел в конец списка полей
document.getElementById("parentId").appendChild(div);
// Возвращаем false, чтобы не было перехода по сслыке
return false;
}
</script>