[CON-321] Standard-Suchmodul und UTF-8

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von OliverL » Di 30. Mär 2010, 16:06

Moin moin,

1. Mit "... $_GET['searchterm'] ..." hat das nix zutun, da es nur das Suchwort ist. Und wenn einträge kommen ist der Suchterm sichtig.
2. Text aus Word über das mittlere Einfügen im TinyMCE (das Symbol mit dem T). Ist dann formatierungsloser Text.

ich würde mal in den Zeile 252, 253 und 254 rumspielen.
d.h.

Code: Alles auswählen

<?php
    /**
    * $RCSfile$
    *
    * Description: Search output box
    *
    * @version 1.0.1
    * @author Willi Man
    * @copyright four for business AG <www.4fb.de>
    *
    * {@internal
    * created 2004-05-04
    * modified 2005-07-12 Andreas Lindner
    * modified 2008-04-11 Rudi Bieller
    * modified 2008-05-06 Rudi Bieller Added CON_SEARCH_MAXLEN_TEASERTEXT; Fixed <nobr> to be xhtml compliant;
    *                       Removed $action, $sCatName = getCategoryName($cat_id, $db); which was not used at all and
    *                       added a default output in case article/module was called directly (strlen(trim($searchterm)) == 0)
    * }}
    *
    * $Id$
    */

    #System properties in use:
    #Type: searchrange, Name: include
    #Contains comma-separated list of cats to be included into search (sub-cats are included automatically)

    #Logical combination of search terms with AND or OR

    define('CON_SEARCH_ITEMSPERPAGE', 10);
    define('CON_SEARCH_MAXLEN_TEASERTEXT', 200);

    #Includes
    cInclude('classes', 'class.search.php');
    cInclude('classes', 'class.artspec.php');
    cInclude('classes', 'class.template.php');
    cInclude('includes', 'functions.api.string.php');
    cInclude('classes', 'class.article.php');

    #Initiliaze template object
    if (!is_object($tpl)) {
        $tpl = new Template;
    }
    $tpl->reset();

    #Settings
    $oArticleProp = new Article_Property($db, $cfg);
    $iArtspecReference = 2;

    $cApiClient = new cApiClient($client);
    $sSearchRange = $cApiClient->getProperty('searchrange', 'include');
    $aSearchRange = explode(',', $sSearchRange);

    #Multilingual settings
    $sYourSearchFor = mi18n("Ihre Suche nach");
    $sMore = mi18n("mehr");

    #Get search term and pre-process it
    if (isset ($_GET['searchterm'])) {
        $searchterm = urldecode(htmlentities(strip_tags(stripslashes($_GET['searchterm']))));
    }
    elseif (isset ($_POST['searchterm'])) {
        $searchterm = urldecode(htmlentities(strip_tags(stripslashes($_POST['searchterm']))));
    }
    $searchterm = str_replace(' + ', ' AND ', $searchterm);
    $searchterm = str_replace(' - ', ' NOT ', $searchterm);
    $searchterm_display = $searchterm;

    #Get all article specs
    $sql = "SELECT
            idartspec, artspec
        FROM
            ".$cfg['tab']['art_spec']."
        WHERE
            client=$client AND
            lang=$lang AND
            online=1";

    $db->query($sql);
    $rows = $db->num_rows();
    $aArtspecOnline = array ();
    $aArtSpecs = array ();
    $c = 1;
    $d = 1;
    $e = 1;
    while ($db->next_record()) {
        $aArtSpecs[] = $db->f('idartspec');
    }
    $aArtSpecs[] = 0;

    if (strlen(trim($searchterm)) > 0) {
        #Fix for PHP < 4.3
        if( !function_exists( 'html_entity_decode' ) )
        {
            function html_entity_decode( $given_html, $quote_style = ENT_QUOTES )
            {
                $trans_table = array_flip(get_html_translation_table( HTML_SPECIALCHARS, $quote_style ));
                $trans_table['''] = "'";
                return ( strtr( $given_html, $trans_table ) );
            }
        }

        #Parse search term and set search options
        $searchterm = html_entity_decode($searchterm);

        if (stristr($searchterm, ' or ') === FALSE) {
            $combine = 'and';
        } else {
            $combine = 'or';
        }
        $searchterm = str_replace(' and ', ' ', strtolower($searchterm));
        $searchterm = str_replace(' or ', ' ', strtolower($searchterm));

            $options = array ('db' => 'regexp', // use db function regexp
            'combine' => $combine, // combine searchterms with and
            'exclude' => false, // => searchrange specified in 'cat_tree', 'categories' and 'articles' is excluded, otherwise included (exclusive)
            'cat_tree' => $aSearchRange, // searchrange
            'artspecs' => $aArtSpecs, // array of article specifications => search only articles with these artspecs
        'protected' => true); // => do not search articles or articles in categories which are offline or protected

        $search = new Search($options);

        $cms_options = array ("head", "html", "htmlhead", "htmltext", "text"); // search only in these cms-types
        $search->setCmsOptions($cms_options);

        #Execute search
        $aSearchResults = $search->searchIndex($searchterm, '');

        #Build results page
        if (count($aSearchResults) > 0) {
            $tpl->set('s', 'result_page', mi18n("Ergebnis-Seite").':');

            #Build meessage
            $message = $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm_display))."' ".mi18n("hat $$$ Treffer ergeben").":";
            $message = str_replace('$$$', count($aSearchResults), $message);
            $tpl->set('s', 'MESSAGE', $message);

            #Number of results per page
            $number_of_results = CON_SEARCH_ITEMSPERPAGE;
            $oSearchResults = new SearchResult($aSearchResults, $number_of_results);

            $num_res = $oSearchResults->getNumberOfResults() + $pdf_count;
            $num_pages = $oSearchResults->getNumberOfPages();
            $oSearchResults->setReplacement('<strong>', '</strong>'); // html-tags to emphasize the located searchterms

            #Get current result page
            if (isset ($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) {
                $page = $_GET['page'];
                $res_page = $oSearchResults->getSearchResultPage($page);
            } else {
                $page = 1;
                $res_page = $oSearchResults->getSearchResultPage($page);
            }

            #Build links to other result pages
            for ($i = 1; $i <= $num_pages; $i ++) {
                // this is just for sample client - modify to your needs!
                if ($cfg['url_builder']['name'] == 'front_content') {
                    $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($i.$sArtSpecs));
                } else {
                    $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($i.$sArtSpecs)),
                                    'idcat' => $idcat, // needed to build category path
                                    'lang' => $lang, // needed to build category path
                                    'level' => 1); // needed to build category path
                }
                try {
                    $nextlink = Contenido_Url::getInstance()->build($aParams);
                } catch (InvalidArgumentException $e) {
                    $nextlink = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm_display.'&page='.$i.$sArtSpecs);
                }
                if ($i == $page) {
                    $nextlinks .= '<span style="white-space:nowrap;">&nbsp;<strong>'.$i.'</strong>&nbsp;</span>';
                } else {
                    $nextlinks .= '<span style="white-space:nowrap;">&nbsp;<a href="'.$nextlink.'" title="'.$i.'. '.mi18n("Ergebnisseite anzeigen").'">'.$i.'</a>&nbsp;</span>';
                }
            }
            $tpl->set('s', 'PAGES', $nextlinks);

            #Build link to next result page
            if ($page < $num_pages) {
                $n = $page +1;
                // this is just for sample client - modify to your needs!
                if ($cfg['url_builder']['name'] == 'front_content') {
                    $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($n.$sArtSpecs));
                } else {
                    $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($n.$sArtSpecs)),
                                    'idcat' => $idcat, // needed to build category path
                                    'lang' => $lang, // needed to build category path
                                    'level' => 1); // needed to build category path
                }
                try {
                    $next = Contenido_Url::getInstance()->build($aParams);
                } catch (InvalidArgumentException $e) {
                    $next = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$n.$sArtSpecs);
                }
                $nextpage .= '&nbsp;<a href="'.$next.'" title="'.mi18n("n&auml;chste Ergebnisseite anzeigen").'">'.mi18n("vor").'&nbsp;&nbsp;<img src="images/link_pfeil_klein.gif" alt="" /></a>';
                $tpl->set('s', 'NEXT', $nextpage);
            } else {
                $tpl->set('s', 'NEXT', '');
            }

            #Build link to previous result page
            if ($page > 1) {
                $p = $page -1;
                // this is just for sample client - modify to your needs!
                if ($cfg['url_builder']['name'] == 'front_content') {
                    $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($p.$sArtSpecs));
                } else {
                    $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($p.$sArtSpecs)),
                                    'idcat' => $idcat, // needed to build category path
                                    'lang' => $lang, // needed to build category path
                                    'level' => 1); // needed to build category path
                }
                try {
                    $pre = Contenido_Url::getInstance()->build($aParams);
                } catch (InvalidArgumentException $e) {
                    $pre = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$p.$sArtSpecs);
                }
                $prevpage .= '<a href="'.$pre.'" title="'.mi18n("vorherige Ergebnisseite anzeigen").'"><img src="images/link_pfeil_klein_links.gif" alt="" />&nbsp;&nbsp;'.mi18n("zur&uuml;ck").'</a>&nbsp;';
                $tpl->set('s', 'PREV', $prevpage);
            } else {
                $tpl->set('s', 'PREV', '');
            }

            if (count($res_page) > 0) {
                $i = 1;
                #Build single search result on result page
                foreach ($res_page as $key => $val) {
                    $num = $i + (($page -1) * $number_of_results);
                    $oArt = new Article($key, $client, $lang);
                    #Get publishing date of article
                    $pub_system = $oArt->getField('published');
                    $pub_user = trim(strip_tags($oArt->getContent('HEAD', 90)));
                    if ($pub_user != '') {
                        $show_pub_date = "[".$pub_user."]";
                    } else {
                        $show_pub_date = '';
                        if ($pub_system[8] != '0') {
                            $show_pub_date .= $pub_system[8];
                        }
                        $show_pub_date .= $pub_system[9].'.';
                        if ($pub_system[5] != '0') {
                            $show_pub_date .= $pub_system[5];
                        }
                        $show_pub_date .= $pub_system[6].".".$pub_system[0].$pub_system[1].$pub_system[2].$pub_system[3]."]";
                        $show_pub_date = "[".$show_pub_date;
                    }
               
                    #Get text and headline of current article
                    $iCurrentArtSpec = $oArticleProp->getArticleSpecification($key, $lang);
                    $aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
                    $aSubheadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 2);
                    
					$text = $oSearchResults->getSearchContent($key, 'HTML', 1);
					echo "<hr>Line 0<br>".($text[0])."<hr>";
					echo "<hr>Line 1<br>".htmlentities($text[0])."<hr>";
                    $text = capiStrTrimAfterWord($text[0], CON_SEARCH_MAXLEN_TEASERTEXT);
					echo "<hr>Line 2<br>".htmlentities($text)."<hr>";

                    $headline = capiStrTrimAfterWord($aHeadline[0], CON_SEARCH_MAXLEN_TEASERTEXT); # conflict with capiStrTrimAfterWord and setReplacement('<strong>', '</strong>')
					
                    $subheadline = capiStrTrimAfterWord($aSubheadline[0], CON_SEARCH_MAXLEN_TEASERTEXT);
                   
                    $cat_id = $oSearchResults->getArtCat($key);
                    $similarity = $oSearchResults->getSimilarity($key);

                    $similarity = sprintf("%.0f", $similarity);

                    #Send output to template
                    // this is just for sample client - modify to your needs!
                    if ($cfg['url_builder']['name'] == 'front_content') {
                        $aParams = array('lang' => $lang, 'idcat' => $cat_id, 'idart' => $key);
                    } else {
                        $aParams = array('search' => array('lang' => $lang, 'idcat' => $cat_id, 'idart' => $key),
                                        'idcat' => $idcat, // needed to build category path
                                        'lang' => $lang, // needed to build category path
                                        'level' => 1); // needed to build category path
                    }
                    try {
                        $href = Contenido_Url::getInstance()->build($aParams);
                    } catch (InvalidArgumentException $e) {
                        $href = $sess->url("front_content.php?idcat=$cat_id&idart=$key");
                    }
                    $tpl->set('d', 'more', $sMore);
                    $tpl->set('d', 'HREF', $href);
                    $tpl->set('d', 'TITLE', mi18n("Link zu Suchergebnis").' '.$i);
                    $tpl->set('d', 'NUM', $num);
                    $tpl->set('d', 'CATNAME', $headline);
                    $tpl->set('d', 'HEADLINE', $text);
                    $tpl->set('d', 'SUBHEADLINE', $subheadline);
                    $tpl->set('d', 'SIMILARITY', $similarity);
                    $tpl->set('d', 'TARGET', '_self');
                    $tpl->set('d', 'PUB_DATE', $show_pub_date);
                    $tpl->next();
                    $i ++;

                }
                $tpl->generate('templates/search_output.html');
            }
        } else {
            #No results
            $tpl->set('s', 'MESSAGE', $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm))."' ".mi18n("hat leider keine Treffer ergeben").".");
            $tpl->set('s', 'NEXT', '');
            $tpl->set('s', 'PREV', '');
            $tpl->set('s', 'PAGES', '');
            $tpl->set('s', 'result_page', '');
            $tpl->generate('templates/search_output.html');
        }

    } else {
        echo '<div id="searchResults">';
        echo '<h1>'.mi18n("Keine Suchergebnisse - Bitte suchen Sie &uuml;ber das Sucheingabefeld!").'</h1>';
        echo '</div>';
    }

    class Article_Property {
        var $globalConfig;
        var $oDBInstance;

        /**
         * Constructor
         * Hint: Call constructor with Article_Property($db, $cfg);
         * @param  oDBInstance instance of class DB_Contenido
         * @param  globalConfig
         */
        function Article_Property($oDBInstance, $globalConfig) {
            $this->globalConfig = $globalConfig;
            $this->oDBInstance = $oDBInstance;
        }

        /**
         * Get specification of an article
         *
         * @param   $iArticleId
         * @return  id of article specification
         */
        function getArticleSpecification($iArticleId, $iLangId) {

            $sqlString = "   
                        SELECT
                            artspec
                        FROM
                            ".$this->globalConfig['tab']['art_lang']."
                        WHERE
                            idart = '".$iArticleId."' AND
                            idlang = '".$iLangId."'
                        ";

            #echo "<pre>$sqlString</pre>";
            $this->oDBInstance->query($sqlString);

            if ($this->oDBInstance->next_record()) {
                return $this->oDBInstance->f('artspec');
            } else {
                return false;
            }
        }
    }
    ?> 
die Ausgabe wird um 4 Ausgaben pro Treffererweitert.
Line 0 = $text ohne irgendwas
Line 1 = htmlentities($text)
Line 2 = htmlentities($text) nach dem kürzen

wenn Line 1 = Line 2 gleich sind hat es nix mit capiStrTrimAfterWord() zutun.


Ansonsten ist einfach mal einen Link posten ;)

mfg Oli

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Halchteranerin » Di 30. Mär 2010, 22:54

Hallo Oliver,
OliverL hat geschrieben:wenn Line 1 = Line 3 und Line 2 = Line 4 gleich sind
und wenn sie nicht gleich sind? :D
Line 0
Array
Line 1, 2 und 4 sind leer, allein line 3 enthält Text. "kaputten" Text wohlgemerkt.

Ach ja, in dem Zusammenhang ist mir aufgefallen, dass ich nach den Wörtern, die Sonderzeichen beinhalten, gar nicht suchen kann, also suchen natürlich schon, es gibt nur immer keine Treffer. :? Und ich glaube, ich hatte auf der vorigen Seite geschrieben, dass die Probleme nur im Textauszug sind, gerade fiel mir aber auf, dass die Überschriften auch nicht ok sind, wenn sie Sonderzeichen enthalten. Im errorlog steht:
[30-Mar-2010 17:51:35] PHP Warning: htmlspecialchars() expects parameter 1 to be string, array given in /home/laptemat/public_html/cms/front_content.php(982) : eval()'d code on line 665
[30-Mar-2010 17:51:35] PHP Warning: htmlspecialchars() expects parameter 1 to be string, array given in /home/laptemat/public_html/cms/front_content.php(982) : eval()'d code on line 666
[30-Mar-2010 17:51:35] PHP Warning: htmlspecialchars() [<a href='function.htmlspecialchars'>function.htmlspecialchars</a>]: Invalid multibyte sequence in argument in /home/laptemat/public_html/cms/front_content.php(982) : eval()'d code on line 669
Hängt das mit deiner Änderung zusammen? Denn ich meine, ich hatte schon mal irgendwelche Einträge mit htmlspecialchars, aber sicher bin ich mir nicht. :oops:

Na ja, Link wolltest du, Link kriegst du. :D Die URL ist laptematern.ro, und wenn du nach breastcrawl suchst, findest du auch gleich alle Fehler auf einmal. :D Danke schon mal fürs Draufschauen ... Ich habe das von dir geänderte Modul Momentan drin gelassen.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

DerFrank
Beiträge: 72
Registriert: Do 17. Dez 2009, 12:37
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von DerFrank » Mi 31. Mär 2010, 07:28

Meta Description ist ja auch kaputt?! Sagtest Du nicht, dass das OK ist?
aitsu open source cms framework für contenido bei googlecode...

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Dodger77 » Mi 31. Mär 2010, 08:36

Da in Olivers Modul ein paar Ausgaben nicht ganz passen (da wird das Array $text und nicht $text[0] angezeigt), anbei die bearbeitete Version:

Code: Alles auswählen

    <?php
        /**
        * $RCSfile$
        *
        * Description: Search output box
        *
        * @version 1.0.1
        * @author Willi Man
        * @copyright four for business AG <www.4fb.de>
        *
        * {@internal
        * created 2004-05-04
        * modified 2005-07-12 Andreas Lindner
        * modified 2008-04-11 Rudi Bieller
        * modified 2008-05-06 Rudi Bieller Added CON_SEARCH_MAXLEN_TEASERTEXT; Fixed <nobr> to be xhtml compliant;
        *                       Removed $action, $sCatName = getCategoryName($cat_id, $db); which was not used at all and
        *                       added a default output in case article/module was called directly (strlen(trim($searchterm)) == 0)
        * }}
        *
        * $Id$
        */

        #System properties in use:
        #Type: searchrange, Name: include
        #Contains comma-separated list of cats to be included into search (sub-cats are included automatically)

        #Logical combination of search terms with AND or OR

        define('CON_SEARCH_ITEMSPERPAGE', 10);
        define('CON_SEARCH_MAXLEN_TEASERTEXT', 200);

        #Includes
        cInclude('classes', 'class.search.php');
        cInclude('classes', 'class.artspec.php');
        cInclude('classes', 'class.template.php');
        cInclude('includes', 'functions.api.string.php');
        cInclude('classes', 'class.article.php');

        #Initiliaze template object
        if (!is_object($tpl)) {
            $tpl = new Template;
        }
        $tpl->reset();

        #Settings
        $oArticleProp = new Article_Property($db, $cfg);
        $iArtspecReference = 2;

        $cApiClient = new cApiClient($client);
        $sSearchRange = $cApiClient->getProperty('searchrange', 'include');
        $aSearchRange = explode(',', $sSearchRange);

        #Multilingual settings
        $sYourSearchFor = mi18n("Ihre Suche nach");
        $sMore = mi18n("mehr");

        #Get search term and pre-process it
        if (isset ($_GET['searchterm'])) {
            $searchterm = urldecode(htmlentities(strip_tags(stripslashes($_GET['searchterm']))));
        }
        elseif (isset ($_POST['searchterm'])) {
            $searchterm = urldecode(htmlentities(strip_tags(stripslashes($_POST['searchterm']))));
        }
        $searchterm = str_replace(' + ', ' AND ', $searchterm);
        $searchterm = str_replace(' - ', ' NOT ', $searchterm);
        $searchterm_display = $searchterm;

        #Get all article specs
        $sql = "SELECT
                idartspec, artspec
            FROM
                ".$cfg['tab']['art_spec']."
            WHERE
                client=$client AND
                lang=$lang AND
                online=1";

        $db->query($sql);
        $rows = $db->num_rows();
        $aArtspecOnline = array ();
        $aArtSpecs = array ();
        $c = 1;
        $d = 1;
        $e = 1;
        while ($db->next_record()) {
            $aArtSpecs[] = $db->f('idartspec');
        }
        $aArtSpecs[] = 0;

        if (strlen(trim($searchterm)) > 0) {
            #Fix for PHP < 4.3
            if( !function_exists( 'html_entity_decode' ) )
            {
                function html_entity_decode( $given_html, $quote_style = ENT_QUOTES )
                {
                    $trans_table = array_flip(get_html_translation_table( HTML_SPECIALCHARS, $quote_style ));
                    $trans_table['''] = "'";
                    return ( strtr( $given_html, $trans_table ) );
                }
            }

            #Parse search term and set search options
            $searchterm = html_entity_decode($searchterm);

            if (stristr($searchterm, ' or ') === FALSE) {
                $combine = 'and';
            } else {
                $combine = 'or';
            }
            $searchterm = str_replace(' and ', ' ', strtolower($searchterm));
            $searchterm = str_replace(' or ', ' ', strtolower($searchterm));

                $options = array ('db' => 'regexp', // use db function regexp
                'combine' => $combine, // combine searchterms with and
                'exclude' => false, // => searchrange specified in 'cat_tree', 'categories' and 'articles' is excluded, otherwise included (exclusive)
                'cat_tree' => $aSearchRange, // searchrange
                'artspecs' => $aArtSpecs, // array of article specifications => search only articles with these artspecs
            'protected' => true); // => do not search articles or articles in categories which are offline or protected

            $search = new Search($options);

            $cms_options = array ("head", "html", "htmlhead", "htmltext", "text"); // search only in these cms-types
            $search->setCmsOptions($cms_options);

            #Execute search
            $aSearchResults = $search->searchIndex($searchterm, '');

            #Build results page
            if (count($aSearchResults) > 0) {
                $tpl->set('s', 'result_page', mi18n("Ergebnis-Seite").':');

                #Build meessage
                $message = $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm_display))."' ".mi18n("hat $$$ Treffer ergeben").":";
                $message = str_replace('$$$', count($aSearchResults), $message);
                $tpl->set('s', 'MESSAGE', $message);

                #Number of results per page
                $number_of_results = CON_SEARCH_ITEMSPERPAGE;
                $oSearchResults = new SearchResult($aSearchResults, $number_of_results);

                $num_res = $oSearchResults->getNumberOfResults() + $pdf_count;
                $num_pages = $oSearchResults->getNumberOfPages();
                $oSearchResults->setReplacement('<strong>', '</strong>'); // html-tags to emphasize the located searchterms

                #Get current result page
                if (isset ($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) {
                    $page = $_GET['page'];
                    $res_page = $oSearchResults->getSearchResultPage($page);
                } else {
                    $page = 1;
                    $res_page = $oSearchResults->getSearchResultPage($page);
                }

                #Build links to other result pages
                for ($i = 1; $i <= $num_pages; $i ++) {
                    // this is just for sample client - modify to your needs!
                    if ($cfg['url_builder']['name'] == 'front_content') {
                        $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($i.$sArtSpecs));
                    } else {
                        $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($i.$sArtSpecs)),
                                        'idcat' => $idcat, // needed to build category path
                                        'lang' => $lang, // needed to build category path
                                        'level' => 1); // needed to build category path
                    }
                    try {
                        $nextlink = Contenido_Url::getInstance()->build($aParams);
                    } catch (InvalidArgumentException $e) {
                        $nextlink = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm_display.'&page='.$i.$sArtSpecs);
                    }
                    if ($i == $page) {
                        $nextlinks .= '<span style="white-space:nowrap;">&nbsp;<strong>'.$i.'</strong>&nbsp;</span>';
                    } else {
                        $nextlinks .= '<span style="white-space:nowrap;">&nbsp;<a href="'.$nextlink.'" title="'.$i.'. '.mi18n("Ergebnisseite anzeigen").'">'.$i.'</a>&nbsp;</span>';
                    }
                }
                $tpl->set('s', 'PAGES', $nextlinks);

                #Build link to next result page
                if ($page < $num_pages) {
                    $n = $page +1;
                    // this is just for sample client - modify to your needs!
                    if ($cfg['url_builder']['name'] == 'front_content') {
                        $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($n.$sArtSpecs));
                    } else {
                        $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($n.$sArtSpecs)),
                                        'idcat' => $idcat, // needed to build category path
                                        'lang' => $lang, // needed to build category path
                                        'level' => 1); // needed to build category path
                    }
                    try {
                        $next = Contenido_Url::getInstance()->build($aParams);
                    } catch (InvalidArgumentException $e) {
                        $next = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$n.$sArtSpecs);
                    }
                    $nextpage .= '&nbsp;<a href="'.$next.'" title="'.mi18n("n&auml;chste Ergebnisseite anzeigen").'">'.mi18n("vor").'&nbsp;&nbsp;<img src="images/link_pfeil_klein.gif" alt="" /></a>';
                    $tpl->set('s', 'NEXT', $nextpage);
                } else {
                    $tpl->set('s', 'NEXT', '');
                }

                #Build link to previous result page
                if ($page > 1) {
                    $p = $page -1;
                    // this is just for sample client - modify to your needs!
                    if ($cfg['url_builder']['name'] == 'front_content') {
                        $aParams = array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($p.$sArtSpecs));
                    } else {
                        $aParams = array('search' => array('lang' => $lang, 'idcat' => $idcat, 'idart' => $idart, 'searchterm' => $searchterm_display, 'page' => ($p.$sArtSpecs)),
                                        'idcat' => $idcat, // needed to build category path
                                        'lang' => $lang, // needed to build category path
                                        'level' => 1); // needed to build category path
                    }
                    try {
                        $pre = Contenido_Url::getInstance()->build($aParams);
                    } catch (InvalidArgumentException $e) {
                        $pre = $sess->url('front_content.php?idcat='.$idcat.'&idart='.$idart.'&searchterm='.$searchterm.'&page='.$p.$sArtSpecs);
                    }
                    $prevpage .= '<a href="'.$pre.'" title="'.mi18n("vorherige Ergebnisseite anzeigen").'"><img src="images/link_pfeil_klein_links.gif" alt="" />&nbsp;&nbsp;'.mi18n("zur&uuml;ck").'</a>&nbsp;';
                    $tpl->set('s', 'PREV', $prevpage);
                } else {
                    $tpl->set('s', 'PREV', '');
                }

                if (count($res_page) > 0) {
                    $i = 1;
                    #Build single search result on result page
                    foreach ($res_page as $key => $val) {
                        $num = $i + (($page -1) * $number_of_results);
                        $oArt = new Article($key, $client, $lang);
                        #Get publishing date of article
                        $pub_system = $oArt->getField('published');
                        $pub_user = trim(strip_tags($oArt->getContent('HEAD', 90)));
                        if ($pub_user != '') {
                            $show_pub_date = "[".$pub_user."]";
                        } else {
                            $show_pub_date = '';
                            if ($pub_system[8] != '0') {
                                $show_pub_date .= $pub_system[8];
                            }
                            $show_pub_date .= $pub_system[9].'.';
                            if ($pub_system[5] != '0') {
                                $show_pub_date .= $pub_system[5];
                            }
                            $show_pub_date .= $pub_system[6].".".$pub_system[0].$pub_system[1].$pub_system[2].$pub_system[3]."]";
                            $show_pub_date = "[".$show_pub_date;
                        }
                   
                        #Get text and headline of current article
                        $iCurrentArtSpec = $oArticleProp->getArticleSpecification($key, $lang);
                        $aHeadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 1);
                        $aSubheadline = $oSearchResults->getSearchContent($key, 'HTMLHEAD', 2);
                       
                   $text = $oSearchResults->getSearchContent($key, 'HTML', 1);
                   echo "<hr>Line 0<br>".($text[0])."<hr>";
                   echo "<hr>Line 1<br>".htmlspecialchars($text[0])."<hr>";
                   echo "<hr>Line 2<br>".htmlspecialchars($text[0], ENT_QUOTES, 'UTF-8' )."<hr>";
                        $text = capiStrTrimAfterWord($text[0], CON_SEARCH_MAXLEN_TEASERTEXT);
                   echo "<hr>Line 3<br>".htmlspecialchars($text)."<hr>";
                   echo "<hr>Line 4<br>".htmlspecialchars($text, ENT_QUOTES, 'UTF-8' )."<hr>";
                        $headline = capiStrTrimAfterWord($aHeadline[0], CON_SEARCH_MAXLEN_TEASERTEXT); # conflict with capiStrTrimAfterWord and setReplacement('<strong>', '</strong>')
                   
                        $subheadline = capiStrTrimAfterWord($aSubheadline[0], CON_SEARCH_MAXLEN_TEASERTEXT);
                       
                        $cat_id = $oSearchResults->getArtCat($key);
                        $similarity = $oSearchResults->getSimilarity($key);

                        $similarity = sprintf("%.0f", $similarity);

                        #Send output to template
                        // this is just for sample client - modify to your needs!
                        if ($cfg['url_builder']['name'] == 'front_content') {
                            $aParams = array('lang' => $lang, 'idcat' => $cat_id, 'idart' => $key);
                        } else {
                            $aParams = array('search' => array('lang' => $lang, 'idcat' => $cat_id, 'idart' => $key),
                                            'idcat' => $idcat, // needed to build category path
                                            'lang' => $lang, // needed to build category path
                                            'level' => 1); // needed to build category path
                        }
                        try {
                            $href = Contenido_Url::getInstance()->build($aParams);
                        } catch (InvalidArgumentException $e) {
                            $href = $sess->url("front_content.php?idcat=$cat_id&idart=$key");
                        }
                        $tpl->set('d', 'more', $sMore);
                        $tpl->set('d', 'HREF', $href);
                        $tpl->set('d', 'TITLE', mi18n("Link zu Suchergebnis").' '.$i);
                        $tpl->set('d', 'NUM', $num);
                        $tpl->set('d', 'CATNAME', $headline);
                        $tpl->set('d', 'HEADLINE', $text);
                        $tpl->set('d', 'SUBHEADLINE', $subheadline);
                        $tpl->set('d', 'SIMILARITY', $similarity);
                        $tpl->set('d', 'TARGET', '_self');
                        $tpl->set('d', 'PUB_DATE', $show_pub_date);
                        $tpl->next();
                        $i ++;

                    }
                    $tpl->generate('templates/search_output.html');
                }
            } else {
                #No results
                $tpl->set('s', 'MESSAGE', $sYourSearchFor." '".htmlspecialchars(strip_tags($searchterm))."' ".mi18n("hat leider keine Treffer ergeben").".");
                $tpl->set('s', 'NEXT', '');
                $tpl->set('s', 'PREV', '');
                $tpl->set('s', 'PAGES', '');
                $tpl->set('s', 'result_page', '');
                $tpl->generate('templates/search_output.html');
            }

        } else {
            echo '<div id="searchResults">';
            echo '<h1>'.mi18n("Keine Suchergebnisse - Bitte suchen Sie &uuml;ber das Sucheingabefeld!").'</h1>';
            echo '</div>';
        }

        class Article_Property {
            var $globalConfig;
            var $oDBInstance;

            /**
             * Constructor
             * Hint: Call constructor with Article_Property($db, $cfg);
             * @param  oDBInstance instance of class DB_Contenido
             * @param  globalConfig
             */
            function Article_Property($oDBInstance, $globalConfig) {
                $this->globalConfig = $globalConfig;
                $this->oDBInstance = $oDBInstance;
            }

            /**
             * Get specification of an article
             *
             * @param   $iArticleId
             * @return  id of article specification
             */
            function getArticleSpecification($iArticleId, $iLangId) {

                $sqlString = "   
                            SELECT
                                artspec
                            FROM
                                ".$this->globalConfig['tab']['art_lang']."
                            WHERE
                                idart = '".$iArticleId."' AND
                                idlang = '".$iLangId."'
                            ";

                #echo "<pre>$sqlString</pre>";
                $this->oDBInstance->query($sqlString);

                if ($this->oDBInstance->next_record()) {
                    return $this->oDBInstance->f('artspec');
                } else {
                    return false;
                }
            }
        }
        ?> 
