通过Zend Framework Controller将Ajax请求数据参数传递给模型类

时间:2012-10-02 13:50:56

标签: zend-framework state ajax-request

我正在使用Zend Framework。 作为一种设计模式,我正在使用状态设计模式。

现在您可能知道,Zend Framework允许您创建自定义控制器,可用于响应Ajax请求。 在我的例子中,我有以下ajax请求

    function getResponse(name){
        $.ajax({
            dataType: 'json',
            data: {button: name},
            url: 'motor/ajaxtest',
            type: 'post',
            success: function(response)
            {
            }
        });
    }

每次按下特定按钮时都会调用函数getResponse。

public function ajaxtestAction()
{
    $input_in = $this->getRequest()->getParam('button');

    $Lok = new Lok();
    $this->_helper->viewRenderer->setNoRender();

    $text = array($Lok->getMotorState());
    $phpNative = Zend_Json::encode($text);
    echo $phpNative;
}

上面的代码是我对ajax请求的自定义响应。我想将按下的按钮的名称传递给$ Lok = new Lok();所以我可以在“Lok”模型类中使用它,而无需在“Lok”类中创建控制器的新实例

有没有人可以帮助我?

EDIT -----------------------------------

这是我的控制器:

class MotorController extends Zend_Controller_Action
{
public function init()
{
}

public function indexAction() 
{ 
}

public function ajaxtestAction()
{
    $input_in = array($this->getRequest()->getParam('button'));
    $phpNativ1 = Zend_Json::encode($input_in);
    echo $phpNativ1;

    $Lok = new Lok();
    echo $input_in;
    $this->_helper->viewRenderer->setNoRender();

    $text = array($Lok->getMotorState());
    $phpNative = Zend_Json::encode($text);
    echo $phpNative;
}
}

以下是我的Jquery函数:

$(document).ready(function(){

    $("p").click(function(){
        $(this).hide();
        $("input[name=State]").val('Forwards');
    });

    function getResponse(name){
        $.ajax({
            dataType: 'json',
            data: {button: name},
        url: 'motor/ajaxtest',
        type: 'post',
        success: function(response)
        {
        }
        });
    }

    $("button[name=on]").click(function() {
        var d_response = getResponse('on');
    });
});

这是我的Lok.php文件:

class Lok
{
private $newMotor;
private $newTimer;
private $newSpeaker;
private $mySession;
private $motorState;
private $input;

public function __construct()
{
    //Method instances
    $newMotor = new Motor();
    $newTimer = new Timer();
    $newSpeaker = new Speaker();    
    $this->motorState = $newMotor->getMotorState();

    // Declaring the Session
    $mySession = new Zend_Session_Namespace();
    $mySession->s_motorState = $this->motorState;
}

public function __get($mySession)
{
    return $this->mySession;
}

public function __set($motorState, $mySession)
{
    $this->$mySession->s_motorState = $motorState;
}

public function getMotorState()
{
    return $this->motorState;
}

public function playSound($soundNumber)
{
    echo "Playing sound";
}

public function resetTimer()
{
    echo "Resetting timer";
}

public function setInput($input_in)
{
    $this->input=$input_in;
}
}

2 个答案:

答案 0 :(得分:1)

正如我之前所说,您应该通过调用请求发布数据来获取按钮名称,这可以通过$postData = $this->getRequest()->getPost()

完成

然后,要将输出输入模型,在模型类中,您将为其创建属性以及setter和getter方法。

class Lok {
    protected $button;
    public function setButton($btn){}
    public function getButton(){}
}

然后就像做

这样的事情一样容易
$lokModel->setButton($postData['button'])

答案 1 :(得分:0)

首先,感谢您发布解决方案。

我试图实施你的解决方案,但不幸的是它没有用。

所以经过一夜好眠,我再次看了一下这个问题。我认为问题是,那 $ postData = $ this-> getRequest() - > getPost()或$ postData = $ this-> getRequest() - > getParam('button') 在响应itelfe中执行。

<pre>string(2) &quot;sr&quot;
</pre>["Not Moving"]

这是JSON响应在Google Chrom调试器中的样子。如果您熟悉此Google Chrome调试器,您就知道我的意思了。

现在我想要的按钮名称位于&amp; quot标签之间唯一的问题是,将它从那里拿出来。并且能够在触发响应之前使用它。我还尝试了init()中的getPost()和getParam('button')以及Controller中的indexAktion()方法,但它仍然无法正常工作

public function init()
{
       postData = $this->getRequest()->getPost()
       $lokModel->setButton($postData['button'])
}

public function indexAction() 
{ 
       postData = $this->getRequest()->getPost()
       $lokModel->setButton($postData['button'])
}

还有其他想法吗?