Workshop 2 von X: AJAX Filter

Danke.

Ja. Ich habe auch php bezogen kein Problem, Arrays zu verarbeiten. Mir fehlt aber der Ansatz das Oxid konform zu gestalten. Da könnte man schon wieder behaupten, ich habe Probleme, Arrays zu verarbeiten.
Die Welt ist grausam.
:wink:

Vg Thomas

Hallo,

der Filter filtert leider nicht wie gewünscht. Die Post Parameter werden korrekt übertragen, die Anfrage wird bei mir aber nicht korrekt verarbeitet. Egal welches Attribut ausgewählt wird, es erscheinen immer alle Artikel.

Wenn die Haken dann wieder komplett entfernt werden, führt das zu einem Fehler, dass die Funktion “executefilter()” nicht verfügbar ist.

Function 'executefilter' does not exist or is not accessible! (aListPlus)

Ich habe die Module im Shop nicht eigetragen, sondern zum Testen die entsprechenden Dateien direkt geändert. Dies wird dann im Livebetrieb geändert und als Modul angehangen und eingetragen.

Im Oxid Error Log steht nur dann ein Fehler, wenn alle haken entfernt werden und die fehlende “executefilter()” Funktion bemängelt wird. Bei allen anderen Aktionen wird kein Fehler gespeichert. Im Apache Error Log wird ein Fehler angezeigt, wenn der Button “Alle Filter löschen” geklickt wird. Hier erscheint die Meldung, dass der Shop in der Datei oxattributelist.php keinen String als Array nutzen kann.

Es sieht so aus, als ob der $aSessionFilter nicht korrekt als Arrays definiert wird.

Die Dateien sind korrekt geändert. Ich habe es in einem aktuellen Shop eingebaut (4.7.3). In dem Shop sind keine weiteren Änderung vorgenommen worden.

Viele Grüße, Thomas

Gibt es von euch da einen Ansatz, woran es aktuell hängt?

Bau es doch zuerst mal orignal ein. Dann gehts es so wie hier: http://forum.oxid-esales.com/showthread.php?t=10530&page=3#post63946

Hallo tvtotal,

das ist es ja eben. Es geht leider nicht wie im Malershop.

Die Parameter werden genau wie im Malershop übertragen. Nur an der Auswertung scheint es zu hängen. Eingebaut ist es wie im Modul angegeben.

Leider mit dem vormals beschriebenen Ergebnis.

VG Thomas

Es wird im Übrigen der Wert des Attributfilters nicht korrekt in die Session geschrieben. Im Post steht der richtige Wert drin, zBsp. die mehrfache Farbenauswahl. In der Session steht dann aber nur die zuletzt ausgewählte. Die vorletzte Farbe (in diesem Beispiel) wird dann überschrieben.

Ich suche den Fehler weiter und hoffe hier bald ein Ergebnis liefern zu können.

VG Thomas

PS. Meine Angaben beziehen sich auf meinen Shop. Grundsätzlich funktioniert es ja bei den Anderen. Warum aber gerade bei mir nicht versuche ich hier heraus zu finden.

Das hört sich das so an, also b du die falsche Version hast.

Es gab eigentlich nur eine Version zum Download. Ich habe das Modul im Premierline Shop runtergeladen.

Gibt es denn noch andere Versionen?

Danke :slight_smile:

VG Thomas

Edit: Ich habe die Modulversion “AJAX Filter 4.50”

Bestimmt. Zwischen 450 und jetzt sind ja eine Mnege Versionen.

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

Ja, wie konnte ich das denn übersehen. Bzw. für was ist denn das? Die Datensätze sind doch bereits gefiltert.

 HAVING cnt = $iCnt 

Nachdem ich es entfernt habe läuft alles wie gewünscht.

VG Thomas

Wieso entfernt? Im Orginal ist das doch garnicht drin.

Da hast du recht. In der Original Oxid-Version der Funktion ist es drin. Wahrscheinlich habe ich beim Kopieren der Ursprungsfunktion den Schnipsel übersehen.

VG Thomas

So ist es. Ich habe gerade auch einen Link zur neuen Version bekommen. Funktioniert genauso, wie die alte Version.

Wie ist der aktuelle Stand des Filters? Ist er voll funktionsfähig und wenn ja, wo kann ich diesen herunterladen?

Geht, habe aber momentan nur einen Demolink. http://465.premiereline.de/Kiteboarding/Kites/

Eine Frage ist jetzt noch aufgetaucht.
Im Shop (OXID CE 4.7.3) ist “ISO-8859-15” eingestellt. Der AJAX Request geht aber mit UTF-8 raus.

Als Ergebnis werden bei Attributen wie zum Beispiel “grün” keine Ergebnisse geliefert, bzw. keine Artikel gefiltert.

In dem $_POST Wert für die Attribute steht die Farbe “grün” (oder auch “weiß”) noch korrekt drin.

In der Session landen diese Werte aber als grÌn oder weiß, was ja bedeutet, dass die Werte aus UTF-8 wieder in ISO umgewandelt wurden.

In einem OXID CE 4.6 Shop auf dem selben Server funktioniert der Filter mit Umlauten (normaler Oxid-Attribut Filter).

Meine Frage ist, übersehe ich etwas?
Die Datenbank Kollation sollte ja eigentlich noch nicht ins Gewicht fallen, da die Werte ja direkt aus dem Shop in die Session gehen, ohne nochmal mit der Datenbank in Berührung zu kommen.

Die beiden Shops laufen in ISO-8859-15, UTF-8 Mode ist 0.

Im Demoshop für den Ajax Multifilter ist das Verhalten auch zu beobachten, der Request geht mit UTF-8 raus und der Antwort-Header ist ISO-8859-15.
Leider ist bei den Atrributen im Demoshop kein Umlaut mit dabei, um das (evtl. falsche) Ergebnis für zBsp. grün zu sehen.

VG Thomas

gibt es eigendlich einen aktuellen download ??

Eigen"d"lich ? Naja, die neuen Rechtschreibregeln sind mir nicht gel"e"ufig :wink:

Im Anhang. Schönen Sonntag !

Hi,
habe mir die Demoshops angesehen und finde den Filter sehr gelungen.

Ich kann allerdings weder unter http://465.premiereline.de/ noch unter http://multishop.malercenter.de/ etwas im Shop bestellen, da im Warenkorb kein einziger Button mehr funktioniert.

Hab auch schon mehrere Browser ausprobiert und mir zu guter letzt noch die Datei 4.74 heruntergeladen und in einen blanken 4.7.4-Shop installiert - immer das gleiche Phänomen.

Tritt das sonst noch bei jemanden auf oder muss ich mir langsam mal Gedanken über einen neuen Laptop machen? :slight_smile:

Da sollte ja auch nichts bestellt werden! Aber da ist tatsächlich was falsch und das nicht erst seit heute. Sollte aber zu schaffen sein :wink: