Modul Direktbestellung: Artikel mit Artikelnummer direkt in den Warenkorb

Hallo zusammen,

ich bin gerade dabei ein kleines Modul zu schreiben, welches es mir ermöglicht auf einer Seite im Shop direkt die Artikelnummer und die Anzahl einzugeben und mit einem Klick auf “in den Warenkorb” den Artikel sofort in den Warenkorb übergibt. Ich denke das sollte eigentlich ganz einfach zu lösen sein, indem ich in der oxcmp_basket eine weitere Funktion über ein Modul hinzuprogrammiere. Ich bekomme jedoch immer eine Fehlermeldung, mit der ich nicht so recht was anfangen kann, nämlich:

[B]Catchable fatal error: Object of class object_ResultSet could not be converted to string in xxxxxxx\core\oxbasket.php on line 407[/B]

Ich habe folgendes bisher gemacht. Ein Modul und eine tpl-Datei erstellt.

Die PHP-Datei sieht so aus:


class direktbestellung extends direktbestellung_parent
{
   public function fasttobasket()
   {
        $am = $this->getConfig()->getParameter("am");
        $art = $this->getConfig()->getParameter("artnum");
        $sOXID = oxDb::getDB()->execute("select oxid from oxarticles where oxartnum = '".$art."' AND oxactive='1' LIMIT 1");		
        
        if(!$am) $am = 1;
        
        if($sOXID) 
        {
            $session = oxSession::getInstance();
    		$basket = $session->getBasket();
    		$basket->addToBasket($sOXID,$am);
        }
   }
}

Das tpl, welches ich für die Eingabe aufrufe so:

[{assign var="template_title" value="Direktbestellung"}]
[{include file="_header.tpl" title=$template_title location=$template_title}]
<div class="direktbestellung">
      <form action="[{ $oViewConf->getSelfActionLink() }]" method="post"> 
		[{ $oViewConf->getHiddenSid() }]
		<input type="hidden" name="cl" value="[{ $oViewConf->getActiveClassName()}]">
		<input type="hidden" name="fnc" value="fasttobasket"> 
			<div class="">
				Artikelnummer
				<input type="text" name="artnum" value="" class="">
				X
				<input type="text" name="am" value="" class="">
				Stück
				<input type="image" src="../but_artikel_hinzufuegen.gif" border="0">
			</div>
	</form>
</div>
[{insert name="oxid_tracker" title=$template_title }]
[{include file="_footer.tpl" }]

Das Modul binde ich so ein:
oxcmp_basket => direktbestellung/direktbestellung

Kann mir vielleicht jemand einen Tipp geben, was mir die Fehlermeldung sagt, bzw. wo mein (Denk)Fehler ist. Vielen vielen Dank schon mal!!!

Viele Grüße,
Kathrin

$sOXID = oxDb::getDB()->execute("select oxid from oxarticles where oxartnum = '".$art."' AND oxactive='1' LIMIT 1");

$sOXID ist ein ADODB-Recordset und enthält [B]nicht [/B]“oxid”…

Versuch es mal damit:

$rs = oxDb::getDB(true)->execute("select oxid from oxarticles where oxartnum = '".$art."' AND oxactive='1' LIMIT 1");
if ($rs != false && $rs->recordCount() > 0) {
    $sOXID=$rs->fields['oxid'];
}

Vielen Dank avenger!!! Das war mir nicht ganz klar. Habe nun Deinen Code genommen und habe damit eine Smarty-Warnung (weiße Seite):

[B]Warning: Smarty error: unable to read resource: “” in xxxxx\core\smarty\Smarty.class.php on line 1093
[/B]
Da ist in der tpl wohl was falsch, oder? Nur was?

Danke für eure Hinweise!!

Nun, damit sicher nicht… :smiley:

Da ist in der tpl wohl was falsch, oder? Nur was?
Das Template ist nicht die Ursache, weil das System gar nicht so weit kommt…

