2012-12-27 121 views
0

我正在学习magento。我有一个模型,下面给出。从magento模型返回值

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

+1

在构造的前面只有一个下划线:_construct而不是__construct。 –

+0

这是因为在Mage_Core_Block_Template中有一个具有相同名称的函数。 – kaushik

+2

@BennyHill Magento块和模型对象有一个内部'_construct'方法,其功能类似于PHP的本地构造函数。 –

回答

2

问题中没有足够的信息来提供具体的答案,但一般而言,它不会返回任何值,因为您在填充时​​阵列没有输入密钥

这是一个猜测,但你要

$this->validator->getErrors(); 

调用看起来像它返回一个PHP数组,而不是一个对象。因此,当您在_construct中调用它时,getErrors正在返回一个空数组。

然而,_construct之间叫你叫getError,一些有关系统的状态变化(可能的形式和/或你想验证创建信息),所以

$this->validator->getErrors(); 

新的呼叫返回一个新的PHP数组,这个数组填充了错误消息。但是,以下代码

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

仅引用在_construct期间填充的空数组。 PHP数组并不完全是对象 - 它们的行为更像原始值。它会自动更新自身而不是

+0

当我在控制器验证后将** loadlayout **放入工具时。谢谢您的回答。我一直在阅读你的文章。他们很棒。 – kaushik