У меня есть форма, созданная с помощью моего собственного конструктора форм, мой конструктор форм похож на форму Gravity для WordPress. Все работает нормально, кроме проверки. Каждый раз, когда я отправляю форму, она возвращает истину.
В частности, я проверяю поле select, потому что пользователь может редактировать значение из веб-инспектора и отправлять значение, поэтому я проверяю значение по сохраненным значениям в БД, где сохраняется динамическая форма.
Вот моя попытка
where $post is $_POST[] array, $postKey is fieldName, & $postValue is submitted value by user.
public function validate()
{
$post = $this->ci->input->post();
//check form tempering
if (empty($post))
return false;
$formId = $post['form_id'];
//get form from db
$data=[];
$this->ci->db->select('formData');
$this->ci->db->where('formId', $formId);
$query = $this->ci->db->get(TBL_FORM_DATA);
if ($query->num_rows() > 0)
{
$data = $query->row();
}
if (empty($data) )
return false;
//unset submit button and 0 if occurs
unset($post['submit']);
unset($post['0']);
//decode json
$data = json_decode($data->formData,true);
$fields = $data['field'];
//debug($fields);
//iterate post values and keys
foreach ($post as $postKey => $postValue)
{
//echo '<br>'.$postKey;
if (strpos($postKey, '@'))
{
list($fieldName,$field_id) = explode('@', $postKey);
$field_display_name = ucwords(str_replace('_', ' ', $fieldName));
if (strpos($field_id,'|')) {
list($field_id,$price) = explode('|', $field_id);
}
$field = $fields[$field_id];
//debug($field['choice'],false);
if (isset($field['choice']) && (isset($field['choice']['label']) && isset($field['choice']['value'])) )
{
/*if (!in_array($postValue, $field['choice']['value']))
{*/
//$list = implode(',', $field['choice']['value']);
$this->ci->form_validation->set_rules($postKey,$field_display_name,'callback_check_field['.$list.']');
/*$this->ci->form_validation->set_rules($postKey, $field_display_name,"in_list[".$list."]",
array('in_list' => 'Invalid Selection. Please Select from available choices.')
);*/
/*}*/
}
if (isset($field['required']) && $field['required']=='on'){
$this->ci->form_validation->set_rules($postKey, $field_display_name,'required|trim');
}
//$duplicate = isset($field['no_duplicate']) ? true : false;
//$this->ci->form_validation->set_rules('form_id',' ','required');
//$this->ci->form_validation->set_rules('inkform_total',' ','required');
}
$this->ci->form_validation->set_error_delimiters('<div class = "clearfix"></div><p class = "alert alert-danger">','</p>');
return $this->ci->form_validation->run();
}
//echo validation_errors();
}
Функция обратного вызова для проверки значений выбранных полей
function check_field($field,$list)
{
if (!is_array($list)) {
$list = explode(',', $list);
}
if (!in_array($field, $list)){
$this->ci->form_validation->set_message('check_field','Invalid Post');
return false;
}else{
return true;
}
}
А позже я просто хочу получить доступ к функции validate() для проверки.
@Alex, только валидация не работает, для всех полей не только для select. Возвращает True при каждой отправке
mkay, и, чтобы быть уверенным, вы намеренно пытаетесь исправить это, например не вводите действительные данные? Кроме того, я не вижу никаких серьезных ошибок в вашем коде, но устранить неполадки с помощью предоставленной информации не так просто. прочтите, пожалуйста, один: stackoverflow.com/help/mcve. по сути, создать пример, который мы можем легко запустить в наших системах для устранения неполадок (полный / проверяемый). удалите ненужные биты, так что это будет минимальный.
я просто делюсь полным кодом. проверьте еще раз.
@Alex, ваш ответ помог, но не полностью, теперь у меня есть Unable to access an error message corresponding to your field name What Do You Want ?.(check_field). вернул функцию обратного вызова бу.
где функция check_field()? в том же классе, что и validate()?
имя поля - What_do_you_want_?@5, где @ - разделитель, который я использую, чтобы разбить это и получить 5, который является идентификатором поля ввода.
Позвольте нам продолжить обсуждение в чате.






Двигаться
$this->ci->form_validation->set_error_delimiters('<div class = "clearfix"></div><p class = "alert alert-danger">','</p>');
return $this->ci->form_validation->run();
за пределами foreach
что именно "не работает" ... все? или просто выбранная вами проверка?