Calendar, Theme, Stripe (Streifen)
am 14.07.2010 - 16:09 Uhr in
Hallo zusammen,
bei mir klappts mit den Kalander-Streifen nicht: sie werden nicht (weiss) angezeigt, wobei in der HTML-Ausgabe steht
folgendes:
<div style="background-color:#e73b3b;color:#e73b3b" class="stripe" title="Key: Störungen"> </div>
Wenn ich den HTML-Code in eine Datei speichere und im Browser aufrufe, stehen die Streifen in Farbe da. Eine Idee?
Und noch andere Frage gleich dazu: wie kann ich auf die Streifen-Farben zugreifen und sie verändern (in Abhängigkeit von bestimmten
Spalten in eigener Tabelle, also nicht in Abhängigkeit von Vokabular, Terms oder Inhaltstypen, die es schon standardmäßig gibt)? Ich habe
eine Theme-Funktion gefunden, die die Farben ausgibt: theme_calendar_stripe_stripe($node), liegt in calendar/theme/theme.inc - Datei
Ich würde gerne die Farben vor diesem Aufruf setzen ($node->stripe[$k]) ohne die Theme-Funktion zu überschreiben.
Weiss jemand, wie ich das aus einem eigenem Module machen kann? Welche hooks kann ich dazu nutzen?
Vielen Dank im Voraus,
sewimoeller
- Anmelden oder Registrieren um Kommentare zu schreiben
Wenn du HTML-Code zeigen
am 14.07.2010 - 17:01 Uhr
Wenn du HTML-Code zeigen willst, solltest du das ganze in Code-Tags setzen ;-)
Aber ich kann dir gerade nicht folgen. Was für Streifen? Was genau willst du machen? Hast du mal einen Screenshot?
Screenshots
am 14.07.2010 - 17:32 Uhr
hi Exterior,
sorry für "falschen code", beim nächten Mal markiere ich es als Code. Hab versicht das zu ändern:
Zeile mit Code markiert und "Code"-Button im Editor geklickt. Aber es wurde alles gelb markiert... Muss ich noch
schauen, wie ich das mache.
Ich habe zwei Screenshots gemacht. Eine aus dem Portal und andere habe ich so gemacht:
Quellcode Anzeigen
nur den Quellcode speichern als eine html-Datei
und im Browser aufgerufen.
Da ist die Anzeige zwar durcheinander, aber diese rote Streifen hätte ich gerne in der anderer Ansicht.
Lg
Ich habe bei mir diese
am 14.07.2010 - 18:22 Uhr
Ich habe bei mir diese Streifen gar nicht im Einsatz, sondern habe den Termin komplett eingefärbt, erschien mir übersichtlicher.
Kannst du dir ja mal anschauen: http://wasserwacht-verwaltung.de/termine
Ansonsten:
Warum genau willst du nicht die Theme-Funktion überschreiben?
Hi Exterior, Dein Kalender
am 14.07.2010 - 20:02 Uhr
Hi Exterior,
Dein Kalender sieht echt toll aus! Ja, komplett einfärben sieht besser aus.
Wie hast du das gemacht? Eigene CSS-Klassen definiert ("calendar-own-title" bei dir) und eine Team-Funktion überschrieben oder ein Template benutzt?
Welches? Hängt bei dir die Farbe von Taxonomy-Terms ab?
Ich habe zwei Kalender-Sichten: eine basierend auf eigenem Event-Inhaltstyp (mit CCK erstellt) mit Taxonomy-Terms für die Unterscheidung nach Termintypen.
Eigentlich wie bei dir. Da würde ich auch komplett einfärben, wenn man die Farben nicht zu grell wählt.
Andere Kalender-Sicht zeigt nur Störungen und Blockzeiten an. Sie sind in den Tabellen in der DB gespeichert (nicht mit CCK erstellt). Die Farben stehen fest: für Störungen
knall-rot, für Blockzeiten knall-orange. Da wird es nicht gehen mit komplett einfärben. Für das Design bin ich nicht zuständig, also kann nicht entscheiden. Störungen und
Blockzeiten darf ich auch nicht verändern (nur anzeigen). Unterscheidung zwischen Störungen und Blockzeiten geschieht anhand einer Spalte in der Tabelle (0=störung, 1=blockzeit).
Deswegen muss ich irgendwo auf die Farbe Einflüss nehmen.
Daher würden mich beide Lösungen interessieren (komplett einfärben und evtl. Tipps für die Streifen).
Ich wollte diese Theme-Funktion nicht überschreiben, weil sie eigentlich genau das macht, was ich im Prinzip möchte: sie ist nur für die Anzeige der Farbe zuständig und
bekommt diese Farbe von außen irgendwo ($node als Parameter wird ihr übergeben und über $node greift sie auf die Farbe zu). Also wenn ich auf die Farbe Einflüss nehmen will,
dann wäre es gut irgendwo da draußen sie zu setzen. Nur wo? Oder meinst du doch in dieser Theme-Funktion? (ich meine natürlich in die, die sie überschreibt: fkt oder template)?
Weil eigentlich um die Farbe zu setzen muss ich Datenbankabfragen machen. Wenn man es streng sieht: Theme-System ist so was wie Frontend (für die Anzeige der Daten da) und
andere Funktionen sind Backend (um die Daten abzurufen, zu ändern...) dann ist das nicht wirklich gut, diese Funktionalität in die Theme-Funktion zu packen. Was meinst du?
Lg
Katja
Also die komplette Einfärbung
am 14.07.2010 - 21:31 Uhr
Also die komplette Einfärbung ist eigentlich recht einfach:
Im Theme-Ordner des Calendar-Moduls findest du eine Datei namens calendar-month-node.tpl.php --> die kopierst du dir in den Ordner deines Themes (nicht direkt im Calendar-Modul ändern)
Diese Datei hat standardmäßig diesen Inhalt:
<div class="view-item view-item-<?php print $view->name ?>">
<div class="calendar monthview" id="<?php print $node->date_id ?>">
<?php print theme('calendar_stripe_stripe', $node); ?>
<?php foreach ($fields as $field): ?>
<div id="<?php print $field['id']; ?>" class="view-field view-data-<?php print $field['id'] ?>">
<?php if ($field['label']): ?>
<div class="view-label-<?php print $field['id'] ?>"><?php print $field['label'] ?></div>
<?php endif; ?>
<?php print $field['data']; ?>
</div>
<?php endforeach; ?>
</div>
</div>
Das ganze habe ich so geändert:
<?php
$full_node = node_load(array('nid'=>$node->nid));
if ($full_node->field_checkmeldung[0]['value'] == 'aktivieren')
{
$class = 'event_type_termin_meldung';
}
else
{
$class = 'event_type_termin_normal';
}
?>
<div class="view-item view-item-<?php print $view->name ?>">
<div class="calendar monthview" id="<?php print $node->date_id ?>">
<?php print theme('calendar_stripe_stripe', $node); ?>
<div class="<?php print $class; ?>">
<?php foreach ($fields as $field): ?>
<div id="<?php print $field['id']; ?>" class="view-field view-data-<?php print $field['id'] ?>">
<?php if ($field['label']): ?>
<div class="view-label-<?php print $field['id'] ?>"><?php print $field['label'] ?></div>
<?php endif; ?>
<?php print $field['data']; ?>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
Ich habe also oben in einer Abfrage ein CCK-Feld geprüft und je nach Wert habe ich die Variable $class anders belegt.
Dann habe ich einen Div mit eben dieser Klasse um den Termin drum rum gebaut.
Die Klassen fügt man dann noch in die style.css des Themes ein und passt sie an. Mehr ist es eigentlich nicht.
Da du allerdings Streifen UND Einfärbung in unterschiedlichen Momenten verwenden willst, wäre es sinnvoll, die Ausgabe des Streifens nur dann zu machen, wenn man sie benötigt:
//Das hier:
<?php print theme('calendar_stripe_stripe', $node); ?>
//Machen wir zu sowas:
<?php
if ($full_node->type == 'Störungen-Typ')
{
print theme('calendar_stripe_stripe', $node);
}
?>
Damit wird der Streifen nur ausgegeben, wenn der Node vom Inhaltstyp für Störungen ist.
Ich weiß jetzt leider nicht, wie eure Tabelle für Störungen aufgebaut ist usw.
Die Stripes werden in calendar.module erstellt, da kannst du dich schonmal nicht einklinken.
Und es scheint, als würden die Farben dort in irgendeiner Form von den für Stripes vorgegebenen Farbwerten abhängen. Ich vermute also mal, dass du da nicht einfach so rein kommst (ich vermute es wie gesagt, kannst es dir ja selbst mal anschauen, calender.module ab Zeile 184).
Daher würde ich dennoch den Weg gehen, die Theme-Funktion zu überschreiben.
Also in die template.php deines Themes und dort könnte man zum Beispiel folgendes eintragen:
<?php
function theme-name_calendar_stripe_stripe($node) {
if (empty($node->stripe) || (!count($node->stripe))) {
return;
}
$output = '';
if(is_array($node->stripe_label)){
foreach($node->stripe_label as $k => $stripe_label){
if(!empty($node->stripe[$k]) && !empty($stripe_label)) {
//hier führst du deine Abfrage durch
//z.B.:
$sql = 'Select status from {meine_tabelle} WHERE ID = %d;';
$wert = db_result(db_query($sql, $node->nid));
if ($wert == 'Störung')
{
$farbe = '#abcdef';
}
else
{
$farbe = '#fedcba';
}
$GLOBALS['calendar_stripes'][$stripe_label] = $farbe;
$output.= '<div style="background-color:'. $farbe .';color:'. $farbe .'" class="stripe" title="Key: '. $node->stripe_label[$k] .'"> </div>'."\n";
}
}
}
return $output;
}
?>
Das ist natürlich nur ein Beispiel. Du kannst genauso gut ein Modul schreiben und dort eine kleine Funktion implementieren, welche die SQL-Abfrage von oben ausführt und das entsprechende Argument bekommt. Dann entfällt in der theme-Funktion die ganze Abfrage und man kann dann "$farbe = meine_neue_funktion($node->nid);" machen, wäre vielleicht besser und das Modul wäre auch in 5 Minuten geschrieben.
Das wäre nur die Variante, die mir spontan einfällt, vielleicht findest du ja noch eine andere Möglichkeit, um die Streifen entsprechend einzufärben, die ich bisher übersehen habe :-)
Wow! Vielen Dank für den
am 15.07.2010 - 11:36 Uhr
Wow! Vielen Dank für den Code!