HTML_QuickForm2 カスタムルール

マルチバイトの文字数チェックに対応するため、カスタムルールを作成した。

QuickForm2/Rule/Length.php の QuickForm2_Rule_Lengthを継承し、
validateOwner() の strlen を mb_strlen に変更するだけ。
QuickForm2/Rule/MbLength.php として保存。

class HTML_QuickForm2_Rule_MbLength extends HTML_QuickForm2_Rule_Length
{
   /**
    * Validates the owner element
    *
    * @return   bool    whether length of the element's value is within allowed range
    */
    protected function validateOwner()
    {
        if (0 == ($valueLength = mb_strlen($this->owner->getValue()))) {
            return true;
        }

        $allowedLength = $this->getConfig();
        if (is_scalar($allowedLength)) {
            return $valueLength == $allowedLength;
        } else {
            return (empty($allowedLength['min']) || $valueLength >= $allowedLength['min']) &&
                   (empty($allowedLength['max']) || $valueLength <= $allowedLength['max']);
        }
    }
}

QuickForm2/Factory.php に追記。

   /**
    * List of registered rules
    *   mblength, mbminlength, mbmaxlength: 2017.4 ushi add;
    * @var array
    */
    protected static $registeredRules = array(
        'nonempty'      => array('HTML_QuickForm2_Rule_Nonempty', null),
        'empty'         => array('HTML_QuickForm2_Rule_Empty', null),
//中略
        'mblength'        => array('HTML_QuickForm2_Rule_Length', null),
        'mbminlength'     => array('HTML_QuickForm2_Rule_MbLength', null,
                                 array('max' => 0)),
        'mbmaxlength'     => array('HTML_QuickForm2_Rule_MbLength', null,
                                 array('min' => 0))
    );

PGでの使い方

   //マルチバイト・文字数チェック
    $in_o_name->addRule('mbmaxlength', 'ご注文者 お名前:100文字までです',100); 
    $in_message->addRule('mbmaxlength', 'メッセージ:1000文字までです',1000); 
カテゴリー: pear