Vielleicht sieht man dadurch etwas mehr.

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von OliverL » Mi 31. Mär 2010, 09:00

jo, hab ich auch gesehen.
Muss wohl gestern bischen viel bei der arbeit getrunken haben ;)

war gerade am oberen Modul noch mal dran. Hat sich jetzt wohl erledigt. Thx Dodger77

Was mir jetzt noch aufgefallen ist das wenn ich die Zeichen in ISO codiere d.h.
” = &rdquo;
ä = &auml;
dann sind die Zeichen die Probleme machen nicht einem HTML-Code zugeordnet. Als als HEX codiert
d.h.
ă = &#259;
ş = &#351;
ţ = &#355;

Ich melde mich noch mal. Hab das bei einer Suche von meinen Projekten getestet und da wirds dann ganz wild.

mfg Oli

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von OliverL » Mi 31. Mär 2010, 09:36

Das Problem ist glaube ich nicht in dem Modul.

Ä�Å�Å£ <= htmlentities('ăşţ')
ăşţ <= htmlentities('ăşţ', ENT_COMPAT, 'utf-8')

In der Class "class.search.php" Zeile 1615 + 1621 ein htmlentities & ein html_entity_decode ohne Codierungsangabe.

In Zeile 510 ist es (denke ich) richtig:

