Suche nach Hersteller

vielen dank für eure tolle arbeit!

und so funktioniert es bei mir in 4.5.0 und (hoffentlich) auch in mehrsprachig.
für die handwerklichen mängel bitte ich um nachsicht. ich bin absoluter oxid- und auch php-neuling.


<?php


class l_s_oxsearch extends l_s_oxsearch_parent {


    protected function _getSearchSelect( $sSearchParamForQuery = false, $sInitialSearchCat = false, $sInitialSearchVendor = false, $sInitialSearchManufacturer = false, $sSortBy = false)
    {
        $oDb = oxDb::getDb();

        // performance
        if ( $sInitialSearchCat ) {
            // lets search this category - is no such category - skip all other code
            $oCategory = oxNew( 'oxcategory' );
            $sCatTable = $oCategory->getViewName();

            $sQ  = "select 1 from $sCatTable where $sCatTable.oxid = ".$oDb->quote( $sInitialSearchCat )." ";
            $sQ .= "and ".$oCategory->getSqlActiveSnippet();
            if ( !$oDb->getOne( $sQ ) ) {
                return;
            }
        }

        // performance:
        if ( $sInitialSearchVendor ) {
            // lets search this vendor - if no such vendor - skip all other code
            $oVendor   = oxNew( 'oxvendor' );
            $sVndTable = $oVendor->getViewName();

            $sQ  = "select 1 from $sVndTable where $sVndTable.oxid = ".$oDb->quote( $sInitialSearchVendor )." ";
            $sQ .= "and ".$oVendor->getSqlActiveSnippet();
            if ( !$oDb->getOne( $sQ ) ) {
                return;
            }
        }

        // performance:
        if ( $sInitialSearchManufacturer ) {
            // lets search this Manufacturer - if no such Manufacturer - skip all other code
            $oManufacturer   = oxNew( 'oxmanufacturer' );
            $sManTable = $oManufacturer->getViewName();

            $sQ  = "select 1 from $sManTable where $sManTable.oxid = ".$oDb->quote( $sInitialSearchManufacturer )." ";
            $sQ .= "and ".$oManufacturer->getSqlActiveSnippet();
            if ( !$oDb->getOne( $sQ ) ) {
                return;
            }
        }

        $sWhere = null;

        if ( $sSearchParamForQuery ) {
            $sWhere = $this->_getWhere( $sSearchParamForQuery );
        } elseif ( !$sInitialSearchCat && !$sInitialSearchVendor && !$sInitialSearchManufacturer ) {
            //no search string
            return null;
        }

        $oArticle = oxNew( 'oxarticle' );
        $sArticleTable = $oArticle->getViewName();
        $sO2CView      = getViewName( 'oxobject2category' );

        $sSelectFields = $oArticle->getSelectFields();

        // longdesc field now is kept on different table
        $sDescJoin  = '';
        if ( is_array( $aSearchCols = $this->getConfig()->getConfigParam( 'aSearchCols' ) ) ) {
            if ( in_array( 'oxlongdesc', $aSearchCols ) || in_array( 'oxtags', $aSearchCols ) ) {
                $sDescView  = getViewName( 'oxartextends' , $this->_iLanguage  );
                $sDescJoin  = " LEFT JOIN {$sDescView} ON {$sArticleTable}.oxid={$sDescView}.oxid ";
            }
        }


        $sManView = getViewName('oxmanufacturers', $this->_iLanguage );
		
        //select articles
        $sSelect = "select {$sSelectFields}  from {$sArticleTable} {$sDescJoin} LEFT JOIN {$sManView} ON {$sArticleTable}.oxmanufacturerid={$sManView}.oxid where ";  

        // must be additional conditions in select if searching in category
        if ( $sInitialSearchCat ) {
            $sCatView = getViewName( 'oxcategories' , $this->_iLanguage );
            $sInitialSearchCatQuoted = $oDb->quote( $sInitialSearchCat );
            $sSelectCat  = "select oxid from {$sCatView} where oxid =  $sInitialSearchCatQuoted and (oxpricefrom != '0' or oxpriceto != 0)";
            if ( $oDb->getOne($sSelectCat) ) {
                $sSelect = "select {$sSelectFields} from {$sArticleTable} $sDescJoin " .
                           "where {$sArticleTable}.oxid in ( select {$sArticleTable}.oxid as id from {$sArticleTable}, {$sO2CView} as oxobject2category, {$sCatView} as oxcategories " .
                           "where (oxobject2category.oxcatnid=$sInitialSearchCatQuoted and oxobject2category.oxobjectid={$sArticleTable}.oxid) or (oxcategories.oxid=$sInitialSearchCatQuoted and {$sArticleTable}.oxprice >= oxcategories.oxpricefrom and
                            {$sArticleTable}.oxprice <= oxcategories.oxpriceto )) and ";
            } else {
                $sSelect = "select {$sSelectFields} from {$sO2CView} as
                            oxobject2category, {$sArticleTable} {$sDescJoin} where oxobject2category.oxcatnid=$sInitialSearchCatQuoted and
                            oxobject2category.oxobjectid={$sArticleTable}.oxid and ";
            }
        }

        $sSelect .= $oArticle->getSqlActiveSnippet();
        $sSelect .= " and {$sArticleTable}.oxparentid = '' and {$sArticleTable}.oxissearch = 1 ";

        if ( $sInitialSearchVendor ) {
            $sSelect .= " and {$sArticleTable}.oxvendorid = " . $oDb->quote( $sInitialSearchVendor ) . " ";
        }

        if ( $sInitialSearchManufacturer ) {
            $sSelect .= " and {$sArticleTable}.oxmanufacturerid = " . $oDb->quote( $sInitialSearchManufacturer ) . " ";
        }

        $sSelect .= $sWhere;

        if ( $sSortBy ) {
            $sSelect .= " order by {$sSortBy} ";
        }

        echo $sSelect; 
        return $sSelect;
    }
    
    
     protected function _getWhere( $sSearchString )
    {
        $oDb = oxDb::getDb();
        $myConfig = $this->getConfig();
        $blSep    = false;
        $sArticleTable = getViewName( 'oxarticles' , $this->_iLanguage );
        $sManView = getViewName( 'oxmanufacturers' , $this->_iLanguage );
		
        $aSearchCols = $myConfig->getConfigParam( 'aSearchCols' );
        if ( !(is_array( $aSearchCols ) && count( $aSearchCols ) ) ) {
            return '';
        }

        $oTempArticle = oxNew( 'oxarticle' );
        $sSearchSep   = $myConfig->getConfigParam( 'blSearchUseAND' )?'and ':'or ';
        $aSearch  = explode( ' ', $sSearchString );
        $sSearch  = ' and ( ';
        $myUtilsString = oxUtilsString::getInstance();
        $oLang = oxLang::getInstance();

        foreach ( $aSearch as $sSearchString ) {

            if ( !strlen( $sSearchString ) ) {
                continue;
            }

            if ( $blSep ) {
                $sSearch .= $sSearchSep;
            }

            $blSep2 = false;
            $sSearch  .= '( ';

            foreach ( $aSearchCols as $sField ) {

                if ( $blSep2 ) {
                    $sSearch  .= ' or ';
                }

                $sLanguage = '';
                if ( $this->_iLanguage && $oTempArticle->isMultilingualField( $sField ) ) {
                    $sLanguage = $oLang->getLanguageTag( $this->_iLanguage );
                }

                // as long description now is on different table table must differ
                if ( $sField == 'oxlongdesc' || $sField == 'oxtags' ) {
                    $sSearchField = getViewName( 'oxartextends', $this->_iLanguage ).".{$sField}";
                } else {
                    $sSearchField = "{$sArticleTable}.{$sField}";
                }

                $sSearch .= " {$sSearchField} like ".$oDb->quote( "%$sSearchString%" );

                // special chars ?
                if ( ( $sUml = $myUtilsString->prepareStrForSearch( $sSearchString ) ) ) {
                    $sSearch  .= " or {$sSearchField} like ".$oDb->quote( "%$sUml%" );
                }

                $blSep2 = true;
            }
            $sSearch .= " or {$sManView}.oxtitle like ".$oDb->quote( "%$sSearchString%" );
            $sSearch .= " or {$sManView}.oxshortdesc like ".$oDb->quote( "%$sSearchString%" );
            $sSearch  .= ' ) ';

            $blSep = true;
        }

        $sSearch .= ' ) ';
        return $sSearch;
    }

} 

