Datei in Theme.php includen.... Datei in Theme.php includen....
 

News:

cpg1.5.48 Security release - upgrade mandatory!
The Coppermine development team is releasing a security update for Coppermine in order to counter a recently discovered vulnerability. It is important that all users who run version cpg1.5.46 or older update to this latest version as soon as possible.
[more]

Main Menu

Datei in Theme.php includen....

Started by SarDuri, August 28, 2008, 02:36:26 PM

Previous topic - Next topic

0 Members and 2 Guests are viewing this topic.

SarDuri

Hallo Forum.
Ich stehe mal wieder an.
Seit tagen versuche ich zwei phpskripts in die theme.php zu includen.
habe das nun via inlude(); eval(); mit get_file_content() versucht, die Skripte direkt zu importieren, oder sie via string ins theme.php zu schleuse.
Wie es scheint bin ich nicht in der Lage, dies zu bewerkstelligen. Ich wäre froh, wenn mir jemand auf die Sprünge helfen könnte.
Konkret möchte ich damit ein Sessionhandling importieren, dass je nach Sessionvariablen ein zusätzliches Menu in der richtigen Sprache einbindet.
Danke für Input
Saluti
Duri

Αndré

Was kommt denn als Fehlermeldung? Kommt überhaupt eine Fehlermeldung?
Wieso schreibst du den Code nicht gleich direkt in die theme.php (z.B. in pageheader(), setzt dort einen neuen Platzhalter à la {MENU_EXTRA} und bindest dieses dann an der richtigen Stelle ein)?

SarDuri

Es kommt gar keine Fehlermeldung. Das skript wird ausgeführt, meine Include Anweisungen werden ignoriert.
Da die beiden Skripts über die ganze Webseite hinweg dynamisch eingebunden sind, wäre es angenehm, wenn dies auch in der Kupfermiene so laufen tät. Bis jetzt habe ich solches sogar als statisches HTML in die Template.htm geschrieben. Es ist halt nur so, wenn es änderungen gibt, muss ich das mit dieser Methode immer zusätzlich in der Coppermine machen. Ich hoffe halt immer noch, dass ich irgend wann einmal z.B. einen Menupunkt an einer einzigen Stelle ergänzen muss, und das dann für die ganze Seite gilt.
In diesem Fall werde ich halt wieder meine Bastellösung anwenden.... Danke

Αndré

Ich kann mir nicht vorstellen, dass deine Anweisung ignoriert wird. Benutze anstatt include() require(). Spätestens dann wird eine Fehlermeldung auftauchen, wenn Coppermine dein Script nicht einbinden kann.
Gibt dein Script etwas aus, oder setzt es nur bestimmte Variablen, die du später weiter verarbeiten möchtest?
Ich kann mir das Ganze noch nicht so richtig vorstellen (also an welcher Stelle dein "Menüpunkt" erscheint und wie komplex es somit ist). Ein Link zu deiner Galerie und deiner gesamten Site inklusive einem kleinen Hinweis, um welchen Punkt es sich handelt, wäre für mich hilfreich.

Αndré

Handelt es sich um den Block "Durchsuche meine Seite" auf foto.zisler.net?

SarDuri

