Hallo, wie kann ich in der Datei PHP: ProductListingContentControl.inc.php die aktuelle KategorieID auslesen ? PHP: if (isset($_GET['cPath'])) { $cPath = xtc_input_validation($_GET['cPath'], 'cPath', ''); } else { $cPath = ''; } /* Get current_category_id */ if (xtc_not_null($cPath)) { $cPath_array = xtc_parse_category_path($cPath); $cPath = implode('_', $cPath_array); $this->current_category_id = $cPath_array[(sizeof($cPath_array) - 1)]; } else { $this->current_category_id = 0; } Das funktioniert leider nicht in unserem Fall, weil wir SEO Boosted URL's verwenden, mit anderen Worten: $this->current_category_id ist immer 0 (der Wert), cPath wird leider nicht als GET-Parameter mitgegeben. Ich möchte jetzt nur ungerne die URI rückwärts auslesen, um an die KategorieID zu bekommen. Jemand eine Idee ? Vielen Dank im Voraus !
Hallo nach dem Du dich angemeldet hast kanst Du das hier: an deine Shopurl dranhängen dort stehen deine ID drin. Stand hier im Forum ... zumindest mache ich es so wenn ich an eine Kategorie ID rann muss.
Einfach die Kategorie im AB markieren und dann auf Bearbeiten klicken. Dann erscheint in der URL Leiste die ID.
Nein, ich brauche eine saubere programmtechnische Lösung für die laufende Webseite derart, dass ich die Kategorieid dynamisch irgendwie sonst als GET bekomme... Dass die ID's in der DB unter product_to_categories drinne stehen weiß ich auch... Aber eine geniale Idee, einem PHP-Script zu sagen: Hallo, markiere da mal was....
Hi Move, ich weiß zwar nicht welche Shopversion du einsetzt und was du genau vorhast, aber in der aktuellen Version 2.5 wird die $current_category_id und der $c_path direkt an die ProductListingContentControl.inc.php aus der index.php übergeben. Die Variablen sind also bereits korrekt gesetzt und können mit $this->current_category_id und $this->c_patch angesprochen werden. Wenn du einmal genauer erläutern könntest was du vorhast, können wir dir auch genauere Hilfestellung geben. Hinweis: Änderungen oder Anpassungen sollten wenn möglich nicht direkt in der ProductListingContentControl.inc.php durchgeführt werden, sondern immer in einer extra Datei als Overload im Ordner /user_classes/overloads/ProductListingContentControl
Till hat recht! Ne genauere Info darüber was du willst wäre sinnvoll! Und einen sauberen Overload kann ich nur empfehlen(eigene schlechte Erfahrung)!!!
Wir haben da ein kleinen Versionssprung von 2.1.4.0 auf 2.5.3.1 vollzogen... Und jetzt funktionieren halt nicht mehr unsere Filter korrekt. Der Preisfilter bezieht sich jetzt bspw. neuerdings auf alle Artikel, statt sich nur auf die Artikel in der jeweiligen Kategorie zu beschränken. Da iss mir halt der Gedanke gekommen, ob überhaupt die Kategorie mitgegeben wird. Aber muss ja eigentlich, denn das Objekt wird ja in der index.php überhaupt erst erstellt. Also ich sitze hier mit Notepad ++ und wühle mich durch Tausende Zeilen Code, den ich zum Ersten Mal inspiziere... Ich persönlich ziehe ja Visual Basic oder C# vor....PHP ist etwas gewöhnungsbedürftig, vielleicht nicht für euch... Oh mann, ich habe ja sowas von keine Ahnung von PHP... Wie kann ich denn in product_boxes_list-USERMOD die aktuelle Kategorie-ID ausgeben ? Da war doch was mit var_dump ?
Hi, um die Kategorie ID in der Produktliste zu erhalten, muss diese erst einmal über den ContentView an das HTML Template übergeben werden. Dazu musst die die ProductListingContentView.inc.php überladen. Erstelle dazu im Ordner /user_classes/overloads/ den Ordner ProductListingContentView Darin erstellt du nun die Datei mit dem Namen MyProductListingContentView.inc.php und fügst folgenden Inhalt ein: PHP: <?php/* -------------------------------------------------------------- MyProductListingContentView.inc.php 2015-12-17 tt Gambio GmbH http://www.gambio.de Copyright (c) 2015 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] --------------------------------------------------------------*/?><?phpclass MyProductListingContentView extends MyProductListingContentView_parent { public function prepare_data() { parent::prepare_data(); $this->set_content_data('CURRENT_CATEGORY_ID', $this->cache_id_parameter_array[0]); }} Danach steht dir in der HTML Datei /templates/EyeCandy/module/product_listing/product_listing_v1.html die Variable CURRENT_CATEGORY_ID zur Verfügung. Diese kannst du dann an die Datei /templates/EyeCandy/objects/product_boxes_list.html übergeben, indem du die Zeile 117 in der product_listing_v1.html anpasst: PHP: {object_product_list product_list=$module_content current_category_id=$CURRENT_CATEGORY_ID id_prefix="new_products" truncate_products_name=$TRUNCATE_PRODUCTS_NAME}
Unser Webdesigner hat ProductListingContentControl.inc.php leider nicht überladen. $this->current_category_id würde dort also grundsätzlich nicht funktionieren ? Also quasi: PHP: if (isset($_GET['cPath'])) { $cPath = xtc_input_validation($_GET['cPath'], 'cPath', ''); } else { $cPath = ''; } /* Get current_category_id */ if (xtc_not_null($cPath)) { $cPath_array = xtc_parse_category_path($cPath); $cPath = implode('_', $cPath_array); $this->current_category_id = $cPath_array[(sizeof($cPath_array) - 1)]; } else { $this->current_category_id = 0; } $_GET ist doch eigentlich eine Superglobale, wenn gleich der GET-Parameter cpath gar nicht angehängt wird. Die folgende Variante würde also nicht funktionieren ? PHP: $this->set_content_data('CURRENT_CATEGORY_ID', $this->current_category_id);
Hi, die GET Parameter können nicht direkt in den Klassen wie üblich angesprochen werden, dies dient der Sicherheit. Allerdings wird das Script nicht benötigt, da durch die Datei die ich gepostet habe die current_category_id auch in den HTML Dateien product_listing_v1.html und product_boxes_list.html vorhanden ist und keine Anpassung an der ProductListingContentControl.inc.php mehr nötig ist um die aktuelle Kategorie ID zu erhalten. Der folgende Aufruf funktioniert in der ProductListingContentControl.inc.php nicht PHP: $this->set_content_data('CURRENT_CATEGORY_ID', $this->current_category_id); da es sich nicht um eine ContentView Klasse handelt, dies funktioniert nur in der ProductListingContentView.inc.php, für die ich den Overload gepostet habe.
Ok, korrekt als USERMOD überladen werden wir ProductListingContentControl.inc.php dann später. Die Frage bleibt aber, wie ich in der Klasse ProductListingContentControl.inc.php korrekt an die aktuelle category_id komme. Ich wollte nur deshalb die category_id dumpen und in der Produktliste ausgeben,weil ich die Vermutung habe, dass hier der Fehler liegt. Würde das dann also in jeder Klasse funktionieren: PHP: $current_category_id = $this->cache_id_parameter_array[0]
Hallo, ich habe noch eine andere Frage zur Verwendung von $GLOBALS wie in der Datei index.php (Zeile 41): PHP: if(isset($GLOBALS['cID'])){ $coo_listing_control->set_('categories_id', $GLOBALS['cID']);} Ab PHP Version 5.4. existiert nicht mehr die Einstellung php_register_globals. Unsere Produktivseite läuft auf PHP Version 5.6. Heißt das dann auch, dass die o.g. Eigenschaft folglich nicht mehr gesetzt wird bzw. per default eh 0 ist ? Gibt es eine Alternative zur Verwendung von $GLOBALS ?
Hi, die aktuelle Kategorie ID kann in der Klasse ProductListingContentControl direkt als $this->current_category_id angesprochen werden, die ID muss nicht vorher selbst ermittelt werden. Die ID wird bereits in der /includes/application_top.php ermittelt und ist somit in der Index.php im $GLOBALS Array und wird dann direkt an die ProductListingContentControl übergeben. Die Option register_globals ist seit PHP 5.4 nicht mehr vorhanden und hat die Variablen automatisch als global definiert, damit konnte man die Variablen ohne das $GLOBALS Array direkt ansprechen, was sehr unsicher war, da viele Variablen aus Formlaren direkt mit dem Namen des Formularelemente vorhanden waren und diese Scripte wahren von Außen angreifbar. Deshalb gibt seit PHP 4 die super globale Variable $GLOBALS die alle Variablen enthält die im Script außerhalb von Klassen und Funktionen definiert werden und nur über $GLOBALS angesprochen werden können. Das $GLOBALS Array muss nicht manuell befüllt werden. Beispiel: PHP: <?phpfunction test() { $foo = "local variable"; echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n"; echo '$foo in current scope: ' . $foo . "\n";}$foo = "Example content";test();?>
Ich habs jetzt hingekriegt. Das "Problemchen" war einfach, dass der Preisfilter bzw. die Methode build_feature_filter_sql() in der Klasse ProductListingContentControl alle Kategorien betrachtet. Das hat halt meine anderen Filter, die Kategoriebezogen sind, dann rausgehauen: PHP: $t_categories_id = $this->coo_filter_manager->get_categories_id();