[PHP] Aktuelle Kategorie id auslesen

Thema wurde von Anonymous, 16. Dezember 2015 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    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 !
     
  2. carstengentsch

    carstengentsch Erfahrener Benutzer

    Registriert seit:
    22. Juni 2015
    Beiträge:
    219
    Danke erhalten:
    10
    Danke vergeben:
    31
    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.
     
  3. MP Solution

    MP Solution Erfahrener Benutzer

    Registriert seit:
    2. Oktober 2013
    Beiträge:
    2.945
    Danke erhalten:
    456
    Danke vergeben:
    93
    Einfach die Kategorie im AB markieren und dann auf Bearbeiten klicken. Dann erscheint in der URL Leiste die ID.
     
  4. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    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....
     
  5. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.671
    Danke erhalten:
    1.265
    Danke vergeben:
    300
    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
     
  6. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    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)!!! ;) ;) ;)
     
  7. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    #7 Anonymous, 16. Dezember 2015
    Zuletzt bearbeitet: 16. Dezember 2015
    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 ?
     
  8. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.671
    Danke erhalten:
    1.265
    Danke vergeben:
    300
    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]
       --------------------------------------------------------------
    */
    ?><?php


    class 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}
     
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    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);
     
  10. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.671
    Danke erhalten:
    1.265
    Danke vergeben:
    300
    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.
     
  11. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    #11 Anonymous, 18. Dezember 2015
    Zuletzt bearbeitet: 18. Dezember 2015
    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]
     
  12. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    #12 Anonymous, 18. Dezember 2015
    Zuletzt bearbeitet: 18. Dezember 2015
    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 ?
     
  13. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.671
    Danke erhalten:
    1.265
    Danke vergeben:
    300
    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:

      <?php
    function test() {
        
    $foo "local variable";

        echo 
    '$foo in global scope: ' $GLOBALS["foo"] . "\n";
        echo 
    '$foo in current scope: ' $foo "\n";
    }

    $foo "Example content";
    test();
    ?>       

     
  14. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. Juni 2013
    Beiträge:
    246
    Danke erhalten:
    21
    Danke vergeben:
    35
    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();