Folgendes möchte ich tun: (klingt kompliziert, ist aber im Prinzip einfach)
Ein Artikel hat Varianten in versch. Länge.
Meine Kategorien benenne ich "2,5 m bis 3,00m — “3,01 bis 3,50 m” usw.
[Das mache ich zwar auch als Mehrfachfilter rein, aber verschiedene Wege sollen bei mir nach Rom führen]
Der Kunde soll in der Kategorie 2,5m bis 3,00m" den Hauptartikel angezeigt bekommen, aber im Dropdown für die Varianten möchte ich nur die zur Auswahl stellen, die auch der Kategorie entsprechen.
Das ist theoretisch kein Problem, denn man kann alle Varianten einer Kategorie zuordnen. (in der Tabelle “oxobject2category” steht zu meinem Artikel die ID der Kategorie). Aber es werden dennoch alle Varianten angezeigt.
Kurzum müsste meine SQL-Abfrage in der core/oxarticlelist.php
Zeile 929 (protected function _getCategorySelect) sinngemäß wie folgt lauten:
[I]SELECT “alle HauptArtikel der Kategorie”, aber nur die Varianten, die in der Tabelle " oxobject2category" einen Wert zur dieser Kategorie haben.[/I]
So siehts das Original aus:
protected function _getCategorySelect( $sFields, $sCatId, $aSessionFilter )
{
$sArticleTable = getViewName( 'oxarticles' );
$sO2CView = getViewName( 'oxobject2category' );
// ----------------------------------
// sorting
$sSorting = '';
if ( $this->_sCustomSorting ) {
$sSorting = " {$this->_sCustomSorting} , ";
}
// ----------------------------------
// filtering ?
$sFilterSql = '';
if ( $aSessionFilter && isset( $aSessionFilter[$sCatId] ) ) {
$sFilterSql = $this->_getFilterSql($sCatId, $aSessionFilter[$sCatId]);
}
$oDb = oxDb::getDb();
$sSelect = "SELECT $sFields FROM $sO2CView as oc left join $sArticleTable
ON $sArticleTable.oxid = oc.oxobjectid
WHERE ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxparentid = ''
and oc.oxcatnid = ".$oDb->quote($sCatId)." $sFilterSql GROUP BY oc.oxcatnid, oc.oxobjectid ORDER BY $sSorting oc.oxpos, oc.oxobjectid ";
return $sSelect;
}
und so mein Ansatz (nur der SQL String):
$sSelect = "SELECT $sFields FROM $sO2CView as oc left join $sArticleTable
ON $sArticleTable.oxid = oc.oxobjectid
WHERE ".$this->getBaseObject()->getSqlActiveSnippet()."
and oc.oxcatnid = ".$oDb->quote($sCatId)." as varparcheck right join
$sArticleTable ON $sArticleTable.oxparentid = varparcheck.oxobjectid ";
Ich bin jetzt schon etwas weiter, und habe den Ansatzpunkt in der oxarticle.php gefunden, ich krieg es nur nicht hin, dass er mir die Ids (oxid) mit der Objectid aus der Tabelle “oxobject2category” miteinander abfragt, das ist mein Ansatz:
$sSelect = "select ".$oBaseObject->getSelectFields()." from $sArticleTable left join $sO2CView
ON $sArticleTable.oxid = $sO2CView.objectid where " .
$this->getActiveCheckQuery( $blUseCoreTable ) .
$this->getVariantsQuery( $blRemoveNotOrderables, $blUseCoreTable ) .
" order by $sArticleTable.oxsort";
Der SQL-String müsste/wird dann wohl so aussehen:
$sO2CView = getViewName('oxobject2category');
$sSelect = "select FELDER from $sArticleTable as oc left join $sO2CView
ON oc.oxid = $sO2CView.objectid
where $sTable.oxactive = 1 and $sTable.oxparentid = '".$this->getId()."' ";
Leider zeigt er mir dann nur noch den Hautpartikel innerhalb des DRopdownfeldes an…
Nochmal die ganze Funktion als Überblick und im Original:
public function getVariants( $blRemoveNotOrderables = true, $blForceCoreTable = false )
{
if ( $blRemoveNotOrderables && $this->_aVariants ) {
return $this->_aVariants;
} elseif ( !$blRemoveNotOrderables && $this->_aVariantsWithNotOrderables ) {
return $this->_aVariantsWithNotOrderables;
}
$myConfig = $this->getConfig();
if ( !$this->_blLoadVariants ||
( !$this->isAdmin() && !$myConfig->getConfigParam( 'blLoadVariants') ) ||
( !$this->isAdmin() && !$this->oxarticles__oxvarcount->value ) ) {
return array();
}
//do not load me as a parent later
self::$_aLoadedParents[$this->getId()] = $this;
//load simple variants for lists
if ( $this->_isInList() ) {
$oVariants = oxNew( 'oxsimplevariantlist' );
$oVariants->setParent( $this );
} else {
//loading variants
$oVariants = oxNew( 'oxarticlelist' );
$oVariants->getBaseObject()->modifyCacheKey( '_variants' );
}
if ( $this->_blHasVariants = $this->_hasAnyVariant( $blForceCoreTable ) ) {
startProfile("selectVariants");
$blUseCoreTable = $blForceCoreTable;
$oBaseObject = $oVariants->getBaseObject();
$sArticleTable = $this->getTableNameForActiveSnippet( $blUseCoreTable );
$sSelect = "select ".$oBaseObject->getSelectFields()." from $sArticleTable where " .
$this->getActiveCheckQuery( $blUseCoreTable ) .
$this->getVariantsQuery( $blRemoveNotOrderables, $blUseCoreTable ) .
" order by $sArticleTable.oxsort";
$oVariants->selectString( $sSelect );
//if this is multidimensional variants, make additional processing
if ( $myConfig->getConfigParam( 'blUseMultidimensionVariants' ) ) {
$oMdVariants = oxNew( "oxVariantHandler" );
$this->_blHasMdVariants = $oMdVariants->isMdVariant( $oVariants->current() );
}
stopProfile("selectVariants");
}
//if we have variants then depending on config option the parent may be non buyable
if ( !$myConfig->getConfigParam( 'blVariantParentBuyable' ) && $this->_blHasVariants ) {
$this->_blNotBuyableParent = true;
}
//if we have variants, but all variants are incative means article may be non buyable (depends on config option)
if ( !$myConfig->getConfigParam( 'blVariantParentBuyable' ) && $oVariants->count() == 0 && $this->_blHasVariants ) {
$this->_blNotBuyable = true;
}
// cache
if ( $blRemoveNotOrderables ) {
$this->_aVariants = $oVariants;
} else {
$this->_aVariantsWithNotOrderables = $oVariants;
}
return $oVariants;
}