【问题标题】:Remove rule from codeigniter from MY_Form_validation从 MY_Form_validation 的 codeigniter 中删除规则
【发布时间】:2016-04-28 15:16:20
【问题描述】:

我正在写一些东西,如果您选择某个按钮或下拉菜单,我想更改某个字段的规则。基本上逻辑是,检查一个按钮或从一个选择中选择一个 ID,您不需要填充地址字段。我一直在尝试在 form_validation 中做事情,而不是在控制器中我实际上可以做这样的事情

if(isset($_POST['checkbox'])){
    //check rules
}

所以我这样做了:

public function check_address($str,$prefix=null){
    $this->set_message('check_address','Please select an address or fill out a new one');
    //var_dump($this->_field_data);exit;
    $remove=array('address_line1','address_line2','address_line3','city','postcode');
    if($prefix!==null){
        foreach($remove as &$r){
            $r=$prefix.'_'.$r;
        }
    }
    unset($r);
    foreach($this->_field_data as $key=>$f){
        if(in_array($key,$remove)){
            unset($this->_field_data[$key]);
        }
    }
}

这按我想要的方式工作,但我认为我已经干扰了 codeiginter 的 Form_Validation 类,因为它抛出了一个错误,指出我的数组中所需的索引未设置。

错误信息

A PHP Error was encountered
Severity: Notice
Message: Undefined index: billing_address_line1
Filename: libraries/Form_validation.php
Line Number: 481

我不太确定如何在不干扰 codeigniter 需求的情况下实现我想做的事情?是否需要删除另一个数组,以免对键进行排序?

我现在也这样做了

    foreach($this->_field_data as $key=>&$f){
        if(in_array($key,$remove)){
            //unset($this->_field_data[$key]);
            //str_replace('/required\|/','',$f['rules']);
            //str_replace('/required/','',$f['rules']);
            foreach($f['rules']as$r=>$val){
                $val=strtolower($val);
                if($val=='required')unset($f['rules'][$r]);
            }
            var_dump($f);
        }
    }
    unset($f);

这现在通过删除所需的规则来完成所需的操作,但我认为所需的功能必须已经运行?

规则数组

$this->con['validation']['checkout']=array(


        array('field'=>'address_line1','label'=>'Address line 1','rules'=>'required|min_length[3]|max_length[200]|check_basket'),
        array('field'=>'address_line2','label'=>'Address line 2','rules'=>'min_length[3]|max_length[200]'),
        array('field'=>'address_line3','label'=>'Address line 3','rules'=>'min_length[3]|max_length[200]'),
        array('field'=>'city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'),
        array('field'=>'postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'),

        array('field'=>'shipping_addressID','label'=>'Address','rules'=>'check_address[]'),


        array('field'=>'billing_address_line1','label'=>'Billing address line 1','rules'=>'required|min_length[3]|max_length[200]'),
        array('field'=>'billing_address_line2','label'=>'Billing address line 2','rules'=>'min_length[3]|max_length[200]'),
        array('field'=>'billing_address_line3','label'=>'Billing address line 3','rules'=>'min_length[3]|max_length[200]'),
        array('field'=>'billing_city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'),
        array('field'=>'billing_postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'),
        array('field'=>'billing_address_same','label'=>'Billing Address','rules'=>'check_address[billing]'),
        array('field'=>'billing_addressID','label'=>'Billing address','rules'=>'check_address[billing]')
    );

【问题讨论】:

  • *_addressID 字段的用途是什么?
  • @DFriend 因为我希望能够将地址添加到数据库中,并在同一用户返回时再次选择它们以避免多次输入相同的地址。这就是为什么我有*_addressID,如果没有选择*_addressID,那么用户需要填写与该地址相关的地址字段,无论是发货还是账单。

标签: php codeigniter


【解决方案1】:

我认为最简单的方法是最好的。在控制器中,如果复选框被选中,则添加规则。

if(isset($_POST['checkbox'])){
    $this->form_validation->set_rules('billing_address_line1', 'Billing Address Line 1', 'required');
}

在 cmets 和问题编辑后添加

仍在努力实现最简单的实现,同时避免使用一堆字符串操作的foreach 循环,以及几乎相同的多个规则数组。

这利用了form_validation->set_rules() 可以在第三个参数中接受数组(而不是管道分隔的字符串)这一事实。无论如何,字符串最终都会变成一个数组,因此从数组开始在运行时效率更高。

同样以高效运行的名义,在设置规则时使用方法链。

首先创建可重复使用的“规则”数组以传递给set_rules()

$rules_address1 = ['required', 'min_length[3]', 'max_length[200]', 'callback_check_basket'];
$rules_address_23 = ['min_length[3]', 'max_length[200]'];
$rules_city = ['required', 'min_length[3]', 'max_length[50]'];
$rules_postcode = ['required', 'min_length[3]', 'max_length[9]', 'callback_valid_postcode'];

$this->form_validation->set_message('required', 'You must provide {field}.');

$this->form_validation
    ->set_rules('address_line1', 'Address line 1', $rules_address1)
    ->set_rules('address_line2', 'Address line 2', $rules_address_23)
    ->set_rules('address_line3', 'Address line 3', $rules_address_23)
    ->set_rules('city', 'Town/City', $rules_city)
    ->set_rules('postcode', 'Postal Code', $rules_postcode);

if(!isset($_POST['checkbox']))
{
  unset($rules_address1[0]);
  unset($rules_address_23[0]);
  unset($rules_city[0]);
  unset($rules_postcode[0]);
}

$this->form_validation
    ->set_rules('billing_address_line1', 'Billing Address line 1', $rules_address1)
    ->set_rules('billing_address_line2', 'Billing Address line 2', $rules_address_23)
    ->set_rules('billing_address_line3', 'Billing Address line 3', $rules_address_23)
    ->set_rules('billing_city', 'Town/City', $rules_city)
    ->set_rules('billing_postcode', 'Postal Code', $rules_postcode);

我跳过了 addressID 字段的规则,因为我不确定它是如何使用的。

此外,根据 CI SOP,将 callback_ 添加到对我来说似乎是自定义回调方法的内容。相应调整。

如你所知,这一切都发生在$this->form_validation->run() 被调用之前的控制器中。

【讨论】:

  • 谢谢,但我想做相反的事情:p 如果设置了复选框,我想删除规则。所以我必须基本上将规则重写为 3 个单独的数组广告,我不想这样做。我正在扫描 form_validation 类,看看是否能找到一些东西,但我认为因为在不同函数之间调用的这个函数规则它可能不起作用?
  • 我已经添加了数组,您所说的方法涉及在启动run 函数之前操作数组。所以我要么必须在运行之前运行一个 foreach,要么有 3 个单独的数组来不包含我不想包含的不同错误。 (其实我觉得是 2 shh)
  • 查看修改后的答案。
  • 这和我做的差不多。在提交设置规则之前,我刚刚删除了我不想要的数组。谢谢:)
【解决方案2】:

从表单验证类中检查它。为要删除的规则调用您自己的验证方法。 https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

然后在那些方法中,检查 Checkbox 是否被选中。如果选中,则跳过所有规则,并从回调函数返回 TRUE。像这样的:

address_line1_callback_function() {
    CI = &get_instance();
    if ( CI->input->post('checked') ) 
        return true;
    /// Rules for address line go here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2019-02-22
    • 2010-12-01
    相关资源
    最近更新 更多