带有参数的CodeIgniter回调函数

时间:2012-02-13 13:14:22

标签: codeigniter parameters callback

(编辑:我已经意识到也许不可能在回调中将数组作为参数传递?)

我正在尝试研究如何将参数传递给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;
}

查看 从模型返回的数据是可以的,但没有验证错误。我的观点如下:

<? $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.)

错误表明传递的信息不是数组,但我甚至将数组定义为默认值。我在回调函数的$ options数组上做了一个print_r(),但它打印出一个空数组。

感谢。

2 个答案:

答案 0 :(得分:6)

问题在于:

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

答案 1 :(得分:0)

您应该扩展CI_Form_validation lib而不是尝试使用回调。

要检查选择框是否有效,请将默认值添加到其值,然后检查该值。

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

MY_Form_Validation

| - &GT;

public function check_select_values($option){

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