[{assign var=“template_title” value=“Direktbestellung”}]
[{include file=“_header.tpl” title=$template_title location=$template_title}]
[{insert name=“oxid_tracker” title=$template_title }]
[{include file=“_footer.tpl” }]
Auf jeden Fall müssen schon mal diese Zeilen raus, weil Du ja keine vollständige Seite aufbauen , sondern das nur als Codeschnipsel irgendwo in ein bestehendes Template einbauen willst…

Dein Template-Schnipsel hat ja nichts mit der Ausgabe der Antwort auf den Request der Warenkorbablage zu tun, sondern es ermöglicht nur die Warenkorbablage…

Aber:

Deine Routine sagt dem Shop ja überhaupt nicht, wie es nach der Warenkorbablage weiter gehen soll, daher diese Meldung.

Du solltest deshalb statt

$basket->addToBasket($sOXID,$am);
$this->tobasket($sOXID,$am);

verwenden.

Letztere Funktion macht nach der Ablage in den Warenkorb ein “redirect” zur aktuellen Klasse, so dass Smarty dann weiß, welches Template es rendern muss: die aktuelle Klasse…

Da Du dazu das “basket”-Objekt nicht benötigst, kannst Du das Ganze verkürzen zu:

if($sOXID) 
{
    if(!$am) $am = 1; 
    $this->tobasket($sOXID,$am);
}

(Alles ungetestet…)

Erst mal vielen Dank für deine Antwort und deine Erläuterungen!

Auf jeden Fall müssen schon mal diese Zeilen raus, weil Du ja keine vollständige Seite aufbauen , sondern das nur als Codeschnipsel irgendwo in ein bestehendes Template einbauen willst…

Ich baue es nicht in einem Template ein, sondern es wird eine extra Seite bzw. Template ;). Deshalb sollte das denke ich stimmen und die Zeilen müssten drin sein.

$this->tobasket($sOXID,$am);

So hatte ich es ursprünglich auch gehabt, aber dann kam immer folgende Meldung (habs jetzt noch mal versucht, aber gleiche Meldung):

EXCEPTION_SYSTEMCOMPONENT_FUNCTIONNOTFOUND

Heißt das, dass die Funktion “tobasket” nicht gefunden wird? Deshalb hatte ich es überhaupt mit addToBasket probiert.

Ich würde mich sehr über weitere Hinweise freuen :).

[QUOTE=kathrin-77;23341]So hatte ich es ursprünglich auch gehabt, aber dann kam immer folgende Meldung (habs jetzt noch mal versucht, aber gleiche Meldung):

[B]EXCEPTION_SYSTEMCOMPONENT_FUNCTIONNOTFOUND[/B]

Heißt das, dass die Funktion “tobasket” nicht gefunden wird? Deshalb hatte ich es überhaupt mit addToBasket probiert.

Ich würde mich sehr über weitere Hinweise freuen :).[/QUOTE]
Probier’s mal mit “parent::tobasket($sOXID,$am);”

Was Du auch noch berücksichtigen solltest, ist der Fall, dass das Produkt Varianten und/oder Attribute hat…

In dem Fall kannst Du es ja nicht direkt in den Warenkorb legen, sondern musst zur Detail-Seite weiter leiten, damit dort die notwendigen Auswahlen gemacht werden können.

[QUOTE=avenger;23342]Probier’s mal mit “parent::tobasket($sOXID,$am);”
[/QUOTE]

Danke, dieser Aufruf hat schon mal fast geklappt. Fast deshalb, weil wenn ich die Artikelnummer und Stückzahl eingegeben habe und dann absende, bekomme ich immer diese Warnung (weiße Seite):

[B]Warning: Smarty error: unable to read resource: “” in xxxxx\bettmer.de\core\smarty\Smarty.class.php on line 1093[/B]

