2012-02-21 4 views
0

私はZend Frameworkを使ってWebアプリケーションを作成しています。 一部のページでは、クリックしたときにサーバー上でスクリプトを実行することを想定したリンクがあります。私はこのリンクをアクションコントローラに関連付けることでこれを行います。 リンクをクリックすると、アクションコントローラのコードが実行されますが、リンクをクリックした元のページを残さずに済みます。Zend Framework:Webページを離れずにスクリプトを実行するためのハイパーリンク?

どのようにするには?

あなたはアクションがページを離れることなく実行取得したいので、AJAXを使用する必要があります.....

+1

[Ajax](http://en.wikipedia.org/wiki/XMLHttpRequest)を使用して、一部のパラメータに基づいて適切なコントローラ/アクションをレンダリングできるAjaxコントローラを実行するか、Ajaxコールでコントローラ/アクションを直接実行し、応答で何かを実行します。 jQueryやPrototypeなどのJavascriptライブラリには、Ajaxリクエストを行うオブジェクトがあります。 – drew010

答えて

1

を助けてください:

たとえばあなたはjqueryのを使用している場合:

$("#myLink").click(function() 
{ 
    $.ajax({ 
     type: "GET", 
     url: "/my/action", //your action 
     data: "item="+item, //a value that you might want to send to your action 
     success: function(html, msg){ 
      //do something on success 
     } 
    }); 
}); 
+0

ajaxを使用せずにページを離れてリンクをクリックする方法はありますか? –

+2

私が知っている唯一の方法は、現在のページをリロードしたり残したりせずに、ajaxを使うことです。 –

1

これをPHPで行う方法はありますが、ページの更新を行う必要があります。 これは私が同じページにとどまるために使う方法の1つです$this->_redirect($this->getRequest()->getRequestUri());あなたがリクエストしたのと同じページに戻ってくるでしょうが、それはページのリフレッシュを引き起こします。
_forward()は、同じリクエスト内で別のアクションを実行できるようになるため、あなたの役に立つかもしれません。
あなたがしたいことは、ajaxを使わずに行うことができますが、一定数のページリフレッシュに耐えます。

アクション

public function indexAction() { 

     //get form and pass to view 
     $form = new Admin_Form_Station(); 
     $form->setAction('/admin/index'); 
     $form->setName('setStation'); 

     $this->view->station = $this->_session->stationName; 
     $this->view->stationComment = $this->_session->stationComment; 
     $this->view->form = $form; 

     try { 
      //get form values from request object 
      if ($this->getRequest()->isPost()) { 

       if ($form->isValid($this->getRequest()->getPost())) { 

        $data = (object)$form->getValues(); 

        //set session variable 'station' 
        $this->_session->station = $data->station; 

        //assign station name and comment to session 
        $station = new Application_Model_DbTable_Station(); 
        $currentStation = $station->getStation($this->_session->station); 
        $this->_session->stationName = $currentStation->station; 
        $this->_session->stationComment = $currentStation->comment; 

        //assign array() of stations to session namespace 
        $stations = $station->fetchAllStation(); 
        $this->_session->stations = $stations; 

        //assign array() of bidlocations to session namespace 
        $bidLocation = new Application_Model_DbTable_BidLocation(); 
        $bidLocations = $bidLocation->fetchAllBidLocation($this->_stationId); 
        $this->_session->bidLocations = $bidLocations; 

        //display the same page with properties set 
        $this->_redirect($this->getRequest()->getRequestUri()); 
       } 
      } 
     } catch (Zend_Exception $e) { 
      //assign error to flash messenger...TODO not for production 
      $this->_helper->flashMessenger->addMessage($e->getMessage()); 
      //refresh the page and display message 
      $this->_redirect($this->getRequest()->getRequestUri()); 
     } 
    } 

とビューの

<?php if (!$this->station): ?> 
    <div class="span-5 prepend-2"> 
     <?php echo $this->form ?> 
    </div> 
    <div class="span-10 prepend-2 last"> 
     <p style="font-size: 2em">Please select the Station you wish to perform Administration actions on.</p> 
    </div> 
<?php else: ?> 
    <div class="span-19 last"> 
     <?php echo $this->render('_station.phtml') ?> 
    </div> 
<?php endif; ?> 

私が働くようでない解決策を見つけました。
通常のようにビュー内でリンクを使用すると、アクションを呼び出して実行します。処理中のアクションでは、表示中のページにリダイレクトされます。考慮する必要があるのは、一時的なデータが失われるため、保持する必要のある一時的なデータを永続化する(セッションを行う)戦略が重要になることです。私は通常、Zend_Session_Namespaceを日常的に使用してデータを保持します。上のコードサンプルは、必要なデータをどのように保持するかの良い例です。
私自身のアプリケーションでこれをテストしましたが、データが利用可能なままである限り、内容やURLに目立った変更がなくページが更新されます。

+0

私はこれが間違いだと思います。getRequestUri()は、ページのUriではなく、私はリクエストを作成しましたので、このリクエストのリダイレクトは無限ループに入ります(私はこれを試しました) –

+0

@AlaABUDEEB $ this - > _ redirect($ this-> getRequest()を使用しようとしています) - > getRequestUri());私はパラメータを設定し、成功またはエラーのためにメッセージをフラッシュするために、これを頻繁に小さなフォームで使用します。 – RockyFord

+0

aha、私はあなたのポイントを理解しています、あなたの方法はフォームを使用する場合にのみ有効です。それはちょっと考えて、setAction()メソッドを持たない通常のハイパーリンクを使ってこれをどうやって試してみるか、自分で試してみてください。 –

関連する問題