Code: Alles auswählen

$key = htmlentities( $key, NULL, getEncodingByLanguage($this->db, $this->lang, $this->cfg) );
Werde mir das über die Feiertage mal anschauen.

mfg Oli

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Halchteranerin » Mi 31. Mär 2010, 21:35

Hallo,

ich habe jetzt Ingos Version eingebaut, die Ausgabe sieht jetzt anders aus, vielleicht könnt ihr damit mehr anfangen. Ich bin leider überfragt, ich hatte bisher auch noch nie etwas mit UTF-8 gemacht. :?
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von xmurrix » Do 1. Apr 2010, 12:45

Hallo zusammen,

habe ihr schon mal folgendes probiert?
http://forum.contenido.org/viewtopic.ph ... 66#p143541

Ein anderer User hatte Probleme mit den Suchergebnisse in Kyrillisch. Ich vermute, dass die Verwendung von str_replace die Ursache für die kaputte Anzeige der Suchergebnisse ist.

Grüße
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Halchteranerin » Do 1. Apr 2010, 17:44

Hallo,
xmurrix hat geschrieben:Ein anderer User hatte Probleme mit den Suchergebnisse in Kyrillisch. Ich vermute, dass die Verwendung von str_replace die Ursache für die kaputte Anzeige der Suchergebnisse ist.
nein, aber ihm scheint's auch nicht geholfen zu haben. :?