Wenn ich den zurück-Button des Browsers betätige, dann habe ich diesen netten Layer, der mir sagt, dass ich den Artikel in den Warenkorb gelegt habe. Da ist der Artikel auch wirklich drin, das freut mich schon mal :-). Nun heißt es “nur noch” diese Warnung zu verstehen. Ist das vielleicht doch ein Fehler in der tpl? Sieht so aus, nur wüßte ich nicht wirklich wo. Die Warnung ist relativ nichtssagend?

[QUOTE=avenger;23342]
Was Du auch noch berücksichtigen solltest, ist der Fall, dass das Produkt Varianten und/oder Attribute hat…

In dem Fall kannst Du es ja nicht direkt in den Warenkorb legen, sondern musst zur Detail-Seite weiter leiten, damit dort die notwendigen Auswahlen gemacht werden können.[/QUOTE]
Stimmt, danke für den Hinweis. Frage in der Select bzw. Where nun zusätzlich noch ab OXVARNAME =’’, denn die Varianten haben hier nie etwas zu stehen, sondern nur der Vaterartikel. Müsste hoffentlich reichen. Jedenfalls hat das bei meinen bisherigen Tests so funktioniert. Vorher hatte ich sonst immer 2 Ergebnisse in solch einem Fall zurückbekommen, nun bekommen ich nur eins :slight_smile:
Edit: Hm, zu früh gefreut, so ist es leider nicht immer, da muss ich mir dann wirklich noch was einfallen lassen. Sehe da aber im Moment kein Problem. Denke über die oxparentid sollte es funktionieren, aber das bekomme ich schon hin, wenn ich das oben genannte Problem gelöst habe ;).

Das Ziel ist nun greifbar nah, nur mit dieser Warnung kann ich nichts anfangen??

[QUOTE=kathrin-77;23352]Stimmt, danke für den Hinweis. Frage in der Select bzw. Where nun zusätzlich noch ab OXVARNAME =’’, denn die Varianten haben hier nie etwas zu stehen, sondern nur der Vaterartikel. Müsste hoffentlich reichen. Jedenfalls hat das bei meinen bisherigen Tests so funktioniert. Vorher hatte ich sonst immer 2 Ergebnisse in solch einem Fall zurückbekommen, nun bekommen ich nur eins :)[/QUOTE]
Würde ich anders machen, weil Du so ja nur die varianten prüfst, aber keine Info über Auswahllisten u.a. hast.

Da Du aber jetzt die oxid des Artikels hast, kannst Du Dir ein neues Artikel-Objekt aufbauen, und die entsprechenden Methoden/Eigenschaften abfragen…

Ist m.E. sinnvoller, als das “am Shop vorbei” zu machen

  $oArticle = oxNew( "oxarticle");
  $oArticle->load($sOXID);

[QUOTE=kathrin-77;23352]Fast deshalb, weil wenn ich die Artikelnummer und Stückzahl eingegeben habe und dann absende, bekomme ich immer diese Warnung (weiße Seite):

[B]Warning: Smarty error: unable to read resource: “” in xxxxx\bettmer.de\core\smarty\Smarty.class.php on line 1093[/B][/QUOTE]
Es könnte sein, dass ihn diese Zeile stört:

Normaler Weise erwartet der Shop bei “basket”-Funktionen “tobasket” als fnc, und behandelt diese speziell.

Setze doch mal in Deinem Modul vor “parent::tobasket($sOXID,$am);” fnc auf “tobasket”.

oxconfig::getInstance()->setConfigParam( 'fnc', 'tobasket');

Wie genau verwendest Du Dein Modul?

Wird das über eine eigene Klasse gestartet?

[QUOTE=avenger;23354]Würde ich anders machen, weil Du so ja nur die varianten prüfst, aber keine Info über Auswahllisten u.a. hast.

Da Du aber jetzt die oxid des Artikels hast, kannst Du Dir ein neues Artikel-Objekt aufbauen, und die entsprechenden Methoden/Eigenschaften abfragen…

Ist m.E. sinnvoller, als das “am Shop vorbei” zu machen

  $oArticle = oxNew( "oxarticle");
  $oArticle->load($sOXID);

