Öffnungszeiten mit Indikator für "geöffnet" bzw. "geschlossen"
am 19.06.2014 - 09:25 Uhr in
Hallo Leute,
ich habe mal wieder ein schwieriges Problem zu lösen.
Und zwar würde ich gerne einen Block auf der Webseite einfügen, der alle Öffnungszeiten enthält.
Statisch ist das kein Problem.
Jetzt hätte ich aber gerne einen Indikator der basierend auf dem aktuellen Datum anzeigt, ob offen ist oder nicht...
Habt ihr vielleicht eine Idee?
- Anmelden oder Registrieren um Kommentare zu schreiben

Wo werden die Öffnungszeiten
am 19.06.2014 - 13:47 Uhr
Wo werden die Öffnungszeiten gepflegt, die Du im Block ausgiebst?
Sind das Felder eines Nodes, die in einer View abgefragt werden können?
ne die gibts noch gar
am 19.06.2014 - 14:21 Uhr
ne die gibts noch gar nicht... ein statischer Block wäre ja einfach. per php code könnte man sowas ja auch umständlich programmieren, aber der drupal php Filter ist ja auch tendentiell unsicher.
möglich wäre vielleicht, blöcke ein bzw. auszublenden mit rules, aber da muss ich ma sehen...
Erstelle einen Inhaltstyp
am 19.06.2014 - 14:43 Uhr
Erstelle einen Inhaltstyp Öffnungszeiten mit einer Fieldcollection, die beliebig oft wiederholt werden kann. Dort kannst Du jetzt Tag, Startzeit und Endzeit eintragen. Für die Darstellung schreibst Du Dir dann eine preprocess_node-Funktion (in de template.php im eigene Theme), die "Offen" oder "Geschlossen" ausgibt. In dieser Funktion lädst Du in einer Schleife die einzelnen Fieldcollections und wertest die Felder aus. Paßt der Tag, müssen auch noch die Zeiten geprüft werden. Ohne eigene Programmierung wird es wohl nicht gehen.
Warum wird hier eigentlich
am 20.06.2014 - 06:18 Uhr
Warum wird hier eigentlich für alles ein eigener Inhaltstyp erstellt? Das ist so sinnvoll wie mit Kanonen auf Spatzen zu schießen. Inhaltstypen sind für die Strukturierung von umfangreichen Daten und die Darstellung im Web sinnvoll. Aber für eine handvoll Öffnungszeiten gleich einen Inhaltstypen anzulegen, halte ich nicht nur für überzogen - wenn man das für alle möglichen Daten so macht, hat man schnell einen völlig unübersichtlichen Wust an Inhaltstypen, die nur für völlig nebensächliche Lösungen bestehen. Außerdem werden bei jedem Node und jedem Feld Unmengen an Daten abgespeichert, die überhaut nicht benötigt werden, wenn es um solche Sachen wie Öffnungszeiten geht. Das müllt nur die Datenbank voll, die bei Drupal eh schon ein Monster ist.
Da es eh nicht ohne Programmierung geht, würde ich auch die Verwaltung der Öffnungszeiten gleich neu programmieren, statt mit Inhaltstypen und Feldern herumzuhantieren. Aber letztendlich verändern sich die Öffnungszeiten in der Regel ja doch nicht so oft, so dass ich die eigentlich auch einfach hardcoden würde.
Wie fit bist Du denn mit der PHP-Programmierung?
Das ist eine philosophische Frage
am 20.06.2014 - 07:25 Uhr
Inhaltstypen tun niemandem weh.
Wenn es der leichteren Bedienung dient, warum nicht einen Inhaltstypen anlegen?
Das sind im Zweifel ein paar Felddefinitionen in der Variablentabelle.
Bei den Views, Menues etc. muss man natürlich auf die Übersichtlichkeit achten, und nicht immer alle möglichen Inhaltstypen anbieten.
Einen extra Inhaltstyp für
am 20.06.2014 - 07:33 Uhr
Einen extra Inhaltstyp für öffnungszeiten würde ich auch nicht erstellen.
Ich bin einfach davon ausgegangen, daß es einen Inhaltstypen gibt, mit dem die Entities verwaltet werden, an denen die Öffnungszeiten hängen.
Vielleicht sehe ich das aber auch falsch und es gibt nicht mehrere Läden ect. für die Öffnungszeiten gepflegt werden müssen.
Falls es nur jeweils eine Einheit von Öffnungszeiten zu pflegen gibt, würde ich das über die Möglichkeit im Block regeln, die Ausgabe des Blocks unter bestimmten Konditionen zu erlauben.
Wenn der Tag Mo/di/mi/do/fr/sa ist und die Uhrzeit zwischen 8 und 12 oder der Tag Mo/di/mi/do/fr und die Uhrzeit zwischen 13 und 18 Uhr ist, dann zeige den Block mit Schriftzug "Offen" ansonsten den mit "Geschlossen".
Etwas PHP-Kenntnisse sind dafür natürlich auch nötig.
Wenn es viele versch. Entities gibt mit unterschiedlichen Öffnungszeiten, weil z.B. ein Laden von 8-12 und 13-18 Uhr offen hat und andere durchgehend, dann braucht's noch eine (Node+Felder-)Struktur für diese Einheiten.
Ohne tiefergehende Kenntnisse, was der Background der Seite ist, kann man da nicht wirklich gute Tipps geben.
In der Variablentabelle sind
am 20.06.2014 - 07:38 Uhr
In der Variablentabelle sind überhaupt keine Felddefinitionen: für jedes Feld gibt es einen Eintrag in field_config und field_config_instance, dazu werden für jedes Feld 2 Tabellen angelegt. Jeder Wert in einem Feld wird dadurch doppelt abgespeichert - noch dazu mit etlichen Daten, die oft überhaupt nicht gebraucht werden.
Gerade bei diesem Beipiel wären Inhaltstypen auch kein bisschen einfacher, das macht die Pflege der Öffnungszeiten viel komplizierter als nötig und löst überhaupt nicht das Problem, dass je nach aktueller Uhrzeit "geöffnet" oder "geschlossen" angezeigt werden soll. Nur weil es für neue Nodes bereits ein fertiges Formular gibt, heißt das nicht, dass das alles einfacher macht.
montviso schrieb ...Falls es
am 20.06.2014 - 08:10 Uhr
...Falls es nur jeweils eine Einheit von Öffnungszeiten zu pflegen gibt, würde ich das über die Möglichkeit im Block regeln, die Ausgabe des Blocks unter bestimmten Konditionen zu erlauben.
Wenn der Tag Mo/di/mi/do/fr/sa ist und die Uhrzeit zwischen 8 und 12 oder der Tag Mo/di/mi/do/fr und die Uhrzeit zwischen 13 und 18 Uhr ist, dann zeige den Block mit Schriftzug "Offen" ansonsten den mit "Geschlossen".
Etwas PHP-Kenntnisse sind dafür natürlich auch nötig.
Ohne tiefergehende Kenntnisse, was der Background der Seite ist, kann man da nicht wirklich gute Tipps geben.
Genau dieses Szenario das du anfangs beschreibst, will ich umsetzen.
Theoretisch müsste ich ja nur n Modul finden, das mir ermöglicht Blöcke zeitgesteuert ein bzw. auszublenden...
Das ist ja lustig hier
am 20.06.2014 - 08:17 Uhr
Irgendwie gerät der thread aus den Fugen! Da schreibt einer ohne irgendwelche Angaben: "will Öffnungszeiten im Block" und Ihr macht so ein Fass auf.
Ich biete mal noch ein paar Ansätze, nur so zum Spass:
Entityreference von irgendwas auf den Nodetyp Öffnungszeit.
Taxonomy.
Na ja,
meine Meinung, wenig humble dazu, wenn einer so einen thread eröffnet ohne sich die Mühe zu machen, und Ihr springt darauf an und diskutiert über Variablenspeicherung etc., da rate ich zu einem Spaziergang im Wald.
Ist gesund und wir haben Sommer!
Na da scheint aber jemand ein
am 20.06.2014 - 08:52 Uhr
Na da scheint aber jemand ein grundsätzliches Problem mit Diskussionen zu haben ;-) Ich sehe keine Veranslassung dazu mit einem Spaziergang herunterkommen zu müssen, nur weil hier sachlich diskutiert wird - auch wenn die Ausgangsbasis eine schwammige Frage ist, gerät hier dieser Thread ja nicht gleich aus den Fugen, nur weil das Für und Wider von Vorschlägen, die eingebracht werden, diskutiert werden. Ganz im Gegenteil - vielleicht könnte man ja was lernen ;-)
Um auf die Ausgangsfrage zu kommen: Ohne PHP und ein bisschen Programmierung geht es nicht. Also noch mal meine Frage: Hast Du da Programmier-Erfahrung, lieber Thread-Eröffner, oder nicht? Wenn Du die nicht hast oder auch nicht lernen willst, brauchen wir darüber nicht weiter diskutieren, weil ohne eigene Programmierung (zumindest ein bisschen), geht es nicht.
maen schrieb Irgendwie gerät
am 20.06.2014 - 09:00 Uhr
Irgendwie gerät der thread aus den Fugen! Da schreibt einer ohne irgendwelche Angaben: "will Öffnungszeiten im Block" und Ihr macht so ein Fass auf.
Ich biete mal noch ein paar Ansätze, nur so zum Spass:
Entityreference von irgendwas auf den Nodetyp Öffnungszeit.
Taxonomy.
Na ja,
meine Meinung, wenig humble dazu, wenn einer so einen thread eröffnet ohne sich die Mühe zu machen, und Ihr springt darauf an und diskutiert über Variablenspeicherung etc., da rate ich zu einem Spaziergang im Wald.
Ist gesund und wir haben Sommer!
was heißt hier bitte "nicht die Mühe machen" - ist eher die Frage, wer hier ein Fass aufmacht.
Es ging nicht um die Frage, wie man einen statischen Block mit Öffnungszeiten erstellt, sondern wie man diesen dynamisch mit einem Indikator für "heute ist noch offen" bzw. "heute ist nicht offen" versieht...
was da jetzt "ohne sich Mühe zu machen" ist, wo doch eigentlich nur die verschiedenen Herangehensweisen abgeklopft werden sollten, verstehe ich echt nicht...
Auf deiner Verständnisbasis würde eine Community übrigens nicht funktionieren.
aber nun back 2 topic.
tobi-berlin schrieb Na da
am 20.06.2014 - 09:02 Uhr
Na da scheint aber jemand ein grundsätzliches Problem mit Diskussionen zu haben ;-) Ich sehe keine Veranslassung dazu mit einem Spaziergang herunterkommen zu müssen, nur weil hier sachlich diskutiert wird - auch wenn die Ausgangsbasis eine schwammige Frage ist, gerät hier dieser Thread ja nicht gleich aus den Fugen, nur weil das Für und Wider von Vorschlägen, die eingebracht werden, diskutiert werden. Ganz im Gegenteil - vielleicht könnte man ja was lernen ;-)
Um auf die Ausgangsfrage zu kommen: Ohne PHP und ein bisschen Programmierung geht es nicht. Also noch mal meine Frage: Hast Du da Programmier-Erfahrung, lieber Thread-Eröffner, oder nicht? Wenn Du die nicht hast oder auch nicht lernen willst, brauchen wir darüber nicht weiter diskutieren, weil ohne eigene Programmierung (zumindest ein bisschen), geht es nicht.
ja natürlich php Programmier-Skills sind vorhanden. Mein Gedankenansatz war jedoch ein anderer - nämlich der "Block ein- bzw. ausblenden" zu bestimmten Zeiten...
Muss mal gucken ob das mit rules geht...anderenfalls programmier ich mir den Indikator selbst...
@tobi-berlin, ich mache sehr
am 20.06.2014 - 09:38 Uhr
@tobi-berlin,
ich mache sehr gerne Spaziergänge im Wald...finde ich eine ganz tolle Sache. ;-)
Aber ich kenne diese Problematik aus meinen Anfängen mit Drupal nur zu gut:
Das Tool ist so mächtig und es führen so viele Wege nach Rom, daß man häufig den Wald vor lauter Bäumen nicht mehr sieht und sich schon damit schwer tut, die Ausgangslage richtig zu schildern.
Mir wurde in solchen Situationen geholfen (und wird immer mal wieder) und deswegen bricht mir auch heute kein Zacken aus der Krone, wenn ich einfach mal Fragen formuliere, mit dem man das Problem eingrenzen kann.
Was ja hier offensichtlich auch gelungen ist.
Die konkrete Frage lautet nun:
Gibt es ein Modul, mit dem man zeitgesteuert Blöcke ein- oder ausschalten kann?
Meine Antwort:
Mir ist keines bekannt (was bei der riesigen Anzahl an Modulen nichts heißt).
Ich würde ein paar Zeilen PHP-Code in den Block schreiben, dort wo man angeben kann, auf welchen Seiten, bzw. unter welchen Conditions (PHP-Abfrage ergibt TRUE) der Block angezeigt werden soll.
Dann empfiehlt es sich, den
am 20.06.2014 - 09:47 Uhr
Dann empfiehlt es sich, den entsprechenden Code in ein eigenes (Mini-)Modul auszulagern wegen der besseren Übersichtlichkeit. Eine Frage sollte man sich aber noch stellen: Wer soll die Daten zu den Öffnungszeiten pflegen, denn das hat Implikationen für das Vorgehen.
Naja zu pflegen gibts da
am 20.06.2014 - 09:54 Uhr
Naja zu pflegen gibts da eigentlich nix, da sich die Zeiten nicht ändern. Es geht eher darum, auf jeder Seite die Öffnungszeiten der Geschäftsstelle anzuzeigen + Indikator ob offen ist...
ein PHP Block sollte da vollkommen ausreichen, oder hat ein PHP Block sicherheitsrelevante Nachteile?
@Rikibu,Du brauchst keinen
am 20.06.2014 - 10:06 Uhr
@Rikibu,
Du brauchst keinen PHP Block.
Du hast doch bei jedem Block die Möglichkeit, anzugeben, auf welchen Seiten bzw. unter welchen Umständen der Block angezeigt werden soll.
Auf Engl. heißt der Bereich
Show block on specific pages
Dort wählst Du die 3. Option und schreibst bei dem Block für "Geöffnet" sinngemäß rein:
<?php
if( (Heute == Mo || heute == Di....)
&&
(
(Uhrzeit => 8Uhr && Uhrzeit < 12Uhr)
||
(Uhrzeit => 13Uhr && Uhrzeit < 18Uhr)
)
{
return true;
}
else
{
return false;
}
?>
Für Heute und die Uhrzeiten brauchst Du dann noch die entsprechenden PHP-Funktionen.
Das sollte mit Drupal-Core-Funktionalität und etwas PHP funktionieren.
Und analog -nur umgekehrt- machst Du das für den "Geschlossen"-Block.
schließe mich montviso an...
am 20.06.2014 - 10:37 Uhr
schließe mich montviso an... wenn es nur um das Ein- und Ausblenden geht, kannst Du das einfach mit den Block-Sichtbarkeiten machen... musst nur das PHP-Filter-Modul vom Kerm aktivieren und dann dort entsprechend ermitteln, wie spät/ welches Datum das aktuelle ist und dann entsprechen TRUE oder FALSE zurückgeben
OK, jetzt kommt mal Fleisch
am 20.06.2014 - 10:52 Uhr
OK, jetzt kommt mal Fleisch an die Sache. Ich stelle mir das mal so vor:
Da soll ein Block sein, der irgendwelche Läden, Geschäfte oder was auch immer enthält. Bspw:
Laden | Öffnungszeit
hela | offen
Aldi | geschlossen
Wobei man statdessen heute ja für alles buttons oder images nutzt.
Dann fange ich mal an:
Wie baue ich in einem Modul einen Block:
/**
* Implements hook_block_info().
*/
function YOUR_MODULE_block_info() {
$blocks = array();
$blocks['YOUR_BLOCK_ABC'] = array(
'info' => t('YOUR BLOCK NAME'),
);
return $blocks;
}
/**
* Implements hook_block_view().
*/
function YOUR_MODULE_block_view($delta = '') {
$block = array();
switch ($delta) {
case 'YOUR_BLOCK_ABC':
$block['subject'] = '';
$block['content'] = _YOUR_MODULE_BLOCK_ABC_CONTENT();
break;
}
return $block;
}
function _YOUR_MODULE_BLOCK_ABC_CONTENT() {
$output = t('Hello world');
return $output;
}
Was baue ich jetzt in die Funktion _YOUR_MODULE_BLOCK_ABC_CONTENT()?
1. Abfrage:
Definiere die momentane Zeit:
<?php
$now = time(); // aktuelle Zeit als timestamp
?>
Jetzt nehme ich an, dass in Deinem Inhalt 2 date Felder existieren: Start und Ende
Hier nutze ich dann die Drupal Funktion EntityFieldQuery. Mit db_query läuft die Abfrage schneller, ist aber schwieriger zu programmieren ohne Erfahrung.
<?php
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'Dein EntityTyp')
->propertyCondition('status', 1)
->fieldCondition('Name vom Startfeld','value',$now,'>=')
->fieldCondition('Name vom Endefeld','value',$now,'<')
->fieldOrderBy('title oder was immer du ordnen willst für mehr Einträge', 'value', 'ASC')
$result = $query->execute();
?>
Ergebnis: Du hast nur die gerade geöffneten Läden in dem Block.
dann machst Du mittels foreach einen Durchlauf der Ergebnisse:
<?php
if (!empty($result)) {
$ergebnisse = node_load_multiple(array_keys($result['node'])); // hier werden die Ergebnisse in ein array geladen
foreach ($ergebnisse as $ergebnis){
$title = $ergebnis->title;
$img = '<img src=' . 'sites/default/files/dein button für offen'.'>';
$output[] = '<div class="title">.$title.'</div>'. '<div class="img">.$img.'</div>';
}
return $output;
}
?>
Ergebnis: Wenn kein Laden offen hat sieht man nur den Title des Blocks -> unschön!
Besser:
Erst das EntityFieldQuery in einer NEUEN FUNKTION ausführen und gucken ob ein $result vorliegt, ähnlich dem geschriebenen. In der Funktion parameter setzen: if $result leer dann $output = 1, else $output = 2 oder so.
Dann den YOUR_MODULE_block_view aufrufen.
function YOUR_MODULE_block_view($delta = '') {
$block = array();
switch ($delta) {
case 'YOUR_BLOCK_ABC':
$läden_vorhanden = NEUE_FUNKTION();
if($läden_da == 2){
$block['subject'] = '';
$block['content'] = _YOUR_MODULE_BLOCK_ABC_CONTENT();
break;
}
}
return $block;
}
Dann siehe oben.
Ergebnis: Wenn der Inhalt leer ist wird der Block nicht angezeigt.
Das war es dann auch schon.
OK, JETZT habe selbst ich dein Begehr verstanden
am 20.06.2014 - 11:40 Uhr
Ich rate generell von php code in der DB ab! Langsamer und unsicher. Was Du brauchst geht mit obigem Code folgendermaßen:
Schreibe ein Modul, von mir aus das klassische mymodule. Also Folder 'mymodule', eine mymodule.info und eine mymodule.module.
Dann in mymodule.module:
Baue den Block (copy-paste):
<?php
/**
* Implements hook_block_info().
*/
function mymodule_block_info() {
$blocks = array();
$blocks['oeffnungszeiten'] = array(
'info' => t('Öffnungszeiten'),
);
return $blocks;
}
/**
* Implements hook_block_view().
*/
function mymodule_block_view($delta = '') {
$block = array();
switch ($delta) {
case 'oeffnungszeiten':
$block['subject'] = 'TITEL DEN DU MÖCHTEST';
$block['content'] = mymodule_block_content();
break;
}
return $block;
}
function mymodule_block_content() {
$now = time(); // aktuelle Zeit als timestamp
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'Dein EntityTyp') //hier dein Typ einsetzen
->propertyCondition('status', 1) //veröffentlicht
$result = $query->execute(); // Jetzt hast Du den Inhalt falls einer vorhanden ist geladen
if (!empty($result)) { // damit es kein Gemeckere vom Server gibt prüfe ob was da ist
$ergebnisse = node_load_multiple(array_keys($result['node'])); // hier werden die Ergebnisse in ein array geladen
foreach ($ergebnisse as $ergebnis){ // mach es trotzdem in eine foreach Schleife falls mal was dazu kommt, falls nicht kein Verlust!
$title = $ergebnis->title;
$start = $ergebnis-> feld wo deine Startzeit drin steht ['und'][0]['value']; // ist meines wissens nach ein timestamp
$end = $ergebnis-> feld wo deine Endzeitzeit drin steht ['und'][0]['value']; // ist meines wissens nach ein timestamp
if ($start <= $now < $end){
$img = '<img src=' . 'sites/default/files/dein button für offen'.'>'; // falls Du buttons verwendest
$string ="Komm ruhig vorbei wenn Du dich traust!";
}
else{ $img = '<img src=' . 'sites/default/files/dein button für geschlossen'.'>';
$string ="Bleib besser zu Hause!";
}
$output[] = '<div class="title">.$title.'</div>'. '<div class="img">.$img.'</div>';
$output[] = '<div class="title">.$title.'</div>'. '<div class="my_string">.$string.'</div>';
}
return $output;
}
}
?>
Ich habe das hier im Editor geschrieben, d.h. da können noch Fehler drin sein.
Maen, ich fürchte, nun hast
am 20.06.2014 - 11:47 Uhr
Maen, ich fürchte, nun hast DU Dich etwas bei Deinem Spaziergang im Wald verlaufen. ;-)
Nach neuerster Info gibt es keine Nodes und folglich auch keine Öffnungsezeiten, die man aus der Daba auslesen muß.
Es gibt nur einen einzigen Laden mit Öffnungszeiten.
Dafür ist das ja wirklich etwas Overhead.
Das mit dem PHP kann man so streng sehen.
Ein paar Zeilen PHP in den Block.Conditions finde ich schon vertretbar.
Wenn es mehr wäre, würde ich auch ein Modul bevorzugen, alleine wegen der besseren Debug-Möglichkeiten.
Jetzt gebe ich an ;)
am 20.06.2014 - 11:56 Uhr
-> Ich war sogar joggen!
Na, dann wundert es mich,
am 20.06.2014 - 12:02 Uhr
Na, dann wundert es mich, nicht, daß Du etwas außer Atem bist. ;-)
Scherz beiseite, das sollte ich auch mal wieder tun...
Ein anderer Ansatz - nicht schlagen
am 20.06.2014 - 12:25 Uhr
Wenn diese Tabelle der Öffnungszeiten angezeigt wird, könnte doch ein jscript dies mit der aktuellen Zeit vergleichen, und ein entsprechendes Symbol ein/ausblenden.
Ich, geduscht, gegessen und
am 20.06.2014 - 12:53 Uhr
Ich, geduscht, gegessen und ausgeruht, habe immer noch Probleme mit Eurem Ansatz!
Mag ja sein dass meiner komplexer ist, aber wie bringt Ihr denn mit Eurem Feiertage und Betriebsferien in Einklang?
Dafür brauche ich DB Einträge, aber ich lerne wirklich gerne dazu!
Naja, da hast Du schon
am 20.06.2014 - 13:32 Uhr
Naja, da hast Du schon irgendwie recht...mit den Feiertagen, maen.
Ich dachte nicht weiter als bis zu den Öffnungszeiten, die an einem Laden stehen.
Da steht ja auch nicht die Latte der Feiertage bis ins Jahr 2050.
Danke für eure rege
am 20.06.2014 - 13:47 Uhr
Danke für eure rege Diskussionsbereitschaft... freut mich sehr.
die Feiertage, Schließzeiten die aus dem Rahmen fallen, ließen sich ja gesondert abfragen... so viele sind das im Jahr nicht...
Na dann bau es doch als Modul
am 20.06.2014 - 14:47 Uhr
Na dann bau es doch als Modul für alle.
Aufgabe:
Import der Feiertage für die verschiedenen Bundesländer. (feeds oder so)
Eintrag für reguläre Start und Endtermine.
Eintrag für Sondertermine wie Brückentage; Betriebsferien etc.
Das Ganze dann auf drupal.org zur Verfügung gestellt.