ach ja: für produktive nutzung in zeile 114 das “echo” entfernen.

hallo zusammen

sorry, dass ich den alten thread wiederbelebe…

aber wie genau binde ich das in oxid ein?
weil diese oxsearch_parent klassen existieren ja gar nicht… da ich kaum ahnung von php und klassen/funktionen habe, wäre ich sehr dankbar um etwaige hinweise…

beste grüsse
daniel

weiter vorne im Thread steht die Anleitung: http://forum.oxid-esales.com/showthread.php?t=9230#post54671

Die Änderungen im Verlauf dieses Threads musst Du noch berücksichtigen, bzw. den Code hier von frankw verwenden (der in einer 4.5 funktionierte).

Tausend Dank an die tolle Community!
Die Suche klappt und ich habe sie noch mit dem Lieferant ergänzt, falls jemand dies auch braucht (konkret verwenden wir dies für einen Büchershop, wo Hersteller=Verlag und Lieferant=Autor ist).

Hier der vollständige Code:

<?php 


class chibula_searchmanufacturers_oxsearch extends chibula_searchmanufacturers_oxsearch_parent { 


    protected function _getSearchSelect( $sSearchParamForQuery = false, $sInitialSearchCat = false, $sInitialSearchVendor = false, $sInitialSearchManufacturer = false, $sSortBy = false) 
    { 
        $oDb = oxDb::getDb(); 

        // performance 
        if ( $sInitialSearchCat ) { 
            // lets search this category - is no such category - skip all other code 
            $oCategory = oxNew( 'oxcategory' ); 
            $sCatTable = $oCategory->getViewName(); 

            $sQ  = "select 1 from $sCatTable where $sCatTable.oxid = ".$oDb->quote( $sInitialSearchCat )." "; 
            $sQ .= "and ".$oCategory->getSqlActiveSnippet(); 
            if ( !$oDb->getOne( $sQ ) ) { 
                return; 
            } 
        } 

        // performance: 
        if ( $sInitialSearchVendor ) { 
            // lets search this vendor - if no such vendor - skip all other code 
            $oVendor   = oxNew( 'oxvendor' ); 
            $sVndTable = $oVendor->getViewName(); 

            $sQ  = "select 1 from $sVndTable where $sVndTable.oxid = ".$oDb->quote( $sInitialSearchVendor )." "; 
            $sQ .= "and ".$oVendor->getSqlActiveSnippet(); 
            if ( !$oDb->getOne( $sQ ) ) { 
                return; 
            } 
        } 

        // performance: 
        if ( $sInitialSearchManufacturer ) { 
            // lets search this Manufacturer - if no such Manufacturer - skip all other code 
            $oManufacturer   = oxNew( 'oxmanufacturer' ); 
            $sManTable = $oManufacturer->getViewName(); 

            $sQ  = "select 1 from $sManTable where $sManTable.oxid = ".$oDb->quote( $sInitialSearchManufacturer )." "; 
            $sQ .= "and ".$oManufacturer->getSqlActiveSnippet(); 
            if ( !$oDb->getOne( $sQ ) ) { 
                return; 
            } 
        } 

        $sWhere = null; 

        if ( $sSearchParamForQuery ) { 
            $sWhere = $this->_getWhere( $sSearchParamForQuery ); 
        } elseif ( !$sInitialSearchCat && !$sInitialSearchVendor && !$sInitialSearchManufacturer ) { 
            //no search string 
            return null; 
        } 

        $oArticle = oxNew( 'oxarticle' ); 
        $sArticleTable = $oArticle->getViewName(); 
        $sO2CView      = getViewName( 'oxobject2category' ); 

        $sSelectFields = $oArticle->getSelectFields(); 

        // longdesc field now is kept on different table 
        $sDescJoin  = ''; 
        if ( is_array( $aSearchCols = $this->getConfig()->getConfigParam( 'aSearchCols' ) ) ) { 
            if ( in_array( 'oxlongdesc', $aSearchCols ) || in_array( 'oxtags', $aSearchCols ) ) { 
                $sDescView  = getViewName( 'oxartextends' , $this->_iLanguage  ); 
                $sDescJoin  = " LEFT JOIN {$sDescView} ON {$sArticleTable}.oxid={$sDescView}.oxid "; 
            } 
        } 


        $sManView = getViewName('oxmanufacturers', $this->_iLanguage );
        $sVenView = getViewName('oxvendor', $this->_iLanguage );  
         
        //select articles 
        $sSelect = "select {$sSelectFields}  from {$sArticleTable} {$sDescJoin} LEFT JOIN {$sManView} ON {$sArticleTable}.oxmanufacturerid={$sManView}.oxid LEFT JOIN {$sVenView} ON {$sArticleTable}.oxvendorid={$sVenView}.oxid where ";   

        // must be additional conditions in select if searching in category 
        if ( $sInitialSearchCat ) { 
            $sCatView = getViewName( 'oxcategories' , $this->_iLanguage ); 
            $sInitialSearchCatQuoted = $oDb->quote( $sInitialSearchCat ); 
            $sSelectCat  = "select oxid from {$sCatView} where oxid =  $sInitialSearchCatQuoted and (oxpricefrom != '0' or oxpriceto != 0)"; 
            if ( $oDb->getOne($sSelectCat) ) { 
                $sSelect = "select {$sSelectFields} from {$sArticleTable} $sDescJoin " . 
                           "where {$sArticleTable}.oxid in ( select {$sArticleTable}.oxid as id from {$sArticleTable}, {$sO2CView} as oxobject2category, {$sCatView} as oxcategories " . 
                           "where (oxobject2category.oxcatnid=$sInitialSearchCatQuoted and oxobject2category.oxobjectid={$sArticleTable}.oxid) or (oxcategories.oxid=$sInitialSearchCatQuoted and {$sArticleTable}.oxprice >= oxcategories.oxpricefrom and 
                            {$sArticleTable}.oxprice <= oxcategories.oxpriceto )) and "; 
            } else { 
                $sSelect = "select {$sSelectFields} from {$sO2CView} as 
                            oxobject2category, {$sArticleTable} {$sDescJoin} where oxobject2category.oxcatnid=$sInitialSearchCatQuoted and 
                            oxobject2category.oxobjectid={$sArticleTable}.oxid and "; 
            } 
        } 

        $sSelect .= $oArticle->getSqlActiveSnippet(); 
        $sSelect .= " and {$sArticleTable}.oxparentid = '' and {$sArticleTable}.oxissearch = 1 "; 

        if ( $sInitialSearchVendor ) { 
            $sSelect .= " and {$sArticleTable}.oxvendorid = " . $oDb->quote( $sInitialSearchVendor ) . " "; 
        } 

        if ( $sInitialSearchManufacturer ) { 
            $sSelect .= " and {$sArticleTable}.oxmanufacturerid = " . $oDb->quote( $sInitialSearchManufacturer ) . " "; 
        } 

        $sSelect .= $sWhere; 

        if ( $sSortBy ) { 
            $sSelect .= " order by {$sSortBy} "; 
        } 

        //echo $sSelect;  
        return $sSelect; 
    } 
     
     
     protected function _getWhere( $sSearchString ) 
    { 
        $oDb = oxDb::getDb(); 
        $myConfig = $this->getConfig(); 
        $blSep    = false; 
        $sArticleTable = getViewName( 'oxarticles' , $this->_iLanguage ); 
        $sManView = getViewName( 'oxmanufacturers' , $this->_iLanguage );
        $sVenView = getViewName( 'oxvendor' , $this->_iLanguage ); 
         
        $aSearchCols = $myConfig->getConfigParam( 'aSearchCols' ); 
        if ( !(is_array( $aSearchCols ) && count( $aSearchCols ) ) ) { 
            return ''; 
        } 

        $oTempArticle = oxNew( 'oxarticle' ); 
        $sSearchSep   = $myConfig->getConfigParam( 'blSearchUseAND' )?'and ':'or '; 
        $aSearch  = explode( ' ', $sSearchString ); 
        $sSearch  = ' and ( '; 
        $myUtilsString = oxUtilsString::getInstance(); 
        $oLang = oxLang::getInstance(); 

        foreach ( $aSearch as $sSearchString ) { 

            if ( !strlen( $sSearchString ) ) { 
                continue; 
            } 

            if ( $blSep ) { 
                $sSearch .= $sSearchSep; 
            } 

            $blSep2 = false; 
            $sSearch  .= '( '; 

            foreach ( $aSearchCols as $sField ) { 

                if ( $blSep2 ) { 
                    $sSearch  .= ' or '; 
                } 

                $sLanguage = ''; 
                if ( $this->_iLanguage && $oTempArticle->isMultilingualField( $sField ) ) { 
                    $sLanguage = $oLang->getLanguageTag( $this->_iLanguage ); 
                } 

                // as long description now is on different table table must differ 
                if ( $sField == 'oxlongdesc' || $sField == 'oxtags' ) { 
                    $sSearchField = getViewName( 'oxartextends', $this->_iLanguage ).".{$sField}"; 
                } else { 
                    $sSearchField = "{$sArticleTable}.{$sField}"; 
                } 

                $sSearch .= " {$sSearchField} like ".$oDb->quote( "%$sSearchString%" ); 

                // special chars ? 
                if ( ( $sUml = $myUtilsString->prepareStrForSearch( $sSearchString ) ) ) { 
                    $sSearch  .= " or {$sSearchField} like ".$oDb->quote( "%$sUml%" ); 
                } 

                $blSep2 = true; 
            } 
            $sSearch .= " or {$sManView}.oxtitle like ".$oDb->quote( "%$sSearchString%" ); 
            $sSearch .= " or {$sManView}.oxshortdesc like ".$oDb->quote( "%$sSearchString%" );
            $sSearch .= " or {$sVenView}.oxtitle like ".$oDb->quote( "%$sSearchString%" ); 
            $sSearch .= " or {$sVenView}.oxshortdesc like ".$oDb->quote( "%$sSearchString%" );
            $sSearch  .= ' ) '; 

            $blSep = true; 
        } 

        $sSearch .= ' ) '; 
        return $sSearch; 
    } 

}
?>