[/QUOTE]
Danke für den Tipp. Leider versteh ich noch nicht ganz wie du das meinst. Meinst du damit, dass wenn ich deine beiden Zeilen einfüge, dass ich dann die Methode isVariant() oder getAttributes() aufrufen könnte, und so besser und schneller zu prüfen, ob der Artikel eine Variante ist? Wenn ja, dann klingt das sehr sinnvoll und würde es so probieren.

[QUOTE=avenger;23354]
Setze doch mal in Deinem Modul vor “parent::tobasket($sOXID,$am);” fnc auf “tobasket”.

oxconfig::getInstance()->setConfigParam( 'fnc', 'tobasket');

[/QUOTE]

Ok, habe nun bei mir zu stehen:

if($sOXID) {
     if(!$am) $am = 1;
     oxconfig::getInstance()->setConfigParam( 'fnc', 'tobasket');
     parent::tobasket($sOXID,$am);
}

Leider habe ich nachwievor die gleiche Smarty-Warnung :(.

[QUOTE=avenger;23354]
Wie genau verwendest Du Dein Modul?
Wird das über eine eigene Klasse gestartet?
[/QUOTE]
Wie schon im ersten Post erwähnt, binde ich es über
[B]oxcmp_basket => direktbestellung/direktbestellung[/B]
unter System->Module ein.
Das ganze liegt dann natürlich auch in [B]modules/direktbestellung/direktbestellung.php[/B]
Die Klasse heißt: [B]class direktbestellung extends direktbestellung_parent[/B]
Ich rufe das tpl so auf:
[B]index.php?cl=tpl&tpl=direktbestellung.tpl[/B]

Danke das sollte soweit stimmen?

[QUOTE=kathrin-77;23357]Meinst du damit, dass wenn ich deine beiden Zeilen einfüge, dass ich dann die Methode isVariant() oder getAttributes() aufrufen könnte, und so besser und schneller zu prüfen, ob der Artikel eine Variante ist?[/QUOTE]
Im Prinzip ja…

Ob das die geeigneten Methoden sind, weiß ich allerdings nicht…

Es geht aber darum, festzustellen, ob der Artikel Varianten/Attribute [B]hat.
[/B]

[QUOTE=kathrin-77;23357]Ok, habe nun bei mir zu stehen:

if($sOXID) {
     if(!$am) $am = 1;
     oxconfig::getInstance()->setConfigParam( 'fnc', 'tobasket');
     parent::tobasket($sOXID,$am);
}

Leider habe ich nachwievor die gleiche Smarty-Warnung :(.[/QUOTE]
Tja, da hilft nur das Debugging des Ablaufs im Debugger…

[QUOTE=avenger;23359]Im Prinzip ja…

Ob das die geeigneten Methoden sind, weiß ich allerdings nicht…

Es geht aber darum, festzustellen, ob der Artikel Varianten/Attribute [B]hat.
[/B]
[/QUOTE]
Ok, das greife ich dann an, wenn ich das andere Problem gelöst habe. Das andere Problem scheint mir schwerwiegender bzw. schwieriger zu sein, als dieses hier. Solange teste ich mit Artikeln, die keine Varianten haben :).

[QUOTE=avenger;23359]Tja, da hilft nur das Debugging des Ablaufs im Debugger…[/QUOTE]
Gerne, wenn Du mir sagen könntest, wie du dabei vorgehen würdest :). Bisher habe ich mir immer gern über
$this->_aViewData[‘test’] = “irgendwas”;
bestimmte Sachen ausgeben lassen und bin damit immer sehr gut gefahren. Nur leider greift das hier nicht :frowning:

So, ich hatte gerade Lust dazu und habe das mal implementiert.

Für meinen Bedarf als “Box”, die in der linken oder rechten Navileiste plaziert wird, das lässt sich aber leicht für andere Anwendungen anpassen.

(Damit hat man dann eine verbesserte Version der xtCommerce-Box “[B]box_add_a_quickie[/B]”.)

