Ähnliche Produkte


#21

Ich bin grad in unserem Shop auch über das Problem gestolpert das die Anzeige der Ähnlichen Artikel mal so gar keinen Sinn ergibt. Egal welchen Artikel man aufruft - es werden immer 2 immer gleiche Artikel in der Liste angezeigt.
Daher gehe ich mal davon aus das diese unsinnige Verhalten immer noch nicht geändert wurde und nach wie vor nicht der Inhalt sondern der Attribut-Name für den Vergleich herangezogen wird? :frowning:

Nun habe ich ein wenig mit den hier gezeigten Lösungsvorschlägen rumgespielt aber wie es aussieht funktioniert nichts mehr davon unter 4.10.3

Hat jemand das ganze mal als Modul gelöst oder hat für die 4.10er Version ein passendes Snippet um das ordentlich zum laufen zu bekommen? Das wäre super.


#22

Bekommt das jemand unter 4.9.9 lauffähig? Habe mich selbst mal daran versucht. Bin aber kläglich gescheitert :frowning:


#23

Du musst doch nur die o.g. Methoden (function …(){…}) ersetzen: /OXID_ESHOP_CE_4.9.9/application/models/oxarticle.php. Normalerweise macht man sowas in einem Modul.


#24

Vorab schon einmal. Der Code funktioniert auch unter Oxid 4.10.6.

Ich habe mal versucht das in ein Modul zu packen aber meine Unerfahrenheit lässt mich scheitern.

Es kommt folgende Meldung:

Es wurden ungültige Module erkannt.

Möchten Sie alle registrierten Modulinformationen und gespeicherten Konfigurationseinstellungen löschen?
Module-ID Problematische Dateien
mbm_article_attribut\models\getSimList

mbm_article_attribut\models\getSimList/metadata.php

Hier mal meine metadata.php

<?php
/**

 *
 * @category      module
 * @package
 * @author Mysticum.de
 * @link
 * @copyright (C) 2017
 */

/**
 * Metadata version
 */
$sMetadataVersion = '1.1';

/**
 * Module information
 */
$aModule = array(
'id'           => 'mbm_article_attribut',
'title'        => 'Ähnliche Produkte - Attribute',
'description'  => array(
	'de' => 'Attribute bei ähnlichen Produkten miteinbeziehen.<br>Basiert auf dem Tread: <a href="https://forum.oxid-esales.com/t/ahnliche-produkte/42708/17"</a>Ähnliche Produkte</br>',
	'en' => ''
),
'thumbnail'    => '',
'version'      => '1.0',
'author'       => 'Mysticum.de',
'email'        => '',
'url'          => '',
   'extend' => array(
    'oxarticle' => 'mbm_article_attribut\models\getAttribsString',
      'oxarticle' => 'mbm_article_attribut\models\generateSimListSearchStr',
       'oxarticle' => 'mbm_article_attribut\models\getSimList',
),

);

Und hier mal die php Datei

<?php
class attributesearch__getSimList($sAttribs, $iCnt) extends attributesearch__getSimList($sAttribs, $iCnt)_parent
{
 protected function _getSimList($sAttributeSql, $iCnt)

 {
 $myConfig = $this->getConfig();
 $oDb      = oxDb::getDb( oxDb::FETCH_MODE_ASSOC );
 $sArticleTable = $this->getViewName();
 $sObj2AttView = getViewName('oxobject2attribute');


 // #523A
 $iAttrPercent = $myConfig->getConfigParam( 'iAttributesPercent' )/100;
 // 70% same attributes
 if ( !$iAttrPercent || $iAttrPercent < 0 || $iAttrPercent > 1) {
  $iAttrPercent = 0.70;
 }
 // #1137V iAttributesPercent = 100 doesnt work
 $iHitMin = ceil( $iCnt * $iAttrPercent );

 // we do not use lists here as we don't need this overhead right now
 $aList= array();
 $sSelect =  "select oxobjectid, oxart.oxparentid, count(*) as cnt from {$sObj2AttView} as t1 LEFT JOIN {$sArticleTable} as oxart on (oxobjectid = oxart.oxid) where
             ( $sAttribs )
             and t1.oxobjectid != ".$oDb->quote( $this->oxarticles__oxid->value )."
             group by t1.oxobjectid having count(*) >= $iHitMin ";

 $rs = $oDb->selectLimit( $sSelect, 50, 0 );
 $parents = array();
 if ($rs != false && $rs->recordCount() > 0) {
  while (!$rs->EOF) {
   $oxparentid = $rs->fields['OXPARENTID'];
   $oxobjectid = $rs->fields['OXOBJECTID'];

   if($oxparentid && $parents[$oxparentid] || !strcmp($oxobjectid,$this->oxarticles__oxid->value) || !strcmp($oxparentid,$this->oxarticles__oxid->value)) {
    $rs->moveNext();
    continue;
   }
   if($oxparentid){
    $parents[$oxparentid] = 1;
   } else {
    $parents[$oxobjectid] = 1;
   }
  $oTemp = new stdClass();    // #663
  $oTemp->cnt = $rs->fields['cnt'];
  $oTemp->id  = $oxobjectid;
  $oTemp->parent = $oxparentid;
  $aList[] = $oTemp;
  $rs->moveNext();
  }
 }
 return $aList;
}
}

Wie überschreibe ich denn nun die Classe richtig?


#25

erstens müssen in den Pfaden \ durch / ersetzt werden
und zweitens kann eine Klasse pro Modul nur ein mal erweitert werden, also keine 3 mal.


#26

Nicht zu vergessen die Klasse:
class attributesearch__getSimList($sAttribs, $iCnt) extends attributesearch__getSimList($sAttribs, $iCnt)_parent

=>

class attributesearch__getSimList extends attributesearch__getSimList_parent

Puuh, ungeachtet dessen, ob es inhaltlich funktioniert, probiers mal so:
Dein Modul