2

ZendFrameworkを使用しています。デザインパターンとして、状態デザインパターンを使用しています。

ご存知かもしれませんが、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"]

これは、GoogleChromデバッガーでのJSON応答のようになります。このGoogleChromeデバッガーに精通している場合は、私が何を意味するかを知っています。

今、私が欲しいボタン名は&quotタグの間にあり、唯一の問題はそこからそれを取り除くことです。応答がトリガーされる前にそれを使用できること。また、コントローラーの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 に答える