Das Template-Schnipsel für die Box sieht wie folgt aus:

    <div class="h2" id="test_RightSideAddQuickHeader">[{ oxmultilang ident="INC_RIGHTITEM_ADD_QUICK" }]</div>
    <div class="box">
      <div id="fasttobasket">
        <form action="[{ $oViewConf->getSelfActionLink() }]" method="post"> 
          [{ $oViewConf->getHiddenSid() }]
          <input type="hidden" name="cl" value="[{ $oViewConf->getActiveClassName()}]">
          <input type="hidden" name="fnc" value="tobasket"> 
          <input type="hidden" name="fast" value="true"> 
          <div class="fasttobasket">
            Artikelnummer
            <input class="artnum" type="text" name="artnum" value=""> mal
            <input class="am" type="text" name="am" value=""> Stück
            <input class="test_OrderSubmit" type="image" src="[{$tpl_path}]buttons/[{$language}]/button_order.gif">
          </div>
        </form>
      </div>      
    </div>
    <div class="box_footer"> </div>

In die “[B]cust_lang.php[/B]” muss folgende Definition aufgenommen werden:

'INC_RIGHTITEM_ADD_QUICK'                           => 'Schnellbestellung',

Folgend ist der Code für das Modul zum Subclassen der “[B]tobasket[/B]”-Funktion von “[B]views/oxcmp_basket.php[/B]”

Ich habe direkt die “[B]tobasket[/B]”-Funktion überladen, und teile der über den zusätzlichen Parameter “fast=true” mit, dass eine Schnellbestellung abgewickelt werden soll.

Als Modul eingebunden wird das folgende Modul über:

oxcmp_basket => powertemplate/pt_oxcmp_basket/pt_oxcmp_basket

Das Modul ist dazu in “[B]module/powertemplate/pt_oxcmp_basket/pt_oxcmp_basket.php[/B]” zu speichern.

Das Modul prüft, ob mit der eingegebenen Artikelnummer ein Artikel gefunden wird, und gibt eine Meldung aus, wenn nicht.

Es wird auch geprüft, ob der gefundene Artikel Varianten und/oder Selektlisten hat.

In diesem Fall erfolgt dann ein “Redirect” zur Detailseite des Artikels zur weiteren Auswahl

<?php
/**
 *    This file is part of OXID eShop Community Edition.
 *
 *    OXID eShop Community Edition is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    OXID eShop Community Edition is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with OXID eShop Community Edition.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @link http://www.oxid-esales.com
 * @package views
 * @copyright (C) OXID eSales AG 2003-2009
 * @version OXID eShop CE
 * 
 * Allow direct enrty of article number and quantity to be put into the basket
 * 
 * @copyright (C) 2010 Avenger, [email protected]
 * 
 * based on OXID eShop CE
 * 
 * $Id: pt_oxcmp_basket.php 17315 2010-01-25 14:18:58Z avenger $
 */

/**
 * Extension for current session shopping cart (basket item list).
 * OXID eShop -> SHOPPING CART.
 * 
 *  Include with: oxcmp_basket => powertemplate/pt_oxcmp_basket/pt_oxcmp_basket
 * 
 */
 