Hallo,

da Code vergleichen immer so mühsam ist, wenn man aus dem Forum kopiert, haben wir für das Modul ein Projekt auf Github angelegt und die letzten Änderungen einfließen lassen. Ich hoffe das ist für alle Beteiligten ok?!

Also daher: Alle Status siet der ersten Version finden sich hier: https://github.com/marmaladeDE/marmSearchManufacturer/

Gruß Joscha

Wie binde ich diese Suche in das Template ein?

Sorry für die Frage, aber ich kenne mich noch nicht so mit Oxid aus:rolleyes:

[QUOTE=Katana;112874]Wie binde ich diese Suche in das Template ein?

Sorry für die Frage, aber ich kenne mich noch nicht so mit Oxid aus:rolleyes:[/QUOTE]

Je häufiger ich solche Fragen lese, desto bestärkter fühle ich mich, die Fortsetzung des OXID Buchs zu schreiben. :wink:

Das Modul hat kein Template dabei. Du brauchst also da gar nichts machen. Einfach das Modul installieren und fertig. Eine Templateänderung ist dafür nicht notwenig.

Gruß Joscha

Aber der Kunde muss doch die Möglichkeit haben den Hersteller auszuwählen sowie bei den Bild hier.
Oder habe ich da jetzt was falsch verstanden?

Ja, hast du. Was du willst ist eine Filterung. Das Modul, dass du hier hast, macht, dass nicht nur in den Feldern des Artikels gesucht wird, sondern auch im Herstellername. So kann man in der Suche einen Herstellername eintippen und findet die zugeordneten Produkte (was im Standard so nicht geht).

Gruß Joscha

Oh dann hatte ich das falsch gedeutet gehabt :wink:

Gruß Kay

Hallo zusamen,

ich habe das Modul eben mal fit gemacht für die Version 4.7, die Readme-Datei ergänzt und noch einen kleinen Bugfix eingefügt. Das ganze findet sich wie gehabt auf GitHub.

Gruß Joscha

Hallo Joscha,
Habe das Modul ausprobieren wollen, läuft aber nicht.
Ist das Modul für 4.6 auch geeignet?