Redirect nach aufruf von Kontrollerklasse verhindern

Hi,

wie kann ich verhindern das nach dem Aufruf einer Funktion aus meiner Controller Klasse ein Redirect ausgeführt wird.

Normal lege ich ja ein Template fest (in der render function) auf welches er dann redirected:


    protected $_sThisTemplate = 'layout/page.tpll';
    public function getTemplateName()
    {
        return $this->_sThisTemplate;
    }
    public function setTemplateName( $sTemplate )
    {
        $this->_sThisTemplate = $sTemplate;
    }
    
    public function render()
    {
        parent::render();
        return $this->getTemplateName();
    }

Wie kann ich das verhindern bzw auf das Template zurück verweisen wo der Nutzer herkamm?

Hab dazu leider nichts im Forum und unter Google gefunden.

Edit:

Das selbe wie beim Login nachzustellen also den cl parameter mittels
[{ $oViewConf->getTopActiveClassName() }] zu setzen und den Parameter fnc auf meine Funktion zu setzen funktioniert leider nicht, da er dann rummeckert das er die Funktion nciht findet:

oxSystemComponentException-oxException (time: 2013-08-21 15:58:29): [0]: ERROR_MESSAGE_SYSTEMCOMPONENT_FUNCTIONNOTFOUND
[...]
 Faulty component --> setManufacturer

Ich verstehe nicht genau was du damit bezwecken willst.
Es hat doch schon seinen Grund, warum du auf die Startseite redirected wirst.
Dieser Grund steht in der EXCEPTION_LOG.txt.
Wieso möchtest du das denn überhaupt machen?

Also ich habe mir in der Sidebar eine Select Box (per CSS gebastelt). Wählt der Nutzer da etwas aus wird meine Funktion aus der Controller Klasse aufgerufen (mittels href link). Die Controller Klasse spring dann leider auf ein Template (bei anderen Funkitionen der Klasse sinnvoll bei dieser nicht).

Ich hätte gerne das der Nutzer in diesem Fall auf seinen jetzigen Template bleibt. Sprich wenn er auf der Startseite ist bleibt er auf der Startseite, wenn er in irgendend einer Artikelseite bleibt er auf der Artikelseite. (klappt beim Login ja auch das der User auf der Seite bleibt wo er war)

Leider habe ich nicht rausgefunden, wie ich diese weiterleitung der Controller Klasse auf das eingestellte Template verhinden.

(Das ganze Prinzip der Login box nachzustellen klappte auch irgendwie nicht da er dann meine Funktion nicht mehr findet)

Etwas spezifischer müsstest du schon werden wenn man da etwas dazu sagen will. Also ich rate mal: du willst eine Funktion eines controllers aufrufen die es schon gibt. Wenn dann das Template des Controllers erscheint ist das keine Weiterleitung sondern normal. Um auf der Seite zu bleiben muss die Funktion entweder in dem Controller der Seite selber oder in einer Komponente stehen. Deshalb geht das beim Login, der steht in der Komponente oxcmp_user und ist daher auf allen Seiten erreichbar.

Ich glaube er meint eher, den “sourcecl”-Parameter, oder?
Beispiel:

  • Uneingeloggt auf eine Detailseite gehen
  • Versuchen den Artikel auf die Merkliste zu legen
  • Dann einloggen und man wird wieder auf die ursprüngliche Detailseite weitergeleitet.
    Korrekt?

Stimmt er schreibt mal “Login” aber dann wieder “Login box”, was für meine Interpretation spricht. :wink:

Ok ich habe mich vielleicht undeutlich ausgedrückt. Mein Fehler.

Also wenn ich z.B. auf der Newsletter Seite bin dann die Loginbox öffne (loginbox.tpl ist das Template dazu) und mich einlogge bleibe ich auf der Seite.

Genau das will ich auch haben, nachdem meine Funkition aufgerufen wurde und die POST Parameter verarbeitet sind soll der Nutzer auf der Seite bleiben wo er war.

Und wenn ich leofonic richtig verstanden habe müste ich also eine Komponente basteln? Sprich:


class meineKlasse extends oxView
{
        public function meineFunktion()
        {
            ...
        }
}

und kann dann mit in einem Template das realisieren:


<a href="[{ $oViewConf->getSelfActionLink() }]cl=[{ $oViewConf->getTopActionClassName() }]&fnc=meineFunktion&parameter1=value1&parameter2=value2">Klick Mich</a>

richtig? :slight_smile:

Ja oder eine bestehende überschreiben (neue musste man in oxubase hardcoded eintragen, weiß nicht ob das noch so ist): http://www.shoptimax.de/blog/technisches/erstellen-erweitern-einer-oxid-eshop-komponente/

[B]Es hat geklappt. Vielen Dank euch beiden!!![/B]

Folgendes habe ich gemacht:


class meineKlasse_oxcmp_utils extends meineKlasse_oxcmp_utils_parent
{   
    public function render()
    {
        parent::render();
        return $this;
    }
    