Danke. Nein. So wie da möchte ich es eben nicht mehr lösen.
Es handelt sich um die Seite http://cormixt.ch/fotos/
ich möchte das die menu.php von der art:
switch ($_SESSION['lang']{
case D:
[Codeblock]
case R:
[Codeblock]
}

einfügen
sowie eine selectLang.php mit Inhalt von der Art:
session_start();


if ($_GET['lang'] != "")
{

$_SESSION['lang'] = $_GET['lang'];
}

if ($_SESSION['lang'] == "")
{
$_SESSION['lang'] = R;
}
   
offensichtlich wird wirklich nichts per include() oder require() eingebunden....
Das Ziel wäre ein oberhalb des CoppermineMenus das standartmenu für die Webseite einzubinden.

SarDuri


SarDuri

In Bezug auf require(): Auch diese Funktion erzeugt keinen Fehler. Es wird einfach gar nichts angezeigt, wenn ich require() oder require_once() verwende. Was ja irgendwie auch nicht sehr hilfreich erscheint.

Αndré

Erstmal solltest du schleunigst ein Update durchführen. Du benutzt noch Version 1.4.9, wobei 1.4.19 die neueste ist.

Der richtige Link zu deiner Galerie ist übrigens http://foto.cormixt.ch/


Ich habe gerade folgendes Testszenario in meinem CPG erstellt:

Eintrag in theme.php:
include("test1.php");

Inhalt test1.php:
<?php
include("test2.php");
print_r($_SESSION['lang'])
?>
;


Inhalt test2.php:
<?php
session_start
();
if (
$_GET['lang'] != "")
  
$_SESSION['lang'] = $_GET['lang'];
if (
$_SESSION['lang'] == "")
  
$_SESSION['lang'] = "-";
?>



Die Ausgabe funktioniert einwandfrei (zeigt mir also den Parameter lang an). Ich schätze, dass dein switch ($_SESSION['lang'])-Block nicht das macht, was du erwartest.



Quote from: SarDuri on August 28, 2008, 06:46:13 PM
In Bezug auf require(): Auch diese Funktion erzeugt keinen Fehler. Es wird einfach gar nichts angezeigt, wenn ich require() oder require_once() verwende. Was ja irgendwie auch nicht sehr hilfreich erscheint.
Das bedeutet, dass deine Dateien ordnungsgemäß eingebunden wurden und bekräftigt meine Vermutung.

SarDuri

Hmm.
Das ist interessant.Auf der restlichen Webseite funktioniert dieser Session-Block genau so, wie ich es mir vorstelle. Auch wenn ich den Block aus der Datei in die theme.php paste, passiert genau das, was gewollt war.
Zudem kann ich in meine theme.php auch testdateien mit einer "echo" Anweisung includen, und es wird nichts ausgegeben.
Wenn ich allerdings das einzubindende File direkt in demselben Verzeichnis wie die theme.php erstelle, dann tut es. Meine Files liegen allerdings in einem ganz anderen Ordner. Im Root der Webseite um päzise zu sein.
Hat es also eventuell etwas damit zu tun, dass diese Dateien sich ausserhalb des Coppermine Installationspfades befinden?
Merci vielmals.
Saluti
Duri

Αndré

Du musst halt den Pfad entsprechend anpassen. Wenn Coppermine z.B. in /cpg/ liegt, musst du deine Dateien, die in / liegen per
include("../test.php");
einbinden.

SarDuri

Herzlichen Dank für den Input. Dein Testlauf hat mich auf den Ticker gebracht!
Ich habe übersehen, dass die theme.php nicht an dem Ort ausgeführt wird, an dem Sie sich befindet. Deshalb habe ich den Dynamischen Pfad falsch gesetzt. (../../../) anstelle von (../). Aus irgend einem Grund funktioniert es hier anscheinend nicht, die URL anzugeben (was ich sonst bei inlude() schon öfters gemacht habe. Darum habe ich nicht entdeckt, dass DIES der Fehler war.
Die Kupfermine werde ich updaten, sobald ich mit der neuen Seite fertig bin.
Das wird wohl noch auf anderen seiten fällig sein...
So geht einem die Arbeit nie aus :-)
Danke eenemeenemuu!
schönen Abend
Duri

SarDuri

Aha. Die Profis merken sofort, wo der Hund begraben liegt! unsere Posts hatten sich überschnitten.

Joachim Müller

http-includes sind böse und fehlerträchtig (wie Du bemerkt hat). Auf der sicheren Seite bist Du mit absoluten Pfaden.

SarDuri

Quote from: Joachim Müller on August 29, 2008, 12:18:12 AM
http-includes sind böse und fehlerträchtig (wie Du bemerkt hat). Auf der sicheren Seite bist Du mit absoluten Pfaden.
[quote  autor=SarDuri]]Aus irgend einem Grund funktioniert es hier anscheinend nicht, die URL anzugeben (was ich sonst bei inlude() schon öfters gemacht habe.[/quote]
Das Problem mit der Fehlerträchtigkeit kenne ich inzwischen bestens. Aber eben: Mein, sagen wir, Standardwokaround hat aus irgend einem Grund nicht funktioniert. ;-)
Weil, vielleicht sind includes böse, sicher sind sie Fehlerträchig. Aber wenn sie laufen, können sie eine Menge Unterhaltungsarbeit sparen....