Jetzt nach deinem Hinweis habe ich es ausprobiert, aber ich sehe leider keine Änderung. Und die Kollation ist utf8_general_ci, sollte also sogar richtig sein, oder? Ich hab's probehalber auf utf8_romanian_ci umgestellt (bringt diese Änderung überhaupt etwas, bei den Datensätzen, die vorhanden sind? Ich habe bisher noch nie die Kollation geändert, bzw. mich überhaupt damit beschäftigt.), ich sehe aber auch so keine Änderung.

Irgendeine andere Idee?
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von xmurrix » Do 1. Apr 2010, 20:37

Halchteranerin hat geschrieben: Jetzt nach deinem Hinweis habe ich es ausprobiert, aber ich sehe leider keine Änderung. Und die Kollation ist utf8_general_ci, sollte also sogar richtig sein, oder? Ich hab's probehalber auf utf8_romanian_ci umgestellt (bringt diese Änderung überhaupt etwas, bei den Datensätzen, die vorhanden sind? Ich habe bisher noch nie die Kollation geändert, bzw. mich überhaupt damit beschäftigt.), ich sehe aber auch so keine Änderung.
Hmm, mein Status zu dem Thema ist folgende:
Wenn man über die Suchmaske Zeichen angibt, die nicht dem Zeichensatz ISO-8859-1 entsprechen, erzeugt das bei der Suche, genauer in der Klasse Index (Datei contenido/classes/class.search.php) in Zeile 497 beim Aufruf von str_replace einen korrupten String. Der neue String enthält dann chaotische Inhalte bestehend aus einem Zahlenwirrwarr. Die Ursache ist vermutlich str_replace, da dieser keine Multibyte-Zeichen unterstützt, aber die Sucheingabe daraus besteht. Das führt dann dazu, dass eine falsche Suchanfrage an die DB geht.

