Workshop 2 von X: AJAX Filter

So,

ich habe mir die Funktion nun nochmal angeschaut und angepasst:

protected function _getFilterIdsSql( $sCatId, $aFilter )
    {
    $sO2CView = getViewName( 'oxobject2category' );
    $sO2AView = getViewName( 'oxobject2attribute' );

    $sFilter = '';
    $iCnt    = 0;

    $oDb = oxDb::getDb();
    $aSessionFilter = oxSession::getVar( 'session_attrfilter' );
        foreach ( $aSessionFilter as $CatID => $catidtsm ) {
	        foreach ( $catidtsm as $sAttrId => $sValue ) {
	            foreach ( $sValue as $sWerte => $sWert ) {
		            if ( $sWerte ) {
		                if ( $sFilter ) {
		                    $sFilter .= ' or ';
		                }
		                $sAttrWert  = $oDb->quote( $sWerte );
		                $sAttrIds = $oDb->quote( $sAttrId );
		
		                $sFilter .= "( oa.oxattrid = {$sAttrIds} and oa.oxvalue = {$sAttrWert} )";
		                $iCnt++;
		            }
	            }
	        }
	    }
        if ( $sFilter ) {
            $sFilter = "WHERE $sFilter ";
        }

        $sFilterSelect = "select oc.oxobjectid as oxobjectid, count(*) as cnt from ";
        $sFilterSelect.= "(SELECT * FROM $sO2CView WHERE $sO2CView.oxcatnid = '$CatID' GROUP BY $sO2CView.oxobjectid, $sO2CView.oxcatnid) as oc ";
        $sFilterSelect.= "INNER JOIN $sO2AView as oa ON ( oa.oxobjectid = oc.oxobjectid ) ";
        return $sFilterSelect . "{$sFilter} GROUP BY oa.oxobjectid HAVING cnt = $iCnt ";
    }

und

public function executefilter()
    {
        $iLang = oxRegistry::getLang()->getBaseLanguage();
        // store this into session
        $aFilter = oxConfig::getParameter( 'attrfilter', 1 );
        $sActCat = oxConfig::getParameter( 'cnid' );
        $sAjax = oxConfig::getParameter( 'ajax' );
        
        if (isset($aFilter) && $aFilter != "" && $sAjax == "1") {
		$content = array();
		
		foreach( $aFilter as $host => $value ) {

		    foreach( $value as $get_key => $get ) {
		        $content[$sActCat] = $aFilter;
		    }
		
		
		}
		        oxSession::setVar( 'session_attrfilter', $content );
				if ($_POST["delfilter"] == "button2") {
		            	unset( $_SESSION['session_attrfilter'] );
		    	}		
			} else {
		        unset( $_SESSION['session_attrfilter'] );
		    }
	}

Ausgelagert in einer Extra Datei (mit Bootstrap eingebunden) liefert mir die Funktion _getFilterIdsSql() den gewünschten Query.

Im Shop wird aber nur das erste ausgewählte Attribut berücksichtigt (zBsp. Attribut rot ausgewählt - es werden alle roten Artikel angezeigt).
Wenn aber >1 Attribute ausgewählt sind werden wieder alle Artikel angezeigt.

Kann mir von euch einer auf die Sprünge helfen?

Es geht um den Einbau des Multifilters in Oxid CE 4.7.3

VG Thomas