v2.7.x (Bugfix) Breadcrumb & Artikel-Navigator

Thema wurde von Anonymous, 21. April 2016 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    #1 Anonymous, 21. April 2016
    Zuletzt bearbeitet: 8. Juni 2016
    WICHTIG: Dieser Fix ist nicht kompatibel in Verbindung mit "URL Rewrite" ab der Version 2.7.4.0


    Die Bugfixes beheben die Fehler in der Darstellung und Verlinkung der Systemkomponenten Artikelnavigator, Breadcrumb und Hauptnavigation vor allem bei verlinkten Artikeln.

    Diese sind nur in Verbindung zusammen und ohne weitere Manipulationen an den Klassen
    "GMSEOBoost & CategoriesMenuBoxContentView" bzw. an den Klassenmethoden
    gültig und lauffähig.

    Wie immer gilt: Vor dem Einsatz unbedingt an einem Testshop ausprobieren, da ich auf keinen Fall wissen kann, welche Klassen, Methoden, usw. bereits in euren Shops manipuliert sind.


    Bugfix ohne SEOBoost (Derzeit leider keine update-sichere Möglichkeit gegeben):

    Die Datei "inc/xtc_product_link.inc.php" öffnen und durch folgendes ersetzen.
    Wichtig: Ich empfehle den bereits vorhanden Code auszukommentieren oder eine Kopie der Datei anzulegen.

    PHP:
    <?php
    /* --------------------------------------------------------------
       xtc_product_link.inc.php 2008-06-20 gambio
       Gambio OHG
       http://www.gambio.de
       Copyright (c) 2008 Gambio OHG
       Released under the GNU General Public License (Version 2)
       [http://www.gnu.org/licenses/gpl-2.0.html]
       --------------------------------------------------------------

    (c) 2005 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: xtc_product_link.inc.php 779 2005-02-19 17:19:28Z novalis $)


       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/

    function xtc_product_link($pID$name '')
    {
        
    $pName             xtc_cleanName($name);
        
    $pName             strtolower($pName);
        
    $categoryParameter $_GET['cat'];
        
    $categoryId        filter_var(reset(explode('_'$categoryParameter)), FILTER_SANITIZE_NUMBER_INT);

        if ((bool)
    $categoryId === false) {
            
    $actualCategory "
                  SELECT
                    p2c.categories_id,
                    cd.gm_url_keywords
                  FROM
                    products_to_categories p2c,
                    categories c,
                    categories_description cd
                  WHERE
                    p2c.products_id = "
    .(int)$pID."
                    AND cd.categories_id = p2c.categories_id
                    AND cd.language_id = "
    .$_SESSION['languages_id']."
                    AND c.categories_status = TRUE
                  LIMIT 1"
    ;

            
    $result xtc_db_fetch_array(xtc_db_query($actualCategory));

            return 
    $link 'info=p'.$pID.'_'.$pName.'.html&cat=c'.$result['categories_id'].'_'.$result['gm_url_keywords'];
        }

        
    $currentCategory "
              SELECT
                p2c.categories_id,
                cd.gm_url_keywords
              FROM
                products_to_categories p2c,
                categories c,
                categories_description cd
              WHERE
                (p2c.products_id = "
    .(int)$pID." AND p2c.categories_id = ".(int)$categoryId.")
                AND cd.categories_id = "
    .(int)$categoryId."
                AND cd.language_id = "
    .$_SESSION['languages_id']."
                AND c.categories_status = TRUE
                LIMIT 1"
    ;

        
    $result xtc_db_fetch_array(xtc_db_query($currentCategory));

        return 
    $link 'info=p'.$pID.'_'.$pName.'.html&cat=c'.$result['categories_id'].'_'.$result['gm_url_keywords'];
    }

    ?>
    _________________________________________________________________________________


    Bugfix mit SEOBoost:

    Unter "user_classes/overloads/" einen Ordner "GMSEOBoost" mit der Datei "BugfixGMSEOBoost.php" erstellen und folgenden Code in die Datei einfügen.

    PHP:
    <?php

    /**
    * Dieser Bugfix behebt die Fehler in der Darstellung und Verlinkung
    * der Systemkomponenten Artikelnavigator und Breadcrumb.
    *
    * Mit der Konstante @see const SHORT_URL = false (standard) | true
    * kann zwischen einer Standardform (false) und Kurzform (true)
    * der URL für ein Produkt geschaltet werden.
    *
    * Mein Dank geht an die freundliche Unterstützung der Community Mitglieder:
    * "barbara", "marmoles" und "Kai Schoelzke".
    */
    class BugfixGMSEOBoost extends BugfixGMSEOBoost_parent
    {
        const 
    SHORT_URL false;

        protected 
    $currentCategoryId;

        public function 
    __construct()
        {
            
    parent::__construct();

            
    $this->currentCategoryId $this->currentCategory();
        }

        public function 
    get_boosted_product_url($p_pID$p_pName ''$p_language_id false$p_url_keywords '')
        {
            
    $t_language_data_array $this->get_language_data('product'$p_pID$p_language_id$p_url_keywords);

            if (
    gm_get_conf('USE_SEO_BOOST_LANGUAGE_CODE') == 'true') {
                
    $t_language_data_array['code'] .= '/';
            } else {
                
    $t_language_data_array['code'] = '';
            }

            
    $p_pName $this->get_coolerized_product_name($p_pID$t_language_data_array['language_id']);
            
    $t_link  $t_language_data_array['code'];
            
    $t_path  $this->get_product_path($p_pID$t_language_data_array['language_id']);

            if (
    $t_path != '' && self::SHORT_URL === false) {
                
    $t_link .= $t_path.'/';
            }

            
    $t_link .= $p_pName;
            
    $t_link .= '.html';

            return 
    $t_link;
        }

        public function 
    get_product_path($products_id$languages_id false)
        {
            if (
    $languages_id === false) {
                
    $languages_id = (int)$_SESSION['languages_id'];
            }

            
    $out '';

            
    $result xtc_db_query("SELECT
                               categories_id
                            FROM
                               products_to_categories p2c
                            WHERE
                               p2c.products_id = '"
    .(int)$products_id."'
                               AND "
    .$this->sqlCategoriesId($this->currentCategoryId)."
                            LIMIT 1"
    );

            if (
    xtc_db_num_rows($result) > 0) {
                
    $data xtc_db_fetch_array($result);
                
    $out  $this->get_full_categories_names($data['categories_id'], $languages_id);
            }

            return 
    $out;
        }

        
    /**
         * Workaround um die ID der aktuellen Kategorie zu erfassen.
         * Mit dieser Information wird der Pfad zum Produkt ermittelt
         * und an den Breadcrumb übergeben.
         *
         * @return int
         */
        
    protected function currentCategory()
        {
            
    $pathInfo array_filter(explode('/'$_SERVER['PATH_INFO']));

            
    // Produktseite
            
    if (!isset($_GET['cPath'])) {
                
    $query xtc_db_query("SELECT cd.categories_id
                        FROM categories_description cd
                        LEFT JOIN categories c USING (categories_id)
                      WHERE categories_status = TRUE
                        AND gm_url_keywords = '"
    .$this->currentCategoryName($pathInfo)."'
                        AND language_id = '"
    .$_SESSION['languages_id']."'
                      LIMIT 1"
    );

                
    $result xtc_db_fetch_array($query);

                if (
    $result) {
                    
    $_GET['p2c']   = $result['categories_id'];
                    
    $_GET['cPath'] = xtc_get_category_path($result['categories_id']);

                    return (int)
    $result['categories_id'];
                }

                return 
    null;
            }

            
    // Kategorieseite
            
    return (int)end(explode('_'$_GET['cPath']));
        }

        
    /**
         * Workaround um den Namen der aktuellen Kategorie zu erfassen.
         * Mit dieser Information wird der Pfad zum Produkt ermittelt @see currentCategory
         *
         * @param $currentPath
         * @return string
         */
        
    protected function currentCategoryName($currentPath)
        {
            if (isset(
    $_GET['gm_boosted_category'])) {
                
    $_SESSION['currentCategoryName'] = end($currentPath);

                return 
    self::SHORT_URL === true $_SESSION['currentCategoryName'] : end($currentPath);
            }

            if (isset(
    $_GET['gm_boosted_product']) && self::SHORT_URL === true) {
                return 
    $this->sessionCategoryName($_SESSION['currentCategoryName'], $currentPath);
            }

            if (empty(
    $currentPath)) {
                unset(
    $_SESSION['currentCategoryName']);
            }

            return 
    array_reverse($currentPath)[1];
        }

        
    /**
         * Workaround um die URL der Hauptkategorie aus der Startseite eines Artikels zu erfassen.
         * Ist die $_SESSION['currentCategoryName'] bereits belegt,
         * wird diese für die Darstellung in URL-Kurzform übernommen.
         *
         * @param bool $currentCategoryName
         * @param $currentPath
         * @return mixed
         */
        
    protected function sessionCategoryName($currentCategoryName null$currentPath)
        {
            if (
    is_null($currentCategoryName)) {
                
    $productsName trim(str_replace('.html'''end($currentPath)));

                
    $query xtc_db_query("SELECT
                                        cd.gm_url_keywords
                                      FROM
                                        products_description pd
                                        LEFT JOIN products_to_categories p2c USING (products_id)
                                        LEFT JOIN categories_description cd USING (categories_id)
                                      WHERE
                                        pd.gm_url_keywords = '"
    .$productsName."'
                                      AND
                                        pd.language_id = "
    .(int)$_SESSION['languages_id']."
                                      LIMIT 1"
    );

                
    $result xtc_db_fetch_array($query);

                return 
    $_SESSION['currentCategoryName'] = $result['gm_url_keywords'];
            }

            return 
    $currentCategoryName;
        }

        
    /**
         * Legt Anhand der aktuellen Kategorie-ID fest
         * welche Anweisung für die Datenbankabfrage
         * festgelegt wird.
         *
         * @param $categories_id
         * @return string
         */
        
    private function sqlCategoriesId($categories_id)
        {
            if (empty(
    $categories_id)) {
                return 
    'p2c.categories_id != 0';
            }

            return 
    'p2c.categories_id = '.$categories_id.'';
        }
    }
    Außerdem unter "user_classes/overloads/" einen Ordner "CategoriesMenuBoxContentView" mit der Datei "BugfixCategoriesMenuBoxContentView.php" erstellen und folgenden Code in die Datei einfügen.

    PHP:
    <?php

    /**
    * Dieser Bugfix behebt in Verbindung mit @see BugfixGMSEOBoost die Fehler
    * in der Darstellung der Systemkomponente Hauptnavigation.
    *
    * Mein Dank geht an die freundliche Unterstützung der Community Mitglieder: "barbara" und "marmoles".
    */
    class BugfixCategoriesMenuBoxContentView extends BugfixCategoriesMenuBoxContentView_parent
    {
        protected 
    $categoryId 0;

        
    /**
         * Workaround um die ID der aktuellen Kategorie Anhand der URL-Parameter 'p2c' zu erfassen.
         * Mit dieser Information wird die Kategorie in der Navigation aktiv gesetzt.
         * Falls keine Erfassung stattfindet fallback zur systeminternen Ansatz.
         *
         * @param $p_categoryId
         */
        
    public function setCategoryId($p_categoryId)
        {
            if (isset(
    $_GET['p2c'])) {
                
    $this->categoryId = (int)$_GET['p2c'];
            } else {
                
    $this->categoryId = (int)$p_categoryId;
            }
        }
    }

    Wenn die Kurzform für URLs gewählt wird (const SHORT_URL = true), dann ist ein Überladen einer weiteren Klasse nötig.

    Unter "user_classes/overloads/" einen Ordner "ProductNavigatorContentView" mit der Datei "BugfixProductNavigatorContentView.php" erstellen und folgenden Code in die Datei einfügen.

    PHP:
    <?php

    /**
    * Dieser Bugfix behebt in Verbindung mit @see BugfixGMSEOBoost die Fehler
    * in der Darstellung der Systemkomponente Artikelnavigator.
    *
    * Mein Dank geht an die freundliche Unterstützung der Community Mitglieder:
    * "barbara", "marmoles" und "Kai Schoelzke".
    */
    class BugfixProductNavigatorContentView extends BugfixProductNavigatorContentView_parent
    {
        protected function 
    _generateSql()
        {
            
    $condition '';
            
    $condition .= ($this->fsk18DisplayAllowed === 0) ? ' AND p.products_fsk18 != 1' '';
            
    $condition .= (GROUP_CHECK === 'true') ? ' AND p.group_permission_'.(int)$this->customerStatusId.' = 1' '';
            
    $order $this->_getSortOrder();

            
    $query "SELECT
                        p2c.products_id,
                        pd.products_name
                      FROM
                        products_to_categories p2c,
                        products p,
                        products_description pd
                      WHERE
                         categories_id = '"
    .(int)$this->categoryId."'
                      AND p.products_id = p2c.products_id
                      AND p.products_id = pd.products_id
                      AND pd.language_id = '"
    .(int)$this->languageId."'
                      AND p.products_status = 1
                         "
    .$condition.$order;

            return 
    $query;
        }
    }
    _____________________________________________________________________________________________

    In beiden Fällen gilt: Nach der Umsetzung die Caches leeren.

    Geprüft und zertifiziert durch @marmoles :D

    Nun wünsche ich euch viel Spaß damit ;)
     
  2. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    wäre wirklich schön wenn sich jemand von Gambio hier äußert, finde es toll, dass Monevo sich der Sache annehmen will.

    Das Problem ist nämlich ein sehr ärgerliches!!
     
  3. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    #3 Anonymous, 25. April 2016
    Zuletzt bearbeitet: 25. April 2016
    Da ich nun wieder etwas Zeit habe um mich ein wenig weiter mit dem Breadcrumb zu beschäftigen, hätte ich eine Frage an die Community :)

    Die Artikel auf der Startseite die angezeigt werden, an welche Kategorie sollen diese verweisen?

    Grund meiner Frage ist, da Artikel (ob verlinkt oder nicht) auf der Startseite jeweils nur einmal dargestellt werden (ergibt auch Sinn), soll das System die Kategorie für verlinkte Artikel zufällig wählen oder die Kategorie in welcher der Artikel zuerst angelegt wurde???

    Hoffe habe mich verständlich ausgedrückt :eek:

    Edit: Vielleicht könnte ein Gambianer den Fred in "(Bugfix) Breadcrumb & Artikel-Navigator" umbennen, da der Fix beides beinhalten wird.
     
  4. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    denke, ist egal aber würde wohl Sinn machen wenn es die Erstkategorie wäre.
     
  5. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20

    Alles klar @marmoles dein Wunsch mein Befehl :D
     
  6. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    Nach 6 Stunden effektiver Arbeitszeit wollte ich kurz den Zwischenstand mitteilen.
    Breadcrumb & Artikel-Navigator machen nun auch bei verlinkten Artikeln das was sie sollen...

    Ein kleiner Schoenheitsfehler muss noch gefixed werden.
    Bis dahin, bitte ich noch um etwas Geduld :)
     
  7. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    sehr schön, bin gespannt...
     
  8. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    Hmm... Okay ich finde einfach nicht, wo der Schönheitsfehler seine Finger im Spiel hat.
    Darum bitte ich Gambio mir einen Tipp zu geben, wo sich der Schönheitsfehler einschleicht.

    Breadcrumb & Artikel-Navigator laufen nun einwandfrei, nur die Hauptnavigation will nicht mitspielen.

    Hinweis:
    Testartikel ist mit Testkategorie 2 verknüpft.
    Testartikel 2 ist in der Testkategorie 2 hinterlegt.

    Wie man auf den zwei Bildern sieht, ist auf dem "Ok"-Bild alles richtig.
    Auf dem "Fail"-Bild ist bis auf die Hauptnavigation und der "gm_javascript.js.php"-Datei alles richtig.

    Ich vermute stark dass die Hauptnavigation auf den Parameter "cPath" von der "gm_javascript.js.php" horcht und dementsprechend die Testkategorie der Hauptnavigation auf "aktiv" setzt :cool:

    Doch in der "gm_javascript.js.php" finde ich keinen Bezug zu dem Parameter "cPath".

    Also in welcher Datei wird der Parameter "cPath" an die "gm_javascript.js.php" angehängt??? :rolleyes:
     

    Anhänge:

    • Ok.JPG
      Ok.JPG
      Dateigröße:
      175,1 KB
      Aufrufe:
      37
    • Fail.JPG
      Fail.JPG
      Dateigröße:
      175,8 KB
      Aufrufe:
      36
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    Okay.. wer suchet, der findet!
    Habe es gefunden.. trotzdem danke fürs lesen :D
     
  10. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    hier mal Kritik von mir: finde es traurig, dass Monevo hier bei diesem wichtigen Punkt keinerlei Unterstützung von Euch bekommt.............
     
  11. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.378
    Danke erhalten:
    10.351
    Danke vergeben:
    1.491
    Das liegt möglicherweise an 2 Dingen:
    das Präfix ist "Bugfix" und der Beitrag ist nicht in der Entwicklerecke.
    Da kann ich mir schon vorstellen, das Gambio das übersieht :)
     
  12. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    man kann sich auch alles schön reden :)
     
  13. Wilken (Gambio)

    Wilken (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    7. November 2012
    Beiträge:
    17.656
    Danke erhalten:
    6.721
    Danke vergeben:
    2.027
    Das Wetter nicht.
     
  14. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.378
    Danke erhalten:
    10.351
    Danke vergeben:
    1.491
    Mit 'ner Flasche Likör geht auch das :)
     
  15. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    Hey @Wilken (Gambio) vielleicht kannst du in euren Reihen nachfragen welche Datei für die Hauptnavigation zuständig ist.
    Glaube habe mich oben #8 etwas falsch ausgedrückt...

    Anders gefragt:
    Welche Datei sendet der Hauptnavigation die Info über "cPath" bzw. die "ID" der Kategorie?
     
  16. Wilken (Gambio)

    Wilken (Gambio) Administrator
    Mitarbeiter

    Registriert seit:
    7. November 2012
    Beiträge:
    17.656
    Danke erhalten:
    6.721
    Danke vergeben:
    2.027
    Ich als einzelner hab nicht die geringste Ahnung :)

    Das meint: Ich müsste mich auch ne Weile durch den Code fuchsen um das irgendwie beantworten zu können, dazu haben wir aber Experten. Zu Montag könnte ich dir einen darauf ansetzen dir eine Antwort zu geben.
     
  17. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    Das wäre super!
     
  18. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    #18 Anonymous, 2. Mai 2016
    Zuletzt bearbeitet: 10. Mai 2016
    PHP:
    siehe Eingangspost...
     
  19. Anonymous

    Anonymous G-WARD 2015/2016

    Registriert seit:
    20. Februar 2012
    Beiträge:
    8.575
    Danke erhalten:
    1.483
    Danke vergeben:
    960
    bekomme diese Fehlermeldung und nix geht mehr....

    Code:
    /** * Dieser Bugfix soll in Zukunft die Fehler in der Darstellung und Verlinkung * der Systemkomponenten Artikelnavigator und Breadcrumb beheben. * * Mein Dank geht an die freundliche Unterstüzung der Community Mitglieder: "barbara" und "marmoles". */ class BugfixGMSEOBoost extends BugfixGMSEOBoost_parent { protected $currentCategoryId; public function __construct() { parent::__construct(); $this->currentCategory(); } public function get_product_path($products_id, $languages_id = false) { if ($languages_id === false) { $languages_id = (int)$_SESSION['languages_id']; } $out = ''; if (!empty($_GET['cPath'])) { $result = xtc_db_query("SELECT categories_id FROM products_to_categories AS p2c WHERE p2c.products_id = '".(int)$products_id."' AND p2c.categories_id = ".$this->currentCategoryId." LIMIT 1"); } else { $result = xtc_db_query("SELECT categories_id FROM products_to_categories AS p2c WHERE p2c.products_id = '".(int)$products_id."' AND p2c.categories_id != 0 LIMIT 1"); } if (xtc_db_num_rows($result) > 0) { $data = xtc_db_fetch_array($result); $out = $this->get_full_categories_names($data['categories_id'], $languages_id); } return $out; } /** * Workaround um die ID der aktuellen Kategorie zu ermitteln. * Mit dieser Information wird der Pfad zum Produkt ermittelt * und an die Url übergeben. */ protected function currentCategory() { if (isset($_GET['cPath'])) { $requestCategoryPath = $_GET['cPath']; $currentCategoryId = explode('_', $requestCategoryPath); $this->currentCategoryId = intval(end($currentCategoryId)); } $pathInfo = explode('/', $_SERVER['PATH_INFO']); $currentCategory = array_reverse($pathInfo)[1]; $query = "SELECT cd.categories_id FROM categories_description cd LEFT JOIN categories c USING (categories_id) WHERE categories_status = TRUE AND gm_url_keywords = '".$currentCategory."' AND language_id = '".$_SESSION['languages_id']."' "; $result = xtc_db_fetch_array(xtc_db_query($query)); if ($result) { $this->currentCategoryId = $result['categories_id']; $_GET['cPath'] = xtc_get_category_path($this->currentCategoryId);
    Fatal error: Class 'BugfixGMSEOBoost' not found in /www/htdocs/w00b669f/GX-Responsive/system/core/MainFactory.inc.php(61) : eval()'d code on line 1
    
    FATAL ERROR(1): "Class 'BugfixGMSEOBoost' not found"
     
  20. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    112
    Danke vergeben:
    20
    hast du unter overloads "GMSEOBoost" - Ordner erstellt?