Bei dir ist das Problem anscheinend die Ausgabe. Hast du mal versucht die Klasse Search zu debuggen?
In der Modulausgabe steht irgendwo die Zeile

Code: Alles auswählen

$search = new Search($options);
füge danach noch eine Zeile

Code: Alles auswählen

$search->bDebug = true;
Das aktiviert das Debugging der Suche, im Frontend werden dann einige Daten ausgegeben. So könntest du eventuell eingrenzen, ob die Inhalte schon korrupt von der DB kommen, oder in der Klasse Search oder in der Modulausgabe verunstaltet werden. Das Debuggen sollte aber nicht auf einem Livesystem aktiviert werden.

Zur der Kollation:
Durch die Kollation kann man in MySQL Stringvergleiche beinflussen, z. B. für Sortierung usw.. Eine Abfrage mit Text, das Sonderzeichen (z. B. Umlaute) enthält, liefert unterschiedliche Ergebnisreihenfolge bei unterschiedlichen Kollationen.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Halchteranerin » Fr 2. Apr 2010, 08:55

Hallo xmurrix,

debuggen kann ich nicht, weil ich das nur als live-System habe. :? Aber ich drehe hier am Rad. Ich glaube, ich hatte das schon mal irgendwo erwähnt, dass ich zwei Sites habe. Eine mit 4.8.5 und eine mit 4.8.12, beide mit jeweils Original-Suchmodulen (na ja, jetzt nach Olivers Änderung nicht mehr :D), aber mit unterschiedlichem Verhalten.

