Da ich vor dem selben Problem mit dem Pfand stand will ich hier mal meine Lösung präsentieren:
Als erstes habe ich in der Datenbank die Tabelle “oxarticles” um ein Feld “cmpawn” erweitert, welches den Artikelpfandpreis beinhalltet.
Danach habe ich mir in Multilanguage Variablen angelegt in den Language Files, die den Namen des Pfandartikels beinhalten. (In meinen Fall “Pfand” “Pawn” etc…)
Nun habe ich ein Bild für den Pfand Artikel in den “out\pictures\master\product\1” Ordner reinkopiert. (In meinem Fall “return.png”)
Dann habe ich die “oxarticle.php” erweitert um den Pfand/formatierten Pfand zurückgeben zu können:
<?php
class cm_oxarticle extends cm_oxarticle_parent
{
/**
* Returns article pawn
*
* @return string
*/
public function getPawn()
{
return $this->oxarticles__cmpawn->value;
}
/**
* Returns formatted article pawn
*
* @return string
*/
public function getFPawn()
{
if(empty($this->oxarticles__cmpawn->value)) {
return;
}
$pawn = oxRegistry::getLang()->formatCurrency( $this->oxarticles__cmpawn->value );
return $pawn;
}
}
Danach habe ich oxbasketitem.php erweitert, damit ich den Pfand/formatierten Pfand zurück geben und den Artikel Link setzen kann.
<?php
class cm_oxBasketItem extends cm_oxBasketItem_parent
{
/**
* Returns article pawn
*
* @return string
*/
public function getPawn()
{
return $oArticle->oxarticles__cmpawn->value;
}
/**
* Returns formatted article pawn
*
* @return string
*/
public function getFPawn()
{
$oArticle = $this->getArticle( true );
if(empty($oArticle->oxarticles__cmpawn->value)) {
return;
}
$pawn = oxRegistry::getLang()->formatCurrency( $oArticle->oxarticles__cmpawn->value );
return $pawn;
}
/**
* Returns total article pawn
*
* @return string
*/
public function getTotalPawn()
{
$oArticle = $this->getArticle( true );
if(empty($oArticle->oxarticles__cmpawn->value)) {
return;
}
return ($oArticle->oxarticles__cmpawn->value * $this->getAmount());
}
/**
* Returns formatted total article pawn
*
* @return string
*/
public function getFTotalPawn()
{
$oArticle = $this->getArticle( true );
if(empty($oArticle->oxarticles__cmpawn->value)) {
return;
}
$pawn = oxRegistry::getLang()->formatCurrency( $oArticle->oxarticles__cmpawn->value * $this->getAmount());
return $pawn;
}
public function setLink($artLink)
{
$this->_sLink = $artLink;
return $this->getSession()->processUrl( $this->_sLink );
}
}
Jetzt habe ich oxbasket.php erweitert. Die Funktion _addbundles wurde erweitert so das geprüft wird ob schon ein Pfandartikel existiert bzw einer angelegt wird sofern noch kein Pfand Artikel mit entsprechenden Preis existiert.
Das eigentliche Anlegen findet in der Funktion “getPawnArticleId” statt.
Beim anlegen wird der Name des Pfandartikels aus unserer angelegten Variable aus den Multilanguage Files genommen und für alle Sprachen richtig gesetzt. Das richtige Bild wird dabei auch im Pfandartikel gesetzt.
‘oxissearch’ wird auf 0 gesetzt damit der Pfandrtikel nicht über die Suche zu finden ist. Nachdem der Artikel dem Warenkorb hinzugefügt wurde setzte ich nun den Link zum eigentlichen Artikel um, damit der Kunde auch nicht über den Link aus dem Warenkorb an den Pfandartikel heran kommt.
<?php
class cm_oxbasket extends cm_oxbasket_parent
{
/**
* Iterates through basket contents and adds bundles to items + adds
* global basket bundles
*
* @return null
*/
protected function _addBundles()
{
$aBundles = array();
// iterating through articles and binding bundles
foreach ( $this->_aBasketContents as $key => $oBasketItem ) {
try {
// adding discount type bundles
if ( !$oBasketItem->isDiscountArticle() && !$oBasketItem->isBundle() ) {
$aBundles = $this->_getItemBundles( $oBasketItem, $aBundles );
} else {
continue;
}
// adding item type bundles
$aArtBundles = $this->_getArticleBundles( $oBasketItem );
//Pfand Artikel als Bundle in den Warenkorb legen
if(!empty($oBasketItem->getArticle()->oxarticles__cmpawn->value))
{
$pAId = $this->getPawnArticleId($oBasketItem->getArticle()->oxarticles__cmpawn->value);
$oBundleItem = $this->addToBasket( $pAId, $oBasketItem->getAmount(), null, null, false, true );
//Pfandrtikel Link auf Artikellink setzen damit man nicht auf die Pfandartikel Seite kommt
if($oBasketItem->getLink() && $oBundleItem) {
$oBundleItem->setLink($oBasketItem->getLink());
}
}
// adding bundles to basket
$this->_addBundlesToBasket( $aArtBundles );
} catch ( oxNoArticleException $oEx ) {
$this->removeItem( $key );
oxRegistry::get("oxUtilsView")->addErrorToDisplay( $oEx );
} catch( oxArticleInputException $oEx ) {
$this->removeItem( $key );
oxRegistry::get("oxUtilsView")->addErrorToDisplay( $oEx );
}
}
// adding global basket bundles
$aBundles = $this->_getBasketBundles( $aBundles );
// adding all bundles to basket
if ( $aBundles ) {
$this->_addBundlesToBasket( $aBundles );
}
}
/**
* Get pawn ArticleId for the given price / create a pawn article of not existent for the given price
*/
protected function getPawnArticleId($price)
{
$oxLang = oxLang::getInstance();
$title = $oxLang->translateString( 'CM_PAWN', 0);
$sSelect = "SELECT oxid FROM oxarticles WHERE oxtitle = '" . $title . "' AND oxprice = '" . $price . "' LIMIT 1";
$qResult = oxDb::getDb(ADODB_FETCH_ASSOC)->getOne($sSelect);
if($qResult==false || $qResult==null) {
$oArticle = oxNew("oxarticle");
$aLangs= $oxLang->getLanguageIds();
$oArticle->assign( array( 'oxarticles__active' => 1,
'oxarticles__oxprice' => $price,
'oxarticles__oxissearch' => 0,
'oxarticles__oxpic1' => 'return.png'
));
$oArticle->save();
//foreach ($aLangs as $iLang){
for($i=0; $i<count($aLangs); $i++) {
$oArticle->setLanguage( $i );
$oArticle->assign(array(
"oxarticles__oxtitle" => $oxLang->translateString( 'CM_PAWN', $i),
));
$oArticle->save();
}
$qResult = $oArticle->oxarticles__oxid->value;
}
return $qResult;
}
}
Nun kann in den Layout Dateien an entsprechender Stelle noch der Pfand ausgegeben werden z.B. auf der Artikelseite oder in der Kategorieansicht. (Mittels der Funktionen aus der oxarticle.php. Da z.B. auf der Artikelseite ja nur der Preis des Artikels steht aber der Pfand noch nicht. Im Warenkorb z.B. ist dies nicht notwendig da hier Pfandartikel liegt.)
So wenn jemand Fehler findet oder Verbesserungsvorschläge hat darf er die gern posten.