2

我正在使用 Zend 框架。作为一种设计模式,我使用的是状态设计模式。

现在您可能知道,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”类中创建控制器的新实例

有没有人可以帮助我?

编辑 - - - - - - - - - - - - - - - - - -

这是我的控制器:

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;
}
}
4

2 回答 2

1

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

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

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

然后它变得像做类似的事情一样容易

$lokModel->setButton($postData['button'])
于 2012-10-02T15:54:31.083 回答
0

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

我试图实施您的解决方案,但不幸的是它没有奏效。

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

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

这就是 Google Chrom 调试器中 JSON 响应的样子。如果您熟悉此 Google Chrome 调试器,您就会明白我的意思。

现在我想要的按钮名称在 " 标签之间,唯一的问题是,把它从那里拿出来。并能够在触发响应之前使用它。我还在控制器的 init() 和 indexAktion() 方法中尝试了 getPost() 和 getParam('button') ,但它仍然不起作用

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

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

还有其他想法吗?

于 2012-10-03T08:39:44.423 回答