0

私はマジェントを学んでいます。以下に示すモデルがあります。

class Kaushikamdotcom_Test_Model_Validator extends Varien_Object {

    private $errors = array();

    public function validate($_post) {
        $validator = new Zend_Validate_NotEmpty();
        $validator->setMessages(
            array(
                Zend_Validate_NotEmpty::IS_EMPTY => "This field cannot be empty"
            )
        );
        if(isset($_post['save'])) {
            if(! $validator->isValid($_post['title'])) {
                $this->errors['title'] = "This field cannot be empty";      
            }
            if(! $validator->isValid($_post['filename'])) {
                $this->errors['filename'] = "This field cannot be empty";
            }
        }
    }

    public function getErrors() {
        return $this->errors;
    }
}

コントローラーでは、次のように検証メソッドを使用します。

public function indexAction() {
    $this->loadLayout();
    $validator = Mage::getSingleton('test/validator');      
    if ($this->getRequest()->isPost()) {
        $validator->validate($this->getRequest()->getPost());
    }
    $this->renderLayout();
}

以下のように、ブロック ( Mage_Core_Block_Templateから拡張) でモデルを呼び出します。

public function _construct() {
   $this->validator = Mage::getSingleton('test/validator');
   $this->errors = $this->validator->getErrors();
   parent::_construct();
}

次のコードは戻り値を返します

public function getError($_key) {
   $errors = $this->validator->getErrors();
   return (isset($errors[$_key])) ? $errors[$_key] : '';
}

上記のコードの代わりに、次のコードを使用すると戻り値が返されません

public function getError($_key) {
   return (isset($this->errors[$_key])) ? $this->errors[$_key] : '';
}

コンストラクト関数で初期化$this->errorsしたのに、値が返されないのはなぜですか?

4

1 に答える 1

2

質問には具体的な回答を提供するのに十分な情報はありませんが、一般的には、配列には入力時にerrors渡すキーがないため、値は返されません。

これは推測ですが、あなたの呼び出し

$this->validator->getErrors();

オブジェクトではなくPHP配列を返すようです。したがって、 で呼び出すと_constructgetErrors空の配列が返されます。

ただし、_constructが呼び出されてから が呼び出されるまでの間にgetError、システム状態に関する何かが変化する (検証しようとしているフォームや情報が作成される可能性が高い) ため、への新しい呼び出し

$this->validator->getErrors();

は新しい PHP 配列を返します。この配列にはエラー メッセージが入力されています。ただし、次のコード

public function getError($_key) {
   return (isset($this->errors[$_key])) ? $this->errors[$_key] : '';
}

の間に移入された空の配列のみを参照します_construct。PHP 配列は完全なオブジェクトではありません — それらはプリミティブ値のように振る舞います。それ自体は自動的に更新されません。

于 2012-12-27T20:11:28.507 に答える