Artikel für bestimmte Länder sperren

Thema wurde von guentherderx, 25. Mai 2015 erstellt.

  1. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Hallo,

    wir müssen die Produkte eines Herstellers für bestimmten Länder sperren, weil dorthin nicht verkauft werden darf. Das ließe sich zwar über Kundengruppen realisieren. Aber dann müsste der Kunde sich erst registrieren und manuell einer Gruppe zugeordnet werden, bevor er bestellen kann. Das ist nicht realistisch. Eine zweite Idee war, die Länderkennung zu ermitteln und die Kategorie im Template auszugeben. Dann könnte man den Warenkorb Button für diese Konstellation deaktivieren. Leider wird die Variable $CATEGORIES_NAME nicht im Produkt Template übergeben. Hat jemand eine Idee, wie ich darauf zugreifen kann? Oder hat jemand vielleicht sogar eine bessere Idee für die Umsetzung?
     
  2. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    #2 Developer, 25. Mai 2015
    Zuletzt bearbeitet: 25. Mai 2015
    Hallo Günther,

    es hört sich schon einmal gut an das Du Dich ein wenig auskennst. :)

    Also, da gibt es einige Möglichkeiten:

    1 mögliche Lösung, anhand der bisher zur Verfügung gestellten Informationen von Dir ohne weitere Szenarien eingeschlosssen, ist, dass Du im Backend bei den Herstellern bequem die Länder hinterlegst (ISO Codes 2), wo kein Kauf möglich sein soll. Dies wäre abhängig vom Herstellern. Du kannst es natürlich noch feiner machen, in dem Du das ganze bei den Produkten realisierst. Schon ist es produktspezifisch und nicht nur abhängig vom Hersteller.

    Nun geht´s weiter: Überall wo der Warenkorbschalter greift, musst Du Dir eine Variable bereitstellen, die besagt, dass es diesen Artikel betrifft. Wenn ja, könnte man den Warenkorbschalter ausblenden lassen und einen Textzusatz anzeigen: Lieferung in diesem Land nicht möglich. Oder irgendwas anderes.

    2.te Variante mit den Kundengruppen: Man könnte den jenigen automatisch nach Registrierung in die Kundengruppe schieben lassen und Du brauchst da nix manuell zu machen. Je nachdem wie groß Dein Kundenstamm ist, würde ich die bisherigen Kunden manuell umstellen, aber besser ein Script die Arbeiten erledigen lassen.

    Es gibt noch andere Ansätze, aber die 1.te wäre eine saubere und überschaubare Variante. :)
     
  3. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Rein aus Neugierde :)
    Woher willst Du denn vor der Anmeldung und Eingabe der Lieferadresse wissen, dass der Kunde das Produkt in besagtes Land liefern lassen will?
    Theoretisch könnte der Kunde ja auch in DE wohnen und den Shop in seiner Muttersprache aufrufen. Dann würde der Umsatz verloren gehen, da der Kunde den Artikel nicht in den Warenkorb legen kann - oder übersehe ich da was?
     
  4. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    #4 Developer, 25. Mai 2015
    Zuletzt bearbeitet: 25. Mai 2015
    Hallo Barbara,

    dazu müssten man noch andere Punkte berücksichtigen. Aber zunächst kannst Du nur nach der angemeldeten Adresse gehen. Sobald der Kunde als Lieferland eine andere auswählt, so werden diese Artikel wieder freigeschaltet. Vorher musst Du Ihn natürlich darauf aufmerksam machen, das eine Lieferung in seinem Land nicht möglich ist. Zu dem Textzusatz könnte man den Lieferadresse ändern Schalter noch einblenden und den Kunden direkt auf die checkout_shipping_address.php weiterleiten. Das bedeutet, dass die Stelle berücksichtigt werden muss. Genau funktionsweise müsste man mit dem Kunden klären, wie bequem er alles haben möchte.

    Ideen gibt es noch viele, wollte nur kein Roman schreiben. :)
     
  5. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Hallo,

    danke für die Antwort. Das klingt elegant, aber wo kann ich denn Ländercodes bei den Herstellern eingeben? Da sehe ich keinerlei Einstellungen.

    @Barbara: Der Ländercode würde über die IP ermittelt. Die Sprache wäre also irrelevant. Das Problem wäre hier weniger Dein Szenario, sondern dass z.B. jemand aus Deutschland bestellt und in ein nicht erlaubtes Land liefern lassen will. DAS wäre nicht so einfach zu knacken. Häufiger sind aber direkte Bestellungen aus den gesperrten Ländern. Ew wäre schon gut, wenn wir das im Griff hätten.
     
  6. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Das wäre aber einerseits eine ziemliche umfangreiche Änderung des Code. Andererseits würde es aber auch Probleme mit dem Warenkorb bereiten. Bei Neukunden ist der ja in der Regel gefüllt, bevor die Kundendaten eingegeben werden. Nach Eingabe dieser Daten müsste also nochmals validiert werden. Schnell und schmutzig wäre der Workaround mit dem Kategorienamen und dem Auslesen des Ländercode. Leider weiß ich nicht, wie ich in Smarty die Variable in anderen Templates verwenden kann.
     
  7. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Danke für die Aufklärung :D
     
  8. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Deswegen sage ich ja: Genau funktionsweise müsste man mit dem Kunden klären, wie bequem er alles haben möchte.

    Es war die Rede von Artikel bestimmter Hersteller. Das was Du vor hast, ist aber extrem Dirty. :)

    Die Artikel sollen in eine bestimmte Kategorie? Willst Du die Länder Codes fest in den Dateien verankern? Oder ist generell bei Dir der nicht Kauf != DE?
     
  9. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Naja, EXTREM dirty ist das nun auch wieder nicht. Es wäre eine Lösung, bei der man mit 5% Aufwand 95% Ergebnis bekommt.

    Es geht um die Produkte eines Herstellers. Die liegen alle in einer gemeinsamen Kategorie. Wenn ich global auf die $categories_name zugreifen könnte, wäre schon der Großteil erledigt.

    Ich käme zwar auch mit {if $page_url|strstr:"xyl"} {/if} ans Ziel, aber wäre sogar mir zu dirty. Man muss doch den Namen der Kategorie irgendwie global verfügbar machen können.
     
  10. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    #10 Developer, 25. Mai 2015
    Zuletzt bearbeitet: 25. Mai 2015
    Du brauchst doch nur die Prüfung in der products_to_categories vorhnehmen, Dir die categories_id auslesen und dann über die categories_description bzw. über $this->buildCAT gehen. Bei der Änderung des Namens würde sogar die ID erhalten bleiben. Hoffe habs nicht allzu kompliziert gemacht. :)

    Du musst es an den Stellen zur Verfügung stellen, wo die Artikel angezeigt werden. Sprich in der Detailansicht, Suche und Listing. Oder woran scheitert es genau?´
     
  11. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Scheint mir aber unnötig kompliziert. Die Variable $CATEGORIES_NAME ist doch bereits vorhanden. Und grundsätzlich lassen sich in Smarty solche Variablen auch in allen Templates nutzen. Ich weiß leider nicht wie. Weißt Du es?

    Die Abfrage des Ländercodes habe ich als Plugin geschrieben. Das funktioniert soweit. Den Rest könnte ich, wie gesagt, auch über die page_url machen, aber das ist schon etwas unelegant.
     
  12. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    #12 Developer, 26. Mai 2015
    Zuletzt bearbeitet: 26. Mai 2015
    Also Guenther,

    ich hab Dir mal schnell was zusammen geschrieben. Ungetestet. Sollte aber theoretisch gehen.

    Es gibt viele Ansätze, aber dies sollte für Dich reichen. :D

    system/classes/products/ProductInfoContentView.inc.php

    diesen Code

    PHP:
    $ccid_product_query_check xtc_db_query("SELECT categories_name FROM categories_description WHERE categories_id = '".$p_current_category_id."' AND language_id= '"$_SESSION['languages_id']."'");
    $ccid_product_check xtc_db_fetch_array($ccid_product_query_check);
    $this->set_content_data('CCID_PRODUCT'$ccid_product_check['categories_name']);
    vor ca. Zeile 130 bei

    PHP:
    xtc_db_query("update ".TABLE_PRODUCTS_DESCRIPTION." set products_viewed = products_viewed+1 where products_id = '".$p_coo_product->data['products_id']."' and language_id = '".$_SESSION['languages_id']."'");
    einfügen.

    Nun steht der Kategoriename mit der Variable {$CCID_PRODUCT} in der standard.html oder in der/Deiner USERMOD zur Verfügung.

    Den Ansatz hast Du ja, hoffe kommst damit zurecht! :)

    Ach, und den Cache nicht vergessen zu leeren.
     
  13. Christian Mueller

    Christian Mueller Beta-Held

    Registriert seit:
    4. Juli 2011
    Beiträge:
    3.699
    Danke erhalten:
    889
    Danke vergeben:
    288
    Der einfachste Weg der mir dazu einfällt, wäre die Versandartensperre von Holger Schrörs. www.xycons.de
    Du legst eine Versandart an, für die Länder in die der Versand erlaubt ist und eine weitere für die Länder, in die der Versand einzelner Artikel nicht erlaubt ist. Bei den Artikeln wo der Versand nicht erlaubt ist, sperrst Du die zweite Versandart.

    Leider merkt der Kunde erst im Checkout, daß der Artikel nicht in das Land geliefert werden kann. Du könntest aber einen Hinweis im Artikeltext anlegen oder den entsprechenden Text im Customizer hinterlegen.
     
  14. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Die system/classes/products/ProductInfoContentView.inc.php
    kann man sehr gut mit einer
    user_classes/overloads/ProductInfoContentView/name_ProductInfoContentView.inc.php
    überladen. Dann ist die Änderung auch Updatesicher.
     
  15. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Super, vielen Dank! Hat fast auf Anhieb gefunzt. Ich musste die zweite WHERE Bedingung rausnehmen, aber die braucht man ja nicht. Den Ländercode frage ich so ab:
    PHP:
    function smarty_function_geoblock($params, &$smarty)
    {
    require_once(
    "/www/htdocs/w011d024/templates/EyeCandy/geoip.inc.php");
    $gi geoip_open("/www/htdocs/w011d024/templates/EyeCandy/GeoIP.dat",GEOIP_STANDARD);
    $country_code geoip_country_code_by_addr($gi$_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if (
    in_array($country_code, array('AR','AG'...), true)){
    echo 
    "geoblock";
    }
    }
    Hast Du eine Idee, wie ich die PHP Variable hier in eine Smarty Variable bringe, die ich im Template verwenden kann? Ich habe es mit $smarty = new Smarty; versucht, hat aber nicht funktioniert. Mit Smarty habe ich aber noch viel gemacht. Eine if Bedingung funktioniert wohl nicht mit {geoblock}.
     
  16. guentherderx

    guentherderx Erfahrener Benutzer

    Registriert seit:
    23. Januar 2013
    Beiträge:
    147
    Danke erhalten:
    6
    Danke vergeben:
    21
    Hallo und vielen Dank für den Hinweis. Bin mir nicht sicher, ob das Plugin genau das macht, was wir brauchen. Ein Nachteil ist aber in der Tat, dass der Kunde das erst sehr spät bemerkt. Unsere Lösung ist zwar nicht elegant, aber dafür greift sie bereits beim Produkt, so dass der Kunde hier nicht verunsichert wird. Ein Vorteil ist natürlich auch, dass die Funktion global an der Kategorie greift, so dass man nichts bei den Produkten ändern muss.
     
  17. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Das hab ich mir gespart, da der Kollege sich wohl auskennt! ;)
     
  18. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Hi Günther,

    brauchst Du noch meine Hilfe? Oder an wen ist die Frage gerichtet? :)
     
  19. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Das war auch nur ein Hinweis für die "Mitleser" :D
     
  20. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    @barbara: Das meinte ich: :)

    Hast Du eine Idee, wie ich die PHP Variable hier in eine Smarty Variable bringe, die ich im Template verwenden kann? Ich habe es mit $smarty = new Smarty; versucht, hat aber nicht funktioniert. Mit Smarty habe ich aber noch viel gemacht. Eine if Bedingung funktioniert wohl nicht mit {geoblock}.