【问题标题】:Return value from a model in magento从magento中的模型返回值
【发布时间】:2012-12-28 09:28:50
【问题描述】:

我正在学习 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;
    }
}

在控制器中我使用 validate 方法如下:

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,为什么它没有返回任何值?

【问题讨论】:

  • construct 前面只有一个下划线:_construct 而不是 __construct。
  • 这里可行,因为在 Mage_Core_Block_Template 中有一个同名的函数。
  • @BennyHill Magento 块和模型对象有一个内部 _construct 方法,其功能类似于 PHP 的原生构造函数。
  • @kaushik,Zend_Debug::dump($this->errors) 的输出是什么?它是预期的数组吗?它是否包含您可以搜索的键?
  • kaushik - 抱歉,我不熟悉 Magento,我不知道 _construct 方法名称。 @AlanStorm - 感谢您指出这一点:-)

标签: php magento model


【解决方案1】:

问题中没有足够的信息来提供具体的答案,但总的来说,它没有返回任何值,因为您的 errors 数组没有您在 当时传递的密钥重新填充它

这是一个猜测,但你的电话

$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 数组并不完全是对象——它们的行为更像原始值。它不会自动更新。

【讨论】:

  • 当我在控制器中验证后将 loadlayout 放入它可以工作。谢谢您的回答。我一直在读你的文章。他们很棒。
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 2018-05-09
  • 1970-01-01
  • 2013-08-11
  • 2020-12-08
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多