2013-01-13 23 views
8

इन स्थितियों के लिए, मैं ऑटो वापस मैं कहाँ से अनुरोध किया पृष्ठों पर करना चाहते हैं:मैं ज़ेंड फ्रेमवर्क 2 में पिछले पृष्ठ पर रीडायरेक्ट कैसे कर सकता हूं?

  1. किसी भी कार्रवाई परिष्करण (CRUD आदि) के बाद - यहाँ मुझे लगता है कि हम 'HTTP_REFERER'
  2. पर रीडायरेक्ट करना होगा
  3. सर्फिंग या खरीदारी, अगर लॉगिन आवश्यक है, तो प्रमाणीकरण प्रक्रिया खत्म करने के बाद, इसे वापस एक ही पृष्ठ पर

एक अलग स्थिति रीडायरेक्ट करना चाहिए जबकि (जो नहीं है 'पिछले पृष्ठ पर रीडायरेक्ट'):

  • क्वेरी में एक रीडायरेक्ट यूआरएल (लैंडिंग पेज एड्रेस) पास करें, उदाहरण के लिए: यदि मैं लॉगिन के बाद जीईटी क्वेरी पैरामीटर (या रूट पार्ट) के रूप में एक (बाहरी)/यूआरएल (ऑफसी एन्कोडेड) भेजता हूं, तो मुझे इसे रीडायरेक्ट करना चाहिए इस URL

मैं पहले से ही इस बात के लिए नेट पर खोज की है और some solutions पाया लेकिन वे 2 Zend फ्रेमवर्क के अनुसार नहीं कर रहे हैं है। मैं यह सब zf2 तरीके से करना चाहता हूं।

किसी भी मदद के लिए धन्यवाद!

उत्तर

12

ठीक है, सीआरयूडी सामान के लिए, मैं बस पिछली क्रिया के मार्गों पर रीडायरेक्ट करता हूं, आमतौर पर admin-index, administrate या जो भी कुछ भी। मैं वास्तव में नहीं देखता कि आपको उस मामले में HTTP_REFERER क्यों चाहिए। यदि फिर भी आप अभी भी HTTP_REFERER यह इस रूप में सरल है का उपयोग करना चाहते हैं:

//SomeController.php 
$redirectUrl = $this->getRequest()->getHeader('HTTP_REFERER', $defaultValue); 

अधिक जानकारी के लिए देख Zend\Http\Request

एक रीडायरेक्ट का उपयोग किया जा होगा Zend\Mvc\Controller\AbstractActionController

$this->redirect()->toUrl($redirectUrl); //or using a route: 
$this->redirect()->toRoute('some/route'); 

की redirect() करने के लिए अपने उपयोग-मामलों के कुछ और लाइव उदाहरण देखें, मेरा सुझाव है कि आप कुछ मॉड्यूल देखें जो आपके उपयोग-मामलों में काफी फिट हैं। शायद सबसे उपयुक्त लोग यहां Zf-Commons\ZfcUser और bjyoungblood\BjyAuthorize होंगे। उन सभी उदाहरणों के लिए मैंने प्रासंगिक कोड-नमूने लिंक किए हैं जो आपकी आवश्यकताओं के बारे में कुछ अंतर्दृष्टि निकाल सकते हैं।

+0

त्वरित उत्तर के लिए धन्यवाद @ सैम। यह वही है जो मैं देख रहा था :) – Sanju

+0

क्षमा करें सैम लेकिन आपके लिंक तोड़ दिए गए हैं (वैसे भी +1) –

+0

@ फिपालेन कॉन्स्टेंटिन मेरी शक्ति से बाहर अगर गिथब्स लिंक तोड़ते हैं। मैंने विशेष रूप से प्रतिबद्ध लिंक का उपयोग किया ताकि वे उपलब्ध हों: एस – Sam

20

यह मेरे लिए काम किया:

$url = $this->getRequest()->getHeader('Referer')->getUri(); 
$this->redirect()->toUrl($url); 
0

के ऊपर मेरे लिए काम किया Neighter, लेकिन इस:

$url = $this->getRequest()->getHeaders('cookie')->original_url; 
$this->redirect()->toUrl($url); 