class pt_oxcmp_basket extends pt_oxcmp_basket_parent
{
   public function tobasket()
   {
      $oConfig=$this->getConfig();
      $fast=$oConfig->getParameter( 'fast');
      if ($fast)
      {
        $NoArticle=false;
        $artnum = $oConfig->getParameter("artnum");
        $rs = oxDb::getDB(true)->execute("select oxid from oxarticles where oxartnum = '".$artnum."' AND oxactive='1' LIMIT 1");
        if ($rs != false && $rs->recordCount() > 0) 
        {
          $sOXID=$rs->fields['oxid'];
          if ($sOXID) 
          {
            $oArticle = oxNew( "oxarticle");
            $oArticle->load($sOXID);
          }
          else
          {
            $NoArticle=true;
          }    
        }  
        else
        {
          $NoArticle=true;
        }    
        if ($NoArticle)
        {
          //Show user a failure message
          $oEx = oxNew( 'oxNoArticleException' );
          $oLang = oxLang::getInstance();
          $oEx->setMessage( sprintf($oLang->translateString( 'EXCEPTION_ARTICLE_ARTICELDOESNOTEXIST', $oLang->getBaseLanguage() ), $artnum) );
          oxUtilsView::getInstance()->addErrorToDisplay( $oEx );
          $class=$oConfig->getParameter("cl");
          oxUtils::getInstance()->redirect( oxConfig::getInstance()->getShopHomeURL() .'cl='.$class, false, 302 );
        }
        else
        {
          //If article has select lists and/or variants redirect to detail page for further selections...
          $redirect=false;
          if ($oArticle->hasMdVariants())
          {
            $redirect=true;
          }
          else
          {
            $aVariantList=$oArticle->getVariantList();
            if (is_array($aVariantList) && sizeof($aVariantList)>0)
            {
              $redirect=true;
            }
            else
            {
              $aSelList=$oArticle->getSelectLists();
              if (is_array($aSelList) && sizeof($aSelList)>0)
              {
                $redirect=true;
              }
            }
          }
          if ($redirect)
          {
            $oxUtils=oxUtils::getInstance();
            if ( $oxUtils->seoIsActive() ) 
            {
              $oxdetaillink = oxSeoEncoderArticle::getInstance()->getArticleUrl( $oArticle);
            } 
            else 
            {
              $oxdetaillink = $oArticle->getStdLink();
            }
            $oxUtils->redirect( $oxdetaillink, false, 302 );
          }
        }
      }
      parent::tobasket($sOXID,$am);
   } 
}

Wahnsinn. Super Arbeit avenger! Das ist ja doch etwas umfangreicher, als ich dachte. Das hätte ich soweit nie hinbekommen.

Ich habe deinen Code 1:1 so eingebaut habe, selbst den Modulnamen hab ich nicht verändert. Hab den smarty-Teil in die _left.tpl gepackt. Leider habe ich nicht einen Artikel in den Warenkorb legen können. Ich springe immer nur zu der Detailseite (was ich eigentlich nicht will, aber das könnte man sicher umbauen). Es kommt auch keine Warnung und kein Fehler :confused:.

Habe dann mal die Zeile

$oxUtils->redirect( $oxdetaillink, false, 302 );

auskommentiert und siehe da, der Artikel wird in den Warenkorb gelegt :).

Alternativ hatte ich versucht für die Variable “$oxdetaillink” einfach einen statischen anderen Link einzusetzen (beispielsweise den Link zum Warenkorb, was nicht sinnvoll ist, sondern nur als Test diente). Die Weiterleitung funktionierte zwar, aber der Artikel wurde wieder nicht in den Warenkorb gelegt. Also scheint irgendwie die Funktion redirect (bei mir zumindest) das “in den Warenkorb legen” zu behindern. Kann mir nur keinen Reim bilden wieso?

Im nächsten Schritt werde ich nun versuchen dein Modul so umzubauen, dass ich dafür ein extra Template (also eine extra Seite) habe :).

Vielen Dank noch mal für die super Arbeit!

Edit: Ich habe gerade mal das Template als “Einzel-Seite” umgebaut, also die Zeilen hinzugefügt:


[{assign var="template_title" value="Direktbestellung"}]
[{include file="_header.tpl" title=$template_title location=$template_title}]
...
[{insert name="oxid_tracker" title=$template_title }]
[{include file="_footer.tpl" }] 

und habe dann die Seite über index.php&cl=tpl&tpl=test.tpl aufgerufen. Auch hier habe ich die gleiche nichtssagende Wahrnung wie bei meinen ersten Gehversuchen bei meinem Modul:
[B]Warning: Smarty error: unable to read resource: “” in xxxxx\bettmer.de\core\smarty\Smarty.class.php on line 1093[/B]
Also das mit der extra Seite scheint auch mit deinem Modul ein Problem zu sein bzw. den gleichen Fehler hervorzurufen?

