0

私はこの検索機能を持っています:

public static function search_form()
{
    $form = new Form('search_form');

    $form->field('keyword', 'text', array
    (
        'min_length'    =>  4,
        'max_length'    =>  15,
        'alphanumeric'  =>  lang('alphanumeric')
    )); 
    $form->field('category', 'select', array
    (
        'cat1'  =>  'Category 1',
        'cat2'  =>  'Category 2',
        'cat3'  =>  'Category 3'

    ), $value);

    if($data = $form->validate())
    {           
        header('Location: '.WEB.sprintf('search/'.$data['keyword'].'/'.$data['category']));
    }

    return $form;
}

オプションのバリデーションは、入力では正常に機能しますが、ドロップダウンでは機能しません:

// Validate
public function validate()
{
    $this->script();

    if(!$this->submitted)
    {
        return false;
    }

    $this->valid = true;

    foreach($this->fields as $field)
    {
        $value = $this->request[$field[0]];

        if(isset($field[2]['optional']) && $field[2]['optional'])
        {
            if($value == '') continue;
        }

        foreach($field[2] as $validator=>$data)
        {
            if($validator == 'optional') continue;

            $custom = !method_exists($this, $validator);

            if((!$custom && !$this->$validator($value, $data)) || ($custom && !$this->custom($data, $value)))
            {
                $this->valid = false;

                $this->errors[$field[0]] = $this->error_message($field[0], $validator, $data);

                break;
            }
        }
    }

    return $this->valid?$this->request:false;
}

オプションのパラメーターをテキスト入力に追加すると機能しますが、選択入力では機能しません:

    $form->field('category', 'select', array
    (
        'optional'      =>  true,
  .................

HTML の値として変換されます。

        # Input
        switch($field[1])
        {
            case 'text':
            case 'password':
                if($this->submitted)
                {
                    echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'" value="'.htmlentities(utf8_decode($this->request[$field[0]]), ENT_QUOTES).'"/>';
                } else
                {
                    echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'"'.(isset($field[3])?' value="'.$field[3].'"':'').'/>';
                }
                break;
            case 'textarea':
                echo '<textarea type="text" id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">';
                echo '</textarea>';
                break;
            case 'select':
                echo '<select id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">';

                foreach($field[2] as $key=>$value)
                {
                    echo '<option value="'.$key.'"';

                    if($this->submitted && $this->request[$field[0]] == $key)
                    {
                        echo ' selected="selected"';
                    } elseif(isset($field[3]) && $field[3] == $key)
                    {
                        echo ' selected="selected"';
                    }

                    echo '>'.$value.'</option>';
                }

                echo '</select>';
                break;
        }

問題は、最初の入力 (キーワード) にはバリデーターが必要ですが、ドロップダウンには必要ないことです。両方のフィールドを検証する必要があるようですが、これは望ましくありません。2 番目の検証をバイパスする方法はありますか?

編集:実際には、ドロップダウンが検証に合格しない理由がわかりません。フォームを送信しようとすると「error_category」が表示されます。

問題が解決しました :

検証関数は、実際には 2 番目のフィールド ($field[2]) を検証しようとして ['optional'] 値を探していましたが、2 番目のフィールドが実際にはカテゴリ配列であったため、それを見つけることができませんでした。この問題を解決するために、「optional = true」を含む新しい配列を 2 番目の位置に追加し、実際の配列を 3 番目の位置に移動しました。その後、検証は問題ありませんでしたが、オプションの値が表示されなかったため、次のように変更する必要がありました。

   foreach($field[2] as $key=>$value)
            {
                echo '<option value="'.$key.'"'; ...

$field[2] を $field[3] に置き換えてから、値フィールド (以前の $field[3]) を $field[4] に移動します。

4

1 に答える 1

0

問題が解決しました :

検証関数は、実際には 2 番目のフィールド ( $field[2] ) を検証しようとして [' optional '] 値を探していましたが、2 番目のフィールドが実際にはカテゴリ配列であったため、それを見つけることができませんでした。この問題を解決するために、「 optional = true 」を含む新しい配列を 2 番目の位置に追加し、実際の配列を 3 番目の位置に移動しました。

その後、検証は問題ありませんでしたが、オプションの値が表示されなかったため、次のように変更する必要がありました。

   foreach($field[2] as $key=>$value)
        {
            echo '<option value="'.$key.'"'; ...

$field[2]$field[3]に置き換えてから、値フィールド (以前の $field[3]) を $field[4] に移動します。

于 2012-11-03T06:28:34.780 に答える