PHP Schalter um Element (div) auf Website ein/auszublenden

felsi

Banned
Registriert
Mai 2007
Beiträge
556
Hallo,

zuerst einmal sorry, falls ich das falsche Präfix ausgewählt habe. Ich bin mir nicht sicher, ob das folgende eher PHP oder Javascript oder etwas ganz anderes ist:

Ich habe einen Magento-Shop und würde nun gerne eine Funktion einbauen. Ich würde meinen eingeloggten Kunden gerne die Möglichkeit bieten anhand eines Schalters (z.B. Toggle Switch https://www.w3schools.com/howto/howto_css_switch.asp) ein Element (div class="XYZ") auf einer Website auszublenden.

Konkret geht es um den Preis auf der Kategorie-Ansicht. Da die Kategorie-Ansicht wie üblich bei einem Shop aus mehreren Seiten bestehen kann, müsste die Funktion/Einstellung für den Kunden auch irgendwie gespeichert werden.

Ist sowas machbar?

Vielen Dank bereits im Voraus.
 
Sowas löst man meistens mittels JavaScript.
Damit sich die Website (korrekter Weise der Client) diese Einstellung merkt, musst Du einen Cookie setzen.
 
Je_Tho schrieb:
Sowas löst man meistens mittels JavaScript.
Damit sich die Website (korrekter Weise der Client) diese Einstellung merkt, musst Du einen Cookie setzen.

oder wenn du es sowieso per javascript löst.. dann gleich in localStorage statt coockie speichern
 
Bin da evtl. etwas oldschool aber in Zeiten von coinhive und Co. würde ich das doch per php lösen wollen... evtl. kann man es per jquery "schön" aussehen lassen, die Arbeit dann aber durch php machen lassen. CSS wird sich das nicht so einfach merken. XSS mag auch nicht jeder.

php pro:
- klappt auch mit z.B. noScript o.ä.
- kann auch fix an z.B. Kundenlogin gebunden werden, wenn der Kunde etwas nicht sehen DARF
- kleinerer code, gerade wenn updates kommen, leichter nachzupflegen

php contra:
- nicht so schön hipp und animiert
- wenn man von php wenig Ahnung hat, ist es evtl. gefährlich in den scripten rum zu tippen (gilt aber auch für JS)

Mein Vorschlag wäre einfach ein Link oder Button, der z.B. auf www.meinshop.de?preisaus=1 zeigt. Das dann noch in eine cookie oder session Variable und danach dann ein oder ausblenden. Das sind nur ein paar Zeilen...

Kenne aber Magento zu wenig um hier wirklich verlässliches auszusagen...
 
Webentwickler schrieb:
Das reine Ein- und Ausblenden geht auch noch einfacher, nur mit CSS:

https://jsfiddle.net/j8r9hq2y/

Das müsste natürlich noch schön gemacht werden und ggf. die Checkbox durch einen Schieberegler oder so ersetzt werden.

Bei einer reinen CSS-Lösung hat man das Problem, dass die "Einstellung" nicht gespeichert wird.
Sobald eine neue Seite aufgerufen wird, verpufft der Effekt.
So eine CSS-Lösung ist nur bei Klapptexten sinnvoll und sogar dabei gibt es Mängel (keine weiche Transition möglich, sobald die Höhe der Box mit Wert=Auto berechnet wird; keine direkten Verweise möglich;..).

Insgesamt erscheinen mir die Ideen von Domi_bas ganz gut, doch "so viel" Code in ein bestehendes Shop-System zu integrieren, ist nicht ganz trivial.
 
doch "so viel" Code in ein bestehendes Shop-System zu integrieren, ist nicht ganz trivial.

Eben, die Entscheidung kann aber nur der TE tragen und verantworten.

Vielleicht gibt es ja noch eine Art Templteswitcher als Plugin/Extension/(wie das auch immer heißt) für Magento, damit könnte es auch gehen, einfach das Template so ändern, dass die class="Muuuuuh" nicht mehr angezeigt wird.
 
Danke euch. Ein Plugin gibt es leider nicht, das hatte ich schon geprüft. Da es sich um Magento handelt, wird man aber mit Sicherheit von Experten die Aussage erhalten, dass sich so ein Modul relativ einfach schreiben lässt.

Ich würde allerdings auch gerne so wenig wie möglich in das System eingreifen / Code hinzufügen. Für ein eigenes Modul fehlen mir leider die Kenntnisse, daher dachte ich, ich frage mal euch, ob es eventuell etwas relativ simples bereits fertig und mit sicherem Code gibt, das sich für meine Zwecke eventuell missbrauchen lässt.

Wäre euch sehr dankbar, falls noch einer eine Idee/Quelle hat. :)
(ob Javascript oder PHP ist mir persönlich eigentlich egal)
 
Wenn du nichts am Code, also der aktuellen Installation ändern willst/kannst, wirst du aber ohne fertige Plugins nicht weiter kommen. Kannst höchstens den Bildschirm des Kunden abkleben... ;-P
 
Ich würde schon ein paar Zeilen Code einfügen. Du hattest oben ja eine Lösung beschrieben. Gibt es dafür eventuell ein Beispiel, das ich für meine Zwecke umschreiben kann?
Wäre dir sehr dankbar :)
 
Je_Tho schrieb:
Bei einer reinen CSS-Lösung hat man das Problem, dass die "Einstellung" nicht gespeichert wird.
Sobald eine neue Seite aufgerufen wird, verpufft der Effekt.
So eine CSS-Lösung ist nur bei Klapptexten sinnvoll und sogar dabei gibt es Mängel (keine weiche Transition möglich, sobald die Höhe der Box mit Wert=Auto berechnet wird; keine direkten Verweise möglich;..).