[QUOTE=kathrin-77;23439]Edit: Ich habe gerade mal das Template als “Einzel-Seite” umgebaut, also die Zeilen hinzugefügt:


[{assign var="template_title" value="Direktbestellung"}]
[{include file="_header.tpl" title=$template_title location=$template_title}]
...
[{insert name="oxid_tracker" title=$template_title }]
[{include file="_footer.tpl" }] 

und habe dann die Seite über index.php&cl=tpl&tpl=test.tpl aufgerufen. Auch hier habe ich die gleiche nichtssagende Wahrnung wie bei meinen ersten Gehversuchen bei meinem Modul:
[B]Warning: Smarty error: unable to read resource: “” in xxxxx\bettmer.de\core\smarty\Smarty.class.php on line 1093[/B]
Also das mit der extra Seite scheint auch mit deinem Modul ein Problem zu sein bzw. den gleichen Fehler hervorzurufen?[/QUOTE]Habe das mal untersucht…

Der Punkt ist, dass Du im Template “[B]test.tpl[/B]” noch

<input type="hidden" name="tpl" value="test.tpl">

einfügen musst!

Ist ja auch logisch, weil der Shop beim Absenden sonst keine Info hat, welches Template er verwenden soll…

Und die aktive Klasse “[B]tpl.php[/B]” ermittelt das zu verwendende Template eben über die Variable “[B]tpl[/B]”.

Wieder was gelernt…

[QUOTE=avenger;23460]

<input type="hidden" name="tpl" value="test.tpl">

[/QUOTE]

Klasse, genau das war es. Hinterher ist es wirklich immer so logisch :).

Und wieder haben wir eine sehr lehrreiche Stunde mit avenger gemeistert :). Echt spitze, bin dir sehr dankbar, da hab ich doch ne ganze Menge gelernt!

[QUOTE=kathrin-77;23527]Klasse, genau das war es. Hinterher ist es wirklich immer so logisch :).

Und wieder haben wir eine sehr lehrreiche Stunde mit avenger gemeistert :). Echt spitze, bin dir sehr dankbar, da hab ich doch ne ganze Menge gelernt![/QUOTE]
Jetzt musst Du nur noch herausfinden, warum Du immer auf die Detailseite weiter geleitet wirst…

[QUOTE=avenger;23534]Jetzt musst Du nur noch herausfinden, warum Du immer auf die Detailseite weiter geleitet wirst…[/QUOTE]
Das hatte ich ja schon gleich am Anfang rausgefunden :-). Funktioniert nun also supi :D.

DANKE!

[QUOTE=kathrin-77;23572]Das hatte ich ja schon gleich am Anfang rausgefunden :-). Funktioniert nun also supi :D.

DANKE![/QUOTE]
Was war die Ursache?

[QUOTE=avenger;23576]Was war die Ursache?[/QUOTE]

Dazu hab ich einfach die Zeile

$oxUtils->redirect( $oxdetaillink, false, 302 );

auskommentiert. Theoretisch könnte man aber den ganzen “if ($redirect)” Zweig ausblenden, denke ich.

Ich habe Deinen Code nun auch etwas erweitert und zwar so, dass ich es sowohl als extra Seite nutze, als auch einfach nur in ein bestehendes Template integriert. Weil es Probleme gab (hatte bei meiner extra Seite noch diesen Fehler mit der weißen Seite), habe ich dem Modul noch folgende Zeilen innerhalb der “if ($NoArticle)” Bedingung hinzugefügt bzw. geändert:


$tpl=$oConfig->getParameter( 'tpl');
oxUtils::getInstance()->redirect( oxConfig::getInstance()->getShopHomeURL() .'cl='.$class.'&tpl='.$tpl, false, 302 );           	

