Hintergrundbild durch Variable verändern

Harry Fan8

Mitglied
Hallo zusammen,

ich möchte das man von einer beliebigen Datei, eine Variable definiert, auf eine andere Datei zugreift. Auf der Datei, auf die zugegriffen wird, soll dann die definierte Variable mit im Code ausgegeben werden, nicht im Browser.

Bislang sieht mein Code so aus:
indexc.php:
PHP:
require("navigation.html"); // Es wird auf die Datei navigation.html zugegriffen

$des = new make_design(); // Neues Objekt der Klasse make_design(); wird erstellt

$des->design = "backc.png"; 
// Variable bekommt einen Wert für das Hintergrundbild zugeordnet
$des->sende_design(); // Funktion wird aufgerufen

navigation.html:
PHP:
body {
background-image:url(my/data/<?php class make_design { var $design; function sende_design() { echo print_r("$this->design", true); } } ?>);
background-repeat:no-repeat;
		}

Bis jetzt ist es so, dass der Wert nur im Browser ausgegeben wird, und nicht im HTML-Code weiterverarbeitet wird. Das möchte ich aber verhindern, er soll eigentlich die Variable im Code weiterverarbeiten und anschließend das Hintergrundbild im Browser ausgeben.

Ich habe es bereits schon mit mehreren Varianten ausprobiert, aber keine hat bislang funktioniert. Mit Cookies hab ich es auch schon probiert, es hat zwar dann funktioniert, aber Cookies möchte ich hierfür nicht unbedingt anwenden.

Ich hoffe ihr könnt mir irgendwie helfen,

ich bin für jegliche Hilfe dankbar.
 
Hallo Harry,

die Klassendefinition hat an der Stelle in der navigation.html doch nichts verloren?!
An der Stelle sollte nur die sende_design-Funktion aufgerufen werden!
Und der Include muss dann auch _nach_ der Objektinstanz erfolgen.

Du hast da irgendwie einen Denkfehler in der Ausführungsreihenfolge :)

MfG
 
Mensch, ich raffe das einfach nicht. :(
Ich versteh einfach nicht, warum das nicht klappen möchte...

indexc.php:
PHP:
require_once("config.php");
require("navigation.html");
//require_once("design.php");
	
//$design = "backc.png";
$main = new main();

$main->design = "backc.png";

config.php:
PHP:
class main
{
	var $design;

	function sende_design() { 
		echo print_r("$this->design", true); 
	}	
}

navigation.php:
PHP:
body {
		background-image:url(my/data/<?php require_once("config.php"); $des = new main(); $des->sende_design(); ?>);
		background-repeat:no-repeat;
	}

Ich verstehe einfach nicht, was ich falsch mache. :( Ich bitte um Rat...
 
Zuletzt bearbeitet:
Ist nicht so wirklich hübsch, aber zum Rumbasteln:

config.php

PHP:
<?php

class main
{
    public $design;

    public function sende_design() {
        echo $this->design;
    }
}

navigation.php

PHP:
body {
        background-image:url(my/data/<?php $main->sende_design(); ?>);
        background-repeat:no-repeat;
    }

indexc.php

PHP:
<?php

require_once __DIR__ . "/config.php";

$main = new main();

$main->design = "backc.png";

require __DIR__ . "/navigation.php";

Ausgabe

Code:
body {
        background-image:url(my/data/backc.png);
        background-repeat:no-repeat;
    }
 
Vielen lieben Dank, es funktioniert nun! :)
Mensch, dieser Fehler hat mich echt nerven gekostet. Vorallem dann, wenn eigentlich alles richtig definiert wurden ist, aber nicht versteht, wo der Fehler im Code sein soll. Nur durch das ständige zu frühe zugreifen auf "navigation.html", hat dafür gesorgt, dass das ganze nicht funktionieren wollte. So kleine Fehler machen echt schon einiges aus. Mir war selbst auch nicht bewusst, dass man require(); an beliebiger Stelle platzieren kann. Ich dachte das wäre nur am Anfang des Codes möglich (wie es z.B. bei der Funktion setcookie(); der Fall ist).

LG Harry
 
Die Include-Befehle (include, include_once, require, require_once) können verschiedene inhaltliche Anforderungen erfüllen. Das ist unter anderem das Einbinden von Library-Code (Dateien mit Klassen- oder Funktionsdefinitionen). Diese Includes erfolgen nach Möglichkeit „ganz oben“, wenn du nicht etwa Autoloading nutzt. Außerdem kann per Include Template-Code eingebunden werden. Das passiert gemeinhin an der Stelle, an der die Template-Ausgabe erzeugt wird. Das ist nicht am Dateibeginn, da ja in der Regel erst mal entsprechende Werte (und auch das richtige Template selbst) ermittelt werden müssen, die im Template ausgegeben werden sollen. Siehe dazu auch EVA-Prinzip.

- http://php-de.github.io/jumpto/eva-prinzip/
- http://phpforum.de/forum/showthread.php?t=221678
- …

Bei den zwei Anforderungen, die Includes erfüllen können, ist gedanklich sicher wichtig, dass PHP einerseits die Sprache ist, in der deine Anwendungslogik geschrieben ist, und andererseits auch die Sprache sein kann, in der einfacher Logikcode für Templates (Bedingungen, Schleifen, …) geschrieben wird. Wenn du dir Projekte wie Smarty oder Twig ansiehst, wirst du sehen, dass die eigene Syntax für Logikcode in Templates mitbringen. Das macht die Trennung offensichtlicher, weil PHP dann nur noch zur Programmierung der „echten“ Anwendung genutzt wird und nicht mehr für die Mini-Logik, die lediglich zur Generierung der Ausgaben benötigt wird.

- http://www.smarty.net/
- http://twig.sensiolabs.org/
- …

Ich dachte das wäre nur am Anfang des Codes möglich (wie es z.B. bei der Funktion setcookie(); der Fall ist).

Dabei ist auch das EVA-Prinzip interessant. Du kannst eine Funktion wie setcookie solange verwenden, bis du Ausgaben an den Client schickst (etwa per print/echo oder HTML-Blöcke in „Template“-Includes, wenn nicht gebuffert wird).

Das liegt einfach daran, dass setcookie die Header-Daten der generierten HTTP-Response verändert. Diese Header-Daten müssen aber logischerweise beim Client landen, bevor der HTTP-Body (also der eigentliche Inhalt) beginnt. Deshalb werden die Header automatisch weggeschickt, sobald du eine Ausgabe erzeugst. Und wenn die weg sind, kannst du sie nicht mehr per header oder setcookie verändern. Alle nötigen Werte müssen also davor passend gesetzt werden. Das entspricht gedanklich wiederum dem EVA-Prinzip.

Anschaulich gesagt: Du kannst nicht heute einen Brief (HTTP-Body) mit unbeschriftetem Umschlag in den Postkasten werfen und morgen einen Zettel mit Empfängeradresse und Briefmarke (HTTP-Header) hinterher.
 
Zuletzt bearbeitet:
Zurück