Insgesamt erscheinen mir die Ideen von Domi_bas ganz gut, doch "so viel" Code in ein bestehendes Shop-System zu integrieren, ist nicht ganz trivial.

Deswegen schrieb ich ja "das reine Ein- und Ausblenden" ;).
 
@ Webentwickler
Danke. Könnte man die CSS Lösung nicht einfach noch irgendwie mit einer Cookie-Lösung versehen, sodass die Einstellung für den User gespeichert wird? Falls ja, gibt es dafür eventuell ein Beispiel bzw. nach was genau müsste ich googlen?
Für das Toggeln habe ich auch noch eine jQuery-Lösung gefunden: https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_toggle
Aber auch hier bräuchte man irgendwie noch ein Cookie, oder?
 
So z.B. der Teil für php:
PHP:
<?php 

$preis_weg = false;

if($_GET['preis_aus'] == 1) setcookie("preis_aus", 1, time()+20);  77 // wenn der Link betätigt wird, Cookie speichern 

if($_GET['preis_aus'] == 1 || $_COOKIE['preis_aus'] == 1) $preis_weg = true;  // wenn Cookie oder Link da, ausblenden, müsste nichtmal den Wert haben, einfach "nicht false sein" reicht...

$aktuelle_url = $_SERVER['PHP_SELF']; 
 
?>

Das hier muss dorthin, wo die Tabelle generiert bzw. durch z.B. MySQL-Abfragen der Preis eingetragen wird:
PHP:
<?php if($preis_weg === false) { 

... hier steht der Code, der den Preis anzeigt, bzw. die Spalte ( <td>, <div>, ...) 

} 
?>

Und so könnte der Link aussehen:
HTML:
<a href="<?php echo $aktuelle_url; ?>?preis_aus=1">klick mich!</a>

Über das genaue Aussehen der Links kann man natürlich nichts sagen, evtl. ist dort aus SEO-Gründen schöne Links, denen man einfach ein ?Variablenname=Variablenwert anhängen. Wenn nicht, müsste man aufpassen, dass man nicht den aktuellen Seitenlink kaputt macht.

Im Grunde ist es nichts Großes und auch kein Sicherheitsrisiko, durch das irgendwer deinen Shop hacken kann.
Es kann aber aufgrund der bei Magento verwendeten Technik, auch etwas aufwändiger werden. Wenn du aber von uns erwartest ohne Info (z.B. Auszüge aus deinem php-code) eine Anleitung ala "kopier <?php mach_tolle_sachen(); ?> dahin" zu bekommen, dann unterschätzt du das Projekt und solltest es sein lassen.

Etwas Grundwissen muss deinerseits vorhanden sein, außer du postest hier den Server + user/pw und wir legen einfach selbst Hand an.. :evillol:
 
kannst das auch ohne cookie lösen.. mit local storage
HTML:
  <div id="content">
    toggle div
  </div>

  <button id="toggle">toggle die div</button>

  <script>
    let content = document.querySelector('#content')
    let show = JSON.parse(localStorage.getItem('show'))

    show = show == null ? true : show

    if (!show) {
      hide()
    }

    function toggleContent() {
      if (show) {
        hide()
      } else {
        display()
      }

      localStorage.setItem('show', JSON.stringify(show))
    }

    function hide() {
      show = false
      content.style.display = 'none'
    }

    function display() {
      show = true
      content.style.display = ''
    }

    document.querySelector('#toggle')
      .addEventListener('click', () => toggleContent())
  </script>

dürfte so funktionieren
 
Zuletzt bearbeitet von einem Moderator:
Danke euch vielmals für eure Hilfe. Ich habe mich inzwischen spezifisch für Magento schlau gemacht. Hier muss/kann man wohl eine spezielle bereits konfigurierte Session nutzen.

1.) Z.B. Button mit Session:

Mage::getSingleton(‘core/session’)->setMyValue("hideprice");


2.) Und dann im entsprechenden Dokument:

if (Mage::getSingleton('core/session')->getHidePrice())

und da dann eben mit CSS display: none;

Punkt 2 ist mir klar. Ich scheitere allerdings an Punkt 1. Wie soll ich einen Button mit dieser Session belegen?

Wäre über jede Hilfe sehr dankbar. :)
 
@kling1

Ich habe jetzt noch mal mit Javascript experimentiert. Dein Script funktioniert wunderbar. Allerdings bräuchte ich getElementsByClass, da es nicht nur eine ID ist, sondern mehrere div class. Wäre das möglich?

Danke
 
ich nehme an.. der content ist eine klasse oder?

hier das beispiel mit eine klasse für das zu togglende element
ist gar nicht soviel anzupassen.. dtatt querySelector querySelectorAll benutzen und alle elemente mit einer forEach durchlaufen

HTML:
  <div class="content">
    toggle div 1
  </div>

  <div class="content">
    toggle div 2
  </div>

  <button id="toggle">toggle die div</button>

  <script>
    const contents = document.querySelectorAll('.content')
    let show = JSON.parse(localStorage.getItem('show'))

    show = show == null ? true : show

    if (!show) {
      hide()
    }

    function toggleContent() {
      if (show) {
        hide()
      } else {
        display()
      }

      localStorage.setItem('show', JSON.stringify(show))
    }

    function hide() {
      show = false
      contents.forEach(content => content.style.display = 'none')
    }

    function display() {
      show = true
      contents.forEach(content => content.style.display = '')
    }

    document.querySelector('#toggle')
      .addEventListener('click', () => toggleContent())
  </script>
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben