带有参数的CodeIgniter回调函数

带有参数的CodeIgniter回调函数,codeigniter,parameters,callback,Codeigniter,Parameters,Callback,(编辑:我后来意识到,也许在回调中不可能将数组作为参数传递?) 我正在尝试解决如何将参数传递给CI中的回调函数。我已经阅读了文档,但除了以下内容外,关于这个主题的内容不多: 要调用回调函数,只需将函数名放入规则中,使用 “回调”作为规则前缀。如果您需要额外的 参数,只需在 方括号中的函数名,如:“callback_foo[bar]”, 然后它将作为回调的第二个参数传递 功能 我试图做的是创建一个回调,它检查是否选择了不应该选择的。因此,如果有人选择显示“请选择”的选项,则不会将其添加到数据库中。

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

我正在尝试解决如何将参数传递给CI中的回调函数。我已经阅读了文档,但除了以下内容外,关于这个主题的内容不多:

要调用回调函数,只需将函数名放入规则中,使用 “回调”作为规则前缀。如果您需要额外的 参数,只需在 方括号中的函数名,如:“callback_foo[bar]”, 然后它将作为回调的第二个参数传递 功能

我试图做的是创建一个回调,它检查是否选择了不应该选择的。因此,如果有人选择显示“请选择”的选项,则不会将其添加到数据库中。任务类型只是一个包含主键、名称字段和大约10行的表

控制器 这是我的控制器代码(删节):

回调 以及我的回调,以检查是否有不可选择的内容:

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'); ?>
错误表明传递的信息不是数组,但我甚至将数组定义为默认值。我在回调函数中对$options数组执行了print_r(),但它只是输出了一个空数组

谢谢。

问题出在这里:

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

您应该扩展CI_表单_验证库,而不是尝试使用回调

要检查选择框是否有效,只需将默认值添加到其值,然后进行检查

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

好主意。我已经决定数组是不可能的,所以我决定使用这个:if($values=='add')$not\u selective=$this->not\u selective\u add;然后有不同的值数组。但很明显,这是非常有限的,管道是一个更好的主意。我刚刚想到,
序列化
json\u编码
数组可能是一个更好的主意。这将允许管道字符出现在其中一个值中。我知道您不需要它,因为您可能只有整数数据库ID,但在其他情况下,它可能很重要。
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;
}
<select>
<option value="default">Select one</option>
</select>
public function check_select_values($option){

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