Bei der 4.8.5 ist das so, dass ich nach Wörtern mit Sonderzeichen suchen kann, die auch gefunden werden. Bei den Suchergebnissen werden die Sonderzeichen in den Artikeltiteln richtig angezeigt, in den Textauszügen nicht.

Bei der 4.8.12 werden die Wörter, die Sonderzeichen beinhalten, nicht gefunden. Bei den Suchergebnissen werden weder in den Titeln noch in den Textauszügen die Sonderzeichen richtig angezeigt.

Beide Datenbanken hatten utf8_general_ci, habe sie nun auf _romanian_ umgestellt. Aber ich weiß echt nicht, wo ich ansetzen soll, so tief stecke ich auch nicht mehr drin, momentan. :(

Du hattest ja gesagt, dass ich in einer Contenido-Datei etwas ändern soll, daher weiß ich auch nicht mal, ob dieses oben beschriebene unterschiedliche Verhalten nur von den Modulen oder evtl. von unterschiedlichen Contenido-Dateien herrührt. :?

Viele Grüße
Christa
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von xmurrix » Di 6. Apr 2010, 10:04

Halchteranerin hat geschrieben:...debuggen kann ich nicht, weil ich das nur als live-System habe...
Verstehe, aber ohne Analyse und Debugging wird das Problem wohl nicht einfach lösbar sein. Du könntest extra dafür ein Modul, eine Kopie der class.search.php und einen Artikel erstellen, solange die URL zum Artikel nach außen nicht kommunziert wird, kannst du auch auf dem Livesystem machen.
Halchteranerin hat geschrieben:...daher weiß ich auch nicht mal, ob dieses oben beschriebene unterschiedliche Verhalten nur von den Modulen oder evtl. von unterschiedlichen Contenido-Dateien herrührt...
Es könnte beides sein, sowohl das Modul als auch die Contenido-Dateien haben sich geändert. Ich vermute aber, dass das Auslesen und Aufbereiten der Ergebnisse in class.search.php die Ursache sein könnte.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Dodger77 » Di 15. Jun 2010, 15:05

So, ich habe das dann mal nach Bugs verschoben. Soweit ich das bisher sehe (ich bin heute auf eine Suche nach kyrillischen Texten angesprochen worden), läuft schon die Erzeugung der Keywords nicht so ganz richtig. In Index::createKeywords() (class.search.php) findet man so eine netten Ansatz, die Keywords als Key eines Arrays zu benutzen:

Code: Alles auswählen

$this->keywords[$value] =  $this->keywords[$value] . $idtype."-".$typeid." ";
Das macht dann vermutlich bei Umlauten und anderen Zeichensätzen als iso-8859-1 Probleme. Timo hatte für die 4.8.3 wohl mal etwas dazu gemacht, vielleicht kann er da noch etwas sagen.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von xmurrix » Di 15. Jun 2010, 23:16

Hallo Dodger77,

habe mich auch mal damit etwas beschäftigt, konnte das Problem eingrenzen auf ein Zeile in der "contenido/classes/class.search.php". Das Thema war da auch Kyrillisch.

http://forum.contenido.org/viewtopic.ph ... 66#p143541

Dort wird str_replace() verwendet, der kann mit UTF-8 codierten Strings schon mal Probleme machen.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: Standard-Suchmodul und UTF-8

Beitrag von Halchteranerin » Mi 16. Jun 2010, 05:23

Wow, ich habe einen Käfer gefunden. :mrgreen: Für die 4.8.13 wird das aber wahrscheinlich nicht mehr behoben, oder? :cry:
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

Gesperrt