【问题标题】:Submit form values using controller and model in magento admin module在 magento 管理模块中使用控制器和模型提交表单值
【发布时间】:2012-03-15 19:22:08
【问题描述】:

我正在构建一个管理模块,需要处理一个表单,但是在将变量发送到 POST 时遇到了麻烦,我只是重定向到了仪表板。表格如下所示:

<form name="notes" action="<?php echo Mage::helper("adminhtml")->getUrl("foo/index/processnotes/");?>"  method="post">
<input type="hidden" name="another_form_key" value="<? echo $this->getFormKey(); ?>" /> 

我这样做是因为已为管理员启用了安全密钥。它给了我一个像这样的网址:

foo/index/processnotes/key/4745f5fbb9c168778958d5d4a4c2c0ef/

在控制器中我有:

public function processnotesAction(){       
    $model = Mage::getModel('foo/process');
    // I am not sure how I am supposed to send $_POST values here
    }

Package/foo/Model/Process.php

我希望能够在这里处理我的表单中的 POST 变量,但我看不出有什么问题,我只是被发送到仪表板。

<?php
class Package_foo_Model_Process extends Mage_Core_Model_Abstract
{
        public function noteProcess() {     
            $test = $_POST['myValue'];
            echo $test;
     }
}

更新

阅读完答案后,我想添加更多关于我的真实代码在做什么以及我是如何使用 $_POST 的。我正在设置一个简单的示例来发布表单,但意识到我在 Magento 中可能做错了很多事情。

  $query="INSERT INTO `notes_value` ( `color`, `the_id`, `the_value` ) VALUES ";
 $sku = $_POST['color'];
array_pop($_POST);
foreach ($_POST AS $key => $value) {
        $values[] = "('$sku', '$id', '$value')";
}   
$query .= implode(', ', $values) . ';';

我的梦想是我可以 $resource-&gt;getConnection('core_write'); 将其实际插入数据库中,但对目前的进展感觉不太乐观。

【问题讨论】:

    标签: php model-view-controller magento


    【解决方案1】:

    通常当您因为无法识别您的密钥而被重定向到仪表板时。我通常会使用以下语法

            <input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" />
    

    另外,我倾向于禁用管理员密钥来验证这是否是您的问题。

    接下来,永远不要$_POST 与 Magento 一起使用,所有变量都可以访问(干净且安全)。 POST 信息可以全局访问(不仅仅是在控制器中),但是您仍然可以通过控制器在模型中设置变量,如下所示:

    public function processnotesAction(){       
      $model = Mage::getSingleton('foo/process');
      $model->setData('postdata', $this->getRequest()->getPost() );
    }
    

    然后从您的模型中访问它们:

    $this->getData();
    $this->getMyPostedField();
    

    或者你可以在你的模型中使用它

    Mage::app()->getRequest()->getPost();
    Mage::app()->getRequest()->getParam('myargument');
    

    getPost 也可以使用参数来获取单个 POST 值 - 但它不会获取 GET 值。 getParam 将同时返回 GET 和 POST 值。

    【讨论】:

    • 谢谢,我稍微更新了我的问题,以展示我试图获取所有这些值(从单选按钮)然后插入它们的疯狂方式。所以你是说从我的问题的例子中我会把你所拥有的东西添加到控制器中,然后在模型中有类似 $sku=Mage::app()-&gt;getRequest()-&gt;getParam('color'); 的东西吗?
    • 你使用我推荐的任何一种方法。此外,使用$resource-&gt;getConnection('core_write'); 并不是插入数据库的最佳实践——你应该在你的扩展中真正创建自己的 MySQL4 资源。
    【解决方案2】:

    可以通过请求对象Mage_Core_Controller_Request_Http 访问请求参数。示例用法:

    $request = $this->getRequest();
    $params = $request->getParams();
    $someParam = $request->getParam('param_key');
    // or $params = $request->getPost();
    

    然后您需要在模型上设置数据并调用$model-&gt;save()

    【讨论】:

    • 嗨,对不起,我很迷茫。你能否详细说明一些,也许提供一个例子?否则它现在对我来说太抽象了。
    • 你为什么要打电话给$model-&gt;save()?当然,使用 Model 单例会减轻该要求,并且需要 OP 必须编写/使用 save()load() 方法?
    【解决方案3】:

    如果您的控制器扩展了 ActionController,则 preDispatch() 函数负责将您重定向到仪表板(并检查有效的表单键..)。

    我建议您将 Mage::log 调试信息放入 ActionController 的 preDispatch 函数中,这可能有助于确定发生了什么?

    我打算发表评论,但没有足够高的声誉。

    (也许更新你的帖子或评论对你有帮助的答案,看看你是如何解决的(或没有)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多