Функции обратного вызова CodeIgniter с параметрами - PullRequest
2 голосов
/ 13 февраля 2012

(Правка. С тех пор я понял, что, возможно, невозможно передать массивы в качестве параметров в обратных вызовах?)

Я пытаюсь понять, как передать параметры в функцию обратного вызова в CI. Я прочитал документацию, но по этому вопросу не так много, кроме:

Чтобы вызвать обратный вызов, просто поместите имя функции в правило, с "callback_" в качестве префикса правила. Если вам нужно получить дополнительную параметр в функции обратного вызова, просто добавьте его обычно после имя функции в квадратных скобках, например: "callback_foo [bar]", тогда он будет передан как второй аргумент вашего обратного вызова функция.

То, что я пытаюсь сделать, это создать обратный вызов, который проверяет, был ли выбран объект, который не должен был быть. Поэтому, если кто-то выберет опцию «Пожалуйста, выберите», он не будет добавлен в базу данных. Типы задач - это просто таблица с первичными ключами, полем имени и примерно 10 строками.

Контроллер Итак, вот мой код контроллера (вырублено):

function Add_Task()
{
  $task_types_get = $this->task_model->Get_Task_Types();//Get available task types.
  $this->options->task_types = $task_types_get->result();
  $not_selectable = array(1);//Non selectable values for select. Added to callback function below for validation. These are pks.

  $this->form_validation->set_rules("task_type","Task Types","required|callback__Not_Selectable[$not_selectable]");

  if($this->form_validation->run())
  {
     //Add to db etc..
  }
}

Обратный вызов И мой обратный вызов, чтобы проверить, если что-то не выбирается:

function _Not_Selectable($option,$values=array())
{  
  if(in_array($option,$values))//Is the value invalid?
  {
    $this->form_validation->set_message('_Not_Selectable', 'That option is not selectable.');
    return false;
  }
  return true;
}

View Данные, возвращаемые из модели, в порядке, но ошибок проверки нет. Мой взгляд таков:

<? $this->load->view('includes/header'); ?>

  <?=form_open();?>

  <div class="form_row">
    <div class="form_field">
      <label for="task_desc">Task Type</label>
    </div>

    <div class="form_field name_element" id="name-list">
      <select name="task_type" id="task_select">
        <? foreach($task_types as $t => $v):
             echo "<option ".set_select('task_type', $v->tt_id)." value=\"{$v->tt_id}\">{$v->name}</option>\n";
           endforeach;
        ?>
      </select>
      <?=form_error('task_type');?>
    </div>
  </div>

  <?=form_submit('add_task', 'Add Task');?>

  <?=form_close();?>

<? $this->load->view('includes/footer'); ?>

Ошибка Я получаю ошибку:

A PHP Error was encountered
Severity: Warning
Message: in_array() [function.in-array]: Wrong datatype for second argument
Filename: controllers/tasks.php
Line Number: 112 (NOTE: this is the in_array line in the callback function.)

Ошибка предполагает, что передаваемая информация не является массивом, но я даже определил массив по умолчанию. Я сделал print_r () для массива $ options в функции обратного вызова, но он просто распечатал пустой массив.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Проблема здесь:

"required|callback__Not_Selectable[$not_selectable]"

Это переводит в строку:

"required|callback__Not_Selectable[Array]"

Это то, что происходит, когда вы рассматриваете массивы как строки в PHP.

Эта проблема является ограничением библиотеки проверки формы Codeigniter, нет подходящего способа использовать массивы в обратных вызовах или правилах проверки, вам придется использовать строки.Попробуйте это:

$not_selectable = implode('|', $your_array);

Это сделает что-то вроде 1|4|18|33.Затем установите свои правила так, как вы это делаете в настоящее время, но в вашем обратном вызове будьте готовы к строке с разделителями, а не к массиву, и используйте explode() для ее создания:

function _Not_Selectable($option, $values_str = '')
{  
  // Make an array      
  $values = explode('|', $values_str);

  if(in_array($option,$values))//Is the value invalid?
  {
    $this->form_validation->set_message('_Not_Selectable', 'That option is not selectable.');
    return false;
  }
  return true;
}
0 голосов
/ 15 февраля 2012

Вы должны расширить библиотеку CI_Form_validation, а не пытаться использовать обратные вызовы.

Чтобы проверить, является ли поле выбора допустимым, просто добавьте значение по умолчанию к его значению, а затем проверьте его.

<select>
<option value="default">Select one</option>
</select>

MY_Form_Validation

| ->

public function check_select_values($option){

      if($option === 'default') // try again slim jim
}
...