Zufallsbild im Header

Hallo :slight_smile:

Den ganzen Tag probiere ich nun schon herum ein Zufallsbild neben dem Firmenlogo erscheinen zu lassen bzw. ein zufälliges Firmenlogo erscheinen zu lassen.

Alternativ wäre auch ein zufälliger Hintergrund des boxheader, via oxid.css denkbar.

Bis her leider alles ohne Erfolg.

Was würdet ihr mir raten?

Hallo Mr. M,
was meinst du mit “Zufallsbild”?

Für den Headerbereich neben der Logo solltest du in CSS bei mir die zeile 156 bearbeiten:

/* + layout - header */
#header div.bar .fixed {
min-width:184px;
float:left;
}
div.bar.oxid {
background-color: #ffaa2d;
background-attachment: scroll;
background-image: url(…/img/Zufallsbild.jpg;
background-repeat: no-repeat;
background-position: center top;

Gruß
Rafig

Könntest es mit einem Modul versuchen. Oder dann ein Stückchen PHP-Code direkt das Headertemplate setzen. Erstelle einen Array mit den verschiedenen Bilderpfaden und wähle dann jeweils einen per Zufallszahl aus. Ein bisschen programmieren musst du dazu jedoch können. Und Variante 2 wird mit dem PHP-Code direkt in Smarty wird bei vielen nicht so gerne gesehen und als “unschön” bezeichnet.

[QUOTE=roland76;12579]Und Variante 2 wird mit dem PHP-Code direkt in Smarty wird bei vielen nicht so gerne gesehen und als “unschön” bezeichnet.[/QUOTE]
Immer diese Dogmatiker… :smiley:

Schlimmer als die katholische Kirche.

Was soll daran schlecht sein?

Dieses Vorgehen hat den großen Vorteil, dass man sich damit unabhängig von der Update-Problematik macht (sofern man nicht das “basic”-Template verwendet), und viele (auch komplexe Dinge) sehr einfach und schnell lösen kann.

Sieht man am diskutierten Beispiel sehr schön: das über Module zu lösen ist schon eine echte Herausforderung, weil man erst mal OXID richtig gut verstehen muss. Die von roland76 skizzierte Lösung lässt sich dagegen im Template sehr einfach umsetzen.

Bei xtc/Gambio z.B. war dieses Vorgehen reine “Notwehr”, weil es dort keinen “Plugin”-Mechanismus gibt, um Funktionen hinzuzufügen oder zu überladen.

Damit ist es mir aber gelungen, von ca. 90 Erweiterungen, die ich im Laufe der Zeit entwickelt habe, 95% ohne jeglichen Eingriff in den Shop-Code aus dem Template heraus zu aktivieren.
(Was für Entwickler wie mich bedeutet, dass ich [B]nicht [/B]in jedem Kundensystem anfangen muss, die Erweiterung händisch einzubauen, sondern das durch Kopieren notwendiger PHP-Codes erledigen kann.)

Aber auch bei OXID erspare ich mir da oft einige Klimmzüge, und muss nicht extra ein Modul entwickeln und einbinden, um eine Kleinigkeit zu ändern/hinzuzufügen.

Natürlich packt man dann nicht den ganzen notwendigen PHP-Code in das Template, sondern ruft per “include” ein entsprechendes Modul auf…

Also frisch an’s Werk: “[{php}][{/php}]” in Smarty [B]ist [/B]Dein Freund!

Um das Ganze noch unauffälliger zu machen, kann man das auch als [B]Smarty-Plugin[/B] konzipieren, so dass man das dann z.B. im Template mit “{[zufallsbild]}” aufrufen könnte (was allerdings wesentlich mehr Smarty-Overhead erzeugt, als das simple “[{php}]”).

Diese Technik wird in OXID auch schon öfter verwendet, z.B. um den Code für die Menüsteuerung einzubinden.

Es beschleicht mich das Gefühl das die Smartyfunktion nicht installiert ist…
(habe den Shop nicht installiert)

Denn irgendwie funktioniert gar nichts mehr wenn ich mit PHP anfange.

…mysteriös…

Smartyfunktion nicht installiert? Meinst du das Einbinden von PHP-Code?

Hier kannst du lesen wie es funktioniert.

[{php}]

   //read folder

$folder=opendir("/randompics");
while ($file = readdir($folder))
$names[count($names)] = $file;
closedir($folder);
//sort file names in array
sort($names);
//remove any non-images from array
$tempvar=0;
for ($i=0;$names[$i];$i++){
$ext=strtolower(substr($names[$i],-4));
if ($ext==".jpg"||$ext==".gif"||$ext==“jpeg”||$ext==".png"){$names1[$tempvar]=$names[$i];$tempvar++;}
}
//random
srand ((double) microtime() * 10000000);
$rand_keys = array_rand ($names1, 2);
//random image from array
$slika=$names1[$rand_keys[0]];
//image dimensions
$dimensions = GetImageSize($slika);
if (isset($HTTP_GET_VARS[“pic”])){header (“Location: $slika”);}
else {echo “<img src=”$slika" $dimensions[3]>";}

[{/php}]

Das ist der einzige Code, bei dem der Shop nicht weiß bleibt, sondern nur ein “Falsche Bild URL” angezeigt wird. Der Ordner mit den Zufallsbilder heißt “randompics” und liegt genau wie der inc_header im templates ordner. Die Bilder sind durchnummeriert mit Bild_1.jpg, Bild_2.jpg etc…

Es sieht auch im Dreamweaver nicht wirklich so aus als würde das PHP erkennen, das Schrift schwarz ist. In der Regel ist die Schrift ja blau.

Bei allen anderen PHP-Codes kommt wie gesagt nur ein weiße leere Seite anstelle des Shops.

Ich dachte immer dieses Smarty-Geschichte muss man installieren?

Lass mal die [] bei {php} und {/php} weg. Oder probiert folgenden Code…

{php}
echo "Testmeldung"; 
{/php}

Dies müsste dann “Testmeldung” im Shop auf der entsprechenden Seite ausgeben.

Also die “[ und ]” müssen schon sein, sonst gibt er mir den kompletten PHP-Tag als Text aus.

Die Testmeldung funktioniert.

GUT!
Wir sind um eine Erfahrung reicher.

Ich hab mit Programmierung nicht viel am Hut, daher glaube ich dass ich den Code bzw die Variablen nicht komplett angepasst habe.

[QUOTE=Mr. M;12645]Ich dachte immer dieses Smarty-Geschichte muss man installieren?[/QUOTE]Das erledigt die OXID-Installation gleich mit…

[QUOTE=Mr. M;12645]Es sieht auch im Dreamweaver nicht wirklich so aus als würde das PHP erkennen, das Schrift schwarz ist. In der Regel ist die Schrift ja blau.[/QUOTE]
Das erkennt PHP tatsächlich nicht, ist auch gar nicht seine Aufgabe,

PHP dient letztendlich nur dazu, HTML-Code zu erstellen…

[QUOTE=Mr. M;12645]Bei allen anderen PHP-Codes kommt wie gesagt nur ein weiße leere Seite anstelle des Shops.[/QUOTE]
Sicher nicht bei allen, sondern nur bei falschen…

Aber Dein Ansatz ist ja schon mal gar nicht schlecht, nur ein wenig falsch…


[{php}]
//read folder
$folder=opendir("/randompics");
while ($file = readdir($folder))
$names[count($names)] = $file;
closedir($folder);
//sort file names in array
sort($names);
//remove any non-images from array
$tempvar=0;
for ($i=0;$names[$i];$i++){
$ext=strtolower(substr($names[$i],-4));
if ($ext==".jpg"||$ext==".gif"||$ext=="jpeg"||$ext==".png"){$names1[$tempvar]=$names[$i];$tempvar++;}
}
//random
srand ((double) microtime() * 10000000);
$rand_keys = array_rand ($names1, 2);
//random image from array
$slika=$names1[$rand_keys[0]];
//image dimensions
$dimensions = GetImageSize($slika);
if (isset($HTTP_GET_VARS["pic"])){header ("Location: $slika");}
else {echo "<img src=\"$slika\" $dimensions[3]>";}

[{/php}]

[QUOTE=Mr. M;12645]Das ist der einzige Code, bei dem der Shop nicht weiß bleibt, sondern nur ein “Falsche Bild URL” angezeigt wird. Der Ordner mit den Zufallsbilder heißt “randompics” und liegt genau wie der inc_header im templates ordner. Die Bilder sind durchnummeriert mit Bild_1.jpg, Bild_2.jpg etc…[/QUOTE]

Natürlich bekommst Du so die Meldung “Falsche Bild URL”, weil Du ja nur “Bild_x.jpg” (bzw. eher sogar einen Leerstring) übergibst. Du musst aber den [B]kompletten Pfad zum Bild[/B] bereit stellen…

Und Du musst auch das [B]richtige [/B]Bildverzeichnis durchsuchen… (Im Moment wird Verzeichnis “randompics” in der Shop-Root durchsucht!)

Außerdem solltest Du das Bild [B]nicht [/B]mit “echo” direkt ausgeben, sondern es in eine Smarty-Variable ("[B]random_pic[/B]") speichern, die Du dann an der Stelle mit [{$random_pic}] aufrufst, wo das Bild hin soll.

Den PHP-Code kannst Du dann [B]irgendwo(!) [/B]im Template (z.B. in der “_header.tpl”) einbinden, was die Übersichtlichkeit deutlich erhöht…

Versuch’s mal so (ungetestet):

[{php}]
$myConfig = oxConfig::getInstance();
//Bilder liegen in "out/template/tpl/randompics"!?
$img_path=$myConfig->getTemplateUrl().'randompics/';
$img_folder=$myConfig->getTemplateDir().'randompics/';
//read folder
$legal_exts=".jpg.gif.jpeg.png";
$names=array();
$folder=opendir($img_folder);
while ($file = readdir($folder))
{
    if ($file[0] <> '.')    //Ignore "files" "." and ".."
    {
        $ext=strtolower(substr($file,-4));
        if (strpos($legal_exts,$ext)!==false)
        {
            $names[] = $file;
        }
    }
}
closedir($folder);
//random
srand ((double) microtime() * 10000000);
$rand_keys = array_rand ($names1, 2);
//random image from array
$slika=$names[$rand_keys[0]];
//image dimensions
$dimensions = GetImageSize($img_folder.$slika);
$slika=$img_path.$slika;
if (isset($_GET["pic"]))
{
    header ("Location: $slika");
}
else 
{
    $this->_tpl_vars['random_pic']="<img src=\"$slika\" $dimensions[3]>";
}
[{/php}]

Vielen Dank für die Unterstützung.

Allerdings bekomme ich mit deinem Code auch nur eine weiße Seite.
Ich verstehe nicht warum. Soll er mir doch irgendeinen Syntaxfehler mit Zeilenangabe um die Ohren hauen, aber nicht gleich den ganzen Shop lahm legen. :confused:

Ich hab den Code in die inc_header geschmissen, wenns da mal richtig anzeigt wird, kanns mir noch umbasteln, aber das ist wohl noch ein weiter weg. :rolleyes:

[QUOTE=Mr. M;12655]Vielen Dank für die Unterstützung.

Allerdings bekomme ich mit deinem Code auch nur eine weiße Seite.
Ich verstehe nicht warum. Soll er mir doch irgendeinen Syntaxfehler mit Zeilenangabe um die Ohren hauen, aber nicht gleich den ganzen Shop lahm legen. :confused:

Ich hab den Code in die inc_header geschmissen, wenns da mal richtig anzeigt wird, kanns mir noch umbasteln, aber das ist wohl noch ein weiter weg. :rolleyes:[/QUOTE]
Ohne Debugger wird man solche Dinge schwerlich in den Griff bekommen.

http://www.filetransit.com/view.php?id=19278

Das scheint ein guter Freeware PHP Debugger zu sein.

ich hätte noch eine ganz andere Alternative, die bei uns zumindest funktioniert: Ein kleines Perl-Skript, dass für die Zufallsbilder da ist.
(Das wählt bei uns für die verschiedenen Comic-Strips am Seitenkopf aus)

Im Template wird das Skript einfach anstelle eines Bildes eingebunden (also z. B. <img src=“pfadangabe/skriptname.pl”> oder wie bei uns als backgroundimage im styletag)

Im Skript wird dann ein Ordner definiert, in dem die Bilder liegen (Zeile 8, bei uns “…/strips/”)

Fragt mich nur bitte nicht nach Details, was das Skript wie tut. Ich selbst hab keine Ahnung von Perl. Das Skript hatte mir mein Mitbewohner geschrieben.
Es sorgt zumindest auch dafür, dass bei jedem Seitenwechsel ein neues Bild geladen wird. Wenn das nicht gewünscht ist und nur einmal ein Bild beim ersten Aufruf des Shops aufgerufen werden soll, geht das auch (so wars vor einer Anpassung des Skripts -da müsste ich dann noch mal fragen, was die Änderung war)

Hier das Pearl-Skript:


#!/usr/bin/perl -w

use CGI::Carp qw(fatalsToBrowser);

use integer;
use strict;

my $local_path = "../strips/";		# image directory relative to currend dir

chdir $local_path;

$| = 1;

srand(time ^ $$);

my @files = glob("*");
my $file  = $files[rand(@files)];

my %type = (
	jpg => 'image/jpeg',
	gif => 'image/gif',
	png => 'image/png',
);

my $default_type = $type{jpg};

if ($ENV{QUERY_STRING}) {
	open FH, $file or die "$file: $!
";
	binmode FH;

	$file =~ /.(\w+)$/;

	print
		'Content-Type: ', $type{$1} || $default_type, "
",
		'Content-Length: ', -s($file), "
",
	###	'Last-Modified: ', `date`,
		"
";

	while (<FH>) { print }
	exit 0;
}

print
	"Status: 302
",
	'Location: ', $local_path, $file, "
",
	"
";

Ok, ich hab jetzt doch noch n bisschen mit meiner zu erst genannten Methode rumgespielt.
Ein Bild wird noch nicht angezeigt, aber zufalls Funktion funktioniert und die Bildnamen stimmen auch.

Ich hab die Ordneradresse abgeändert auf
$folder=opendir(“out/oxbaseshop/html/0/templates/randompics”);
scheint ja auch zu passen, da er sich ja auch brav die Bildnamen zieht.

Nur die Übergabe funktioniert nicht richtig. (Wie avenger ja bereits richtig erkannt hat)
Lass ich mir die Url vom fehlgeschlagenen Bild anzeigen, sagt er das Bild läge im root.
(Wie avenger ja bereits richtig erkannt hat)

Ändere ich die Ausgabe von
else {echo “<img src=”$slika" $dimensions[3]>";}
in
else {echo “<img src=“out/oxbaseshop/html/0/templates/randompics/$slika” $dimensions[3]>”;}

frägt er mich nach Benutzername und Passwort.

Mhhhh, liegt wohl drann das der templates ordner geschützt ist…

Was passiert wohl wenn ich randompic in den images-ornder verschiebe und die Adressen anpasse?

OH MEIN GOTT.
Es funktioniert!

:smiley:

Vielen vielen Dank für die Unterstützung!

[QUOTE=Mr. M;12665]"out/oxbaseshop/html/0/templates/[/QUOTE]
Das ist aber kein OXID 4 Verzeichnis!?

Verwendest Du nicht OXID 4???

Da bin ich ehrlich gesagt etwas übrfragt, da ich wie gesagt den Shop nicht aufgezogen habe. Sondern nur a bissl Kosmetik betreibe und Artikel einstelle.

Wenn du aber sagst es sei kein ox4 Verzeichnis, wird das wohl so stimmen.

Vielleicht ox3?