    public function meineFunktion()
    {
        ...
    }
}

Damit wäre die Funktion schon mal aufrufbar in allen Views. Da aber noch einige Parameter fehlen ab und an noch schnell eine zweite Funktion gebastelt (siehe logoutlink in der loginbox.tpl). Da [{$oxcmp_utils->meineFunktion()}] leider nicht funktioniert (siehe leofonic’s Link) mussen wir die 2. Funktion per oxviewconfig verfügbar machen
[B]NACHTRAG es Funktioneirt doch!!! Da wir ja die Render Methode in der extendeten Klasse hinzugefügt haben siehe weiter unten:[/B]


class zweiteKlasse_oxviewconfig extends zweiteKlasse_oxviewconfig_parent
{
    public function getMyLink($fnc)
    {
        $sClass         = $this->getTopActionClassName();
        $sCatnid        = $this->getActCatId();
        $sMnfid         = $this->getActManufacturerId();
        $sArtnid        = $this->getActArticleId();
        $sTplName       = $this->getActTplName();
        $sContentLoadId = $this->getActContentLoadId();
        $sSearchParam   = $this->getActSearchParam();
        $sSearchTag     = $this->getActSearchTag();
        $sRecommId      = $this->getActRecommendationId();
        $sListType      = $this->getActListType();

        $oConfig = $this->getConfig();
        return ( $oConfig->isSsl()? $oConfig->getShopSecureHomeUrl() : $oConfig->getShopHomeUrl() )
            ."cl={$sClass}"
            . ( $sCatnid ? "&cnid={$sCatnid}" : '' )
            . ( $sArtnid ? "&anid={$sArtnid}" : '' )
            . ( $sMnfid ? "&mnid={$sMnfid}" : '' )
            . ( $sSearchParam ? "&searchparam={$sSearchParam}" : '' )
            . ( $sSearchTag ? "&searchtag={$sSearchTag}" : '' )
            . ( $sRecommId ? "&recommid={$sRecommId}" : '' )
            . ( $sListType ? "&listtype={$sListType}" : '' )
            . "&fnc=".$fnc
            . ( $sTplName ? "&tpl=".basename( $sTplName ) : '' )
            . ( $sContentLoadId ? "&oxloadid=" . $sContentLoadId : '' )
            . "&redirect=1";
    }
}

NACHTRAG:
Wer nicht oxviewconfig extenden will kann auch folgende Funktion in die Klasse meineKlasse_oxcmp_utils hinzufügem:


    public function getMyLink($fnc)
    {
        $oConfig = $this->getConfig();

        $sLogoutLink = $oConfig->isSsl()? $oConfig->getShopSecureHomeUrl() : $oConfig->getShopHomeUrl();
        $sLogoutLink .= 'cl='.$oConfig->getRequestParameter('cl').$this->getParent()->getDynUrlParams();
        if ( $sParam = $oConfig->getRequestParameter('anid') ) {
            $sLogoutLink .= '&anid='.$sParam;
        }
        if ( $sParam = $oConfig->getRequestParameter('cnid') ) {
            $sLogoutLink .= '&cnid='.$sParam;
        }
        if ( $sParam = $oConfig->getRequestParameter('mnid') ) {
            $sLogoutLink .= '&mnid='.$sParam;
        }
        if ( $sParam = $oConfig->getRequestParameter('tpl') ) {
            $sLogoutLink .= '&tpl='.$sParam;
        }
        if ( $sParam = $oConfig->getRequestParameter('oxloadid') ) {
            $sLogoutLink .= '&oxloadid='.$sParam;
        }
        if ( $sParam = $oConfig->getRequestParameter('recommid') ) {
            $sLogoutLink .= '&recommid='.$sParam;
        }
        return $sLogoutLink.'&fnc='.$fnc;
    }

in der metadata.php sollte dann folgendes stehen:


    'extend'      => array(
        'oxviewconfig' => 'mein_Modul/zweiteKlasse_oxviewconfig',
        'oxcmp_utils' => 'mein_Modul/application/controllers/meineKlasse_oxcmp_utils', /* nicht benötigt wenn oxviewconfig nicht extended wird*/
    ),

Im Template ist dann folgendes möglich:


<a href="[{ $oViewConf->getMyLink(meineFunktion) }]&parameter1=value1&parameter2=value2">mein Link</a>

bzw wenn oxviewconfig nicht extendet wurde un die Funktion in unsere Komponente hinzugefügt wurde auch folgendes:


<a href="[{  $oxcmp_utils->getMyLink(meineFunktion) }]&parameter1=value1&parameter2=value2">mein Link</a>

Die Funktion wird nun aufgerufen und die Parameter können abgerufen und verarbeitet werden.
(mittels: $param1 = oxConfig::getParameter( ‘Parameter1’ ); usw…) :slight_smile:

P.S. ich hoffe da sind keine Schreibfehler drin in meiner Lösung