[मैं हालांकि की सराहना करेंगे, अगर किसी ने मुझसे अप को मंजूरी दे दी, क्यों 'रेफ़रर रास्ता 'मेरे लिए काम नहीं करता है! :) धन्यवाद!]

2

मुझे लगता है कि रेफरर फ़ील्ड केवल तभी सेट होता है जब आप लिंक पर क्लिक करते हैं और खुद को योग्य पृष्ठ पर रीडायरेक्ट करने देते हैं। उदाहरण के लिए http://www.whatismyreferer.com/ लें। जब आप इसे Google करते हैं और लिंक पर क्लिक करते हैं, जो आपको इस साइट पर ले जाता है, तो रेफरर Google होगा। लेकिन अगर आप इस यूआरएल को अपने वेब ब्राउजर पर कॉपी और पेस्ट करते हैं, तो रेफरर पेज अपरिभाषित होगा। क्या मै गलत हु?

$referer = $this->getRequest()->getHeader('Referer'); 
if ($referer) { 
    $refererUrl = $referer->uri()->getPath(); // referer url 
    $refererHost = $referer->uri()->getHost(); // referer host 
    $host = $this->getRequest()->getUri()->getHost(); // current host 

    // only redirect to previous page if request comes from same host 
    if ($refererUrl && ($refererHost == $host)) { 
     return $this->redirect()->toUrl($refererUrl); 
    } 
} 
// redirect to home if no referer or from another page 
return $this->redirect()->toRoute('home'); 
0

सिर्फ मेरा अंतिम कोड है कि संभालती उपयोगकर्ता किसी अन्य पृष्ठ से आता है से एक टुकड़ा साझा करना चाहते थे।

<?php 

namespace Application\Controller\Plugin; 

use Zend\Session; 

trait RefererRedirect 
{ 
    /** 
    * @var Session\Container 
    */ 
    private $sessionContainer; 

    /** 
    * @param Session\Container $sessionContainer 
    */ 
    public function setSessionContainer(Session\Container $sessionContainer) 
    { 
     $this->sessionContainer = $sessionContainer; 
    } 

    protected function clearReferer() 
    { 
     $this->sessionContainer->offsetUnset('referer'); 
    } 

    protected function registerReferer() 
    { 
     if (!$this->sessionContainer->offsetExists('referer')) { 
      $this->sessionContainer->offsetSet('referer', $this->getRequest()->getHeader('Referer')->uri()->getPath()); 
     } 
    } 

    protected function redirectToRefererOrDefaultRoute($defaultRoute, $defaultParams = []) 
    { 
     if ($this->sessionContainer->offsetExists('referer')) { 
      $url = $this->sessionContainer->offsetGet('referer'); 
      $this->clearReferer(); 

      return $this->redirect()->toUrl($url); 
     } 

     return $this->redirect()->toRoute($defaultRoute, $defaultParams); 
    } 
} 

फिर एक अंतरफलक:

<?php 

namespace Application; 

use Zend\Session; 

interface RefererAwareInterface 
{ 
    /** 
    * @param Session\Container $sessionContainer 
    */ 
    public function setSessionContainer(Session\Container $sessionContainer); 
} 

फिर SessionContainer सुई इंटरफ़ेस का उपयोग:

एक विशेषता पहले बनाएं

<?php 

namespace Application; 

class Module 
{ 
    public function getControllerConfig() 
    { 
     return [ 
      'factories' => [ 
      ], 
      'initializers' => array(
       function ($instance, $sm) { 
        if ($instance instanceof RefererAwareInterface) { 
         $instance->setSessionContainer(new Session\Container('Referer')); 
        } 
       } 
      ) 
     ]; 
    } 
} 
फिर अपने नियंत्रक में

:

<?php 

namespace Auth\Controller; 

class UsersController extends AbstractActionController implements RefererAwareInterface 
{ 
    use RefererRedirect; 

    public function indexAction() 
    { 
     $this->clearReferer(); 

     // do stuff 
    } 

    public function addAction() 
    { 
     $this->registerReferer(); 

     // do stuff 

     return $this->redirectToRefererOrDefaultRoute('auth/users'); 
    } 

    public function backAction() 
    { 
     return $this->redirectToRefererOrDefaultRoute('auth/users'); 
    } 
} 
0

यहां एक बढ़िया चाल है: