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 Nun wünsche ich euch viel Spaß damit
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!!
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 Edit: Vielleicht könnte ein Gambianer den Fred in "(Bugfix) Breadcrumb & Artikel-Navigator" umbennen, da der Fix beides beinhalten wird.
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
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 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???
hier mal Kritik von mir: finde es traurig, dass Monevo hier bei diesem wichtigen Punkt keinerlei Unterstützung von Euch bekommt.............
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
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?
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.
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"