Joachim Müller

Includes per se sind nicht böse. Nur URI-includes! Also nicht so:<?php
include('http://deine_deite.tld/include-verzeichnis/include-name.php');
?>
(das ist ein URI-include), sondern mit absolutem Pfad<?php
include('/var/www/htdocs/public_html/include-verzeichnis/include-name.php');
?>
oder mit relativem Pfad<?php
include('../include-verzeichnis/include-name.php');
?>
Beim relativen Pfad triffst Du oft auf das Problem, das Du gar nicht weisst, von welcher Ebene im Verzeichnissystem Du includest. Daher sind absolute Pfadangaben die Methode der Wahl für Anfänger. Coppermine benutzt nicht absolute, sondern relative Pfadangaben, so dass wir uns der EInfachheit halber auf ein striktes Verzeichnis-System geeignet haben: alle includes befinden sich im gleichen Verzeichnis. Das passiert nicht ohne Grund: wir vermeiden damit solche Dinge, wie sie Dir widerfahren sind.

Zur Begründung, warum URI-includes böse sind: lies die Warnungen auf http://www.php.net/manual/de/function.include.php

SarDuri

 Das mit dem Serverpfad ist ein hervoragende Idee, die ich mir bestimmt merken werde.
Danke GauGau.

kann mir jetzt noch jemand sagen, wie ich diese <!-- BEGIN logout --><!-- End logout --> Kommentare hinpacken muss? Immer wenn ich das include() ausserhalb von <<<EOT....EOT;, aber innerhalb von $template_sys_menu =   verwende, (was ich ja da facto muss) meldet der Parser den Logout Fehler.....

Joachim Müller

Ohne zu wissen, was Du genau tun willst empfehle ich Dir:
1) wirf mal einen Blick auf die heredoc-Syntax in der php.net-Doku
2) Um eine Variable mit Inhalten aus einem include zu versehen, gehe so vor:<?php
$deine_variable 
= <<< EOT
<h1>Hallo Welt</h1>
<p>Ein Absatz</p>
EOT;
$deine_variable .= include('dein_include.inc.php');
$deine_variable .= <<< EOT
<h2>Weiter geht es mit dem Coppermine-Kram</h2>
<p>Bla</p>
EOT;

SarDuri

Die heredocsyntax habe ich mir schon gegönnt. Aber irgendwie entsteht dieser verflixte Fehler anders. Von der Art her habe ich den Code ziemlich genauso aufgebaut wie es GauGau aufschreibt.
wenn ich etwas im Stil
$template_sys_menu = <<<EOS
<div class="cpm">
{BUTTONS}
</div>
EOS;

schreibe, tut es.
Sobald ich den Code im Stil

$template_sys_menu = 

"<div class=\"cpm\">".
include ('../menu.php');
<<<EOS

{BUTTONS}

EOS;
"</div>";



modifiziere kommt permanent der logout Fehler.


Αndré

Quote from: SarDuri on September 01, 2008, 04:00:08 PM
Von der Art her habe ich den Code ziemlich genauso aufgebaut wie es GauGau aufschreibt.
Nicht wirklich.

<<<EOS

{BUTTONS}

EOS;
"</div>";

steht ohne jeglichen Bezug da.

Korrekt wäre:
$template_sys_menu .= <<<EOS

{BUTTONS}

EOS;
$template_sys_menu .= "</div>";



Aber das hat Joachim ja eigentlich schon geschrieben ;)