Damit habe ich dann bei beiden Vorgehensweisen das “weiße Seiten” Problem nicht mehr :-).

Ein Problem ist jedoch noch aufgetaucht und zwar bei der Anzeige der Fehlermeldungen. Wenn ich das richtig sehe, gibt es 2 Fehlermeldungen, die auftreten können:
“Der Artikel “xxx” ist leider nicht mehr verfügbar” UND
"Artikel ist nicht kaufbar"

Vieleleicht gibts noch mehr, aber die sind jedenfalls bisher bei mir aufgetraucht bei den Tests. Auf meiner “[B]extra Seite[/B]” werden diese auch [B]richtig angezeigt[/B]. Bei der Einbindung unter der Navi (also das inkludierte), erfolgt leider bei den gleichen Testartikel keine Fehlermeldung, wenn eigentlich “Artikel ist nicht kaufbar” stehen müsste. Heißt, die Meldung:
“Der Artikel “xxx” ist leider nicht mehr verfügbar” wird richtig ausgegeben (bei inkludiert), aber
"Artikel ist nicht kaufbar" wird nicht angezeigt, es passiert einfach nichts.

Klar ist, dass der Artikel gefunden wird und deshalb “NoArticle” nicht gesetzt wird. Das heißt, ich müsste eigentlich nach

$oArticle->load($sOXID);

abfragen, ob der Artikel kaufbar ist, oder nicht und wenn nicht, dann auch NoArtikel auf true setzen, oder? Ich habe es versucht so zu lösen:


if ($sOXID) 
{
    $oArticle = oxNew( "oxarticle");
    $oArticle->load($sOXID);
    if($oArticle->isParentNotBuyable())
      	$NoArticle=true;
}

Jetzt bekomme ich auch eine Fehlermeldung angezeigt in meinem inkludierten Template, aber leider nicht die die ich erwartet habe. Es wird nun bei beiden Varianten (extra Seite und inkludiert) “Der Artikel “4368” ist leider nicht mehr verfügbar”, statt “Artikel ist nicht kaufbar” angezeigt?

Was mache ich falsch??? Bin über Tipps sehr dankbar ;)!

[QUOTE=kathrin-77;23633]Dazu hab ich einfach die Zeile

$oxUtils->redirect( $oxdetaillink, false, 302 );

auskommentiert. Theoretisch könnte man aber den ganzen “if ($redirect)” Zweig ausblenden, denke ich.[[/QUOTE]
Keine gute Idee, wenn es Varianten/Auswahllisten gibt.

[QUOTE=kathrin-77;23633] Klar ist, dass der Artikel gefunden wird und deshalb “NoArticle” nicht gesetzt wird. Das heißt, ich müsste eigentlich nach

$oArticle->load($sOXID);

abfragen, ob der Artikel kaufbar ist, oder nicht und wenn nicht, dann auch NoArtikel auf true setzen, oder? Ich habe es versucht so zu lösen:


if ($sOXID) 
{
    $oArticle = oxNew( "oxarticle");
    $oArticle->load($sOXID);
    if($oArticle->isParentNotBuyable())
          $NoArticle=true;
}

Jetzt bekomme ich auch eine Fehlermeldung angezeigt in meinem inkludierten Template, aber leider nicht die die ich erwartet habe. Es wird nun bei beiden Varianten (extra Seite und inkludiert) “Der Artikel “4368” ist leider nicht mehr verfügbar”, statt “Artikel ist nicht kaufbar” angezeigt? [/QUOTE]
Da musst Du die andere Fehlermeldung definieren, weil jetzt ja nur eine Situation ausgewertet wird…

Statt “EXCEPTION_ARTICLE_ARTICELDOESNOTEXIST” muss in diesem Fall “EXCEPTION_ARTICLE_ARTICELNOTBUYABLE” ausgegeben werden.

Evtl. müsste auch noch auf “EXCEPTION_OUTOFSTOCK_OUTOFSTOCK” geprüft werden.