Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#1 2009-12-02 01:52:22

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

[de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Eigentlich meinte ich das Vorgehen verstanden zu haben, aber ich komme nicht mehr weiter …

Ich habe mir ein eMail-Formular in PHP erarbeitet, in welches wiederum eine Datei per include_once integriert wird. In einer reinen HTML-PHP-Umgebung funktionierte das bis jetzt mit mehreren Websites gut.

Ich hatte vor, dieses eigentlich funktionierende Formular in mein gegenwärtiges TxP-Projekt zu integrieren. Ich ging davon aus, dass ich sämtliche <?php durch <txp:php> und alle ?> durch </txp:php> ersetzen muss. Nachdem ich das getan hatte, legte ich für das PHP-Formular-Script und für die include-Datei einen Baustein an. Die erste Frustration ereignete sich, als ich den Baustein mit dem sich innerhalb der <txp:php>- und </txp:php>-Tags befindenen Kode gar nicht speichern konnte. Bei jedem Versuch, sei’s als article- oder misc-Typ, kam eine Fehlermeldung des Apache-Servers zurück: “Forbidden, You don’t have permission to access /textpattern/index.php on this server.” Dies obwohl ich sonst durchaus Zugang zu /textpattern/index.php habe.

Also versuchte ich das anders zu lösen. Statt den ersten Baustein per <txp:output_form form="anmeldung-script /> einzubinden, machte ich das so: <txp:php> include_once ("./anmeldung-script.inc.php"); </txp:php> und legte das ursprüngliche PHP-Formularscript im Wurzelverzeichnis ab, zusammen mit der andern Datei, welche darin eingebunden wird. Genau so wie ich das hatte, als es bei der ursprünglichen HTML-Umgebung noch funktionierte.

Es passierte nichts, das Formular erschien nicht auf der betreffenden Seite.

Also – dachte ich – musste ich vielleicht auch bei dieser Lösungsstrategie alle <?php durch <txp:php> und alle ?> durch </txp:php> ersetzen. Auch das brachte nichts.

Ich ersetzte include_once durch require_once. Dies produzierte folgende Fehlermeldung: “Fatal error: require_once() [function.require]: Failed opening required ‘/anmeldung-script.inc.php’ (include_path=’.’) in /home/www/webxxx/html/xxx/textpattern/publish/taghandlers.php(3127) : eval()’d code on line 1”, deren Sinn ich nicht verstehe.

Selbstverständlich habe ich in Erweiterte EinstellungenPHP-in Seiten erlauben” mit “Ja” markiert. Ebenso versuchte ich es zeitweise mit “Direkte PHP-Verwendung erlauben”. Ohne Ergebnis.

Da meine letzten Frage hier im Forum meine Denkfehler ans Licht brachten, nehme ich an, es könnte sich diesmal ebenso um ein Detail handeln, welches ich übersehe oder falsch überlege.

Weiss jemand Rat?

Last edited by GugUser (2009-12-03 01:07:46)

Offline

#2 2009-12-02 09:49:30

trenc
Plugin Author
From: ⛵️, currently Göteborg, SE
Registered: 2008-02-27
Posts: 574
Website GitHub

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Hm,

ich könnte mich vorstellen, dass der Pfad zum Script eventuell nicht korrekt ist.

<txp:php> include_once ("./anmeldung-script.inc.php"); </txp:php>

Leg das Script mal im /textpattern-Verzeichnis ab und probiere folgenden Aufruf:

<txp:php>include_once(txpath.'/anmeldung-script.inc.php');</txp:php>

Auf die Schnelle weiß ich jetzt nicht, ob die Konstante txpath hier schon bekannt ist: Einfach mal versuchen. Und Du solltest darauf achten, dass nach dem öffnenden <txp:php> sofort Dein Code folgt und kein Leeerzeichen oder Zeilenumbruch.

Die elegantere Variante wäre, das komplette Script als Plugin umzuschreiben. Dann übernimmt Textpattern das Inkludieren und Laden, je nach Plugin-Typ.

Last edited by trenc (2009-12-02 09:50:43)


Digital nomad, sailing the world on a sailboat: 32fthome.com

Offline

#3 2009-12-02 13:53:00

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

trenc

Schwupps, mit diesem Pfad ist das Formular auf einmal sichtbar. Noch funktioniert das Abschicken nicht … :-( Aber immerhin gibt’s jetzt eine Basis zum Experimentieren.

Danke für den Tipp, und falls du mehr über das Thema “PHP in TxP” weisst, dann wäre ich um weitere Ratschläge dankbar, z. B. wie das nun zu handhaben ist: <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

Wenn ich’s heraus finde, dann werde ich hier das Ergebnis bekannt geben.

Offline

#4 2009-12-02 15:28:01

trenc
Plugin Author
From: ⛵️, currently Göteborg, SE
Registered: 2008-02-27
Posts: 574
Website GitHub

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

<?php echo $_SERVER['PHP_SELF']; ?>

PHP_SELF liest die aktuelle Position Script aus. welches bei Textpattern immer die index.php ist. Für Deine Zwecke solltest Du die aktuelle URL auslesen bzw. erzeugen in an das action-Attribut des Formulars übergeben.

Last edited by trenc (2009-12-02 15:38:14)


Digital nomad, sailing the world on a sailboat: 32fthome.com

Offline

#5 2009-12-02 15:37:24

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Ich war grad am Schreiben als dein neuer Beitrag kam …

Meine Erfolgsmeldung kommt gleich … ;-)

Offline

#6 2009-12-02 15:39:07

trenc
Plugin Author
From: ⛵️, currently Göteborg, SE
Registered: 2008-02-27
Posts: 574
Website GitHub

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Ah, ok. Ich habe den Eintrag für die Verständlichkeit etwas abgeändert. Nicht wundern!


Digital nomad, sailing the world on a sailboat: 32fthome.com

Offline

#7 2009-12-02 15:57:22

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

trenc

Es hat sich auf jeden Fall um ein Problem mit dem Pfad gehandelt.

Mein zweiter Versuch war auch mit <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">. Das funktionierte scheinbar. Wurde das Formular aber fehlerhaft ausgefüllt und erneut geladen, dann stand danach im Quelltext <form action="/index.php" method="post"> (keine Ahnung warum) und ein erneuter Sendeversuch war nicht mehr möglich.

Unterdessen habe ich eine funktionierende Lösung auf der Basis deines früheren Vorschlages: <form action="<?php echo $_SERVER["txpath.'/eigene/anmeldung-script.inc.php"]; ?>" method="post">. Diese Lösung ist gut, weil der Pfad im Quelltext nicht angezeigt wird, <form action="" method="post">. Und es funktioniert (bis jetzt …).

Noch wird auf Herz und Nieren geprüft.

Offline

#8 2009-12-03 01:07:16

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Die oben beschriebene Art ein PHP-Script einzubinden ist ideal. Alles steht zwischen einem Paar TxP-Tags <txp:php> … </txp:php>, der Rest des Kodes bleibt in reinem PHP. Bei der Lektüre dieser Beschreibung hatte ich Schlimmes befürchtet.

Offline

#9 2009-12-03 10:30:57

trenc
Plugin Author
From: ⛵️, currently Göteborg, SE
Registered: 2008-02-27
Posts: 574
Website GitHub

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

Auch wenn das funktioniert, aber das:

 <form action="<?php echo $_SERVER["txpath.'/eigene/anmeldung-script.inc.php"]; ?>" method="post">

solltest Du in keinem Fall machen. Hier rufst Du ein Element des $_SERVER-Arrays auf, was es nicht gibt. Deswegen wird auch in der Ausgabe nichts angezeigt. Wenn Du Dein Textpattern auf Debug oder Test stellst, sollte das auch eine entsprechende Fehlermeldung auswerfen. Sowas wie »undefinied variable at line ….«

Du kannst natürlich das action-Attribut auch komplett leer lassen, das hätte den selben Effekt. Aber Du kannst Dich nicht darauf verlassen, dass bei einem leeren action-Attribut jeder Browser aktuelle Seite wieder aufruft.

Da ich nicht weiß, in welchem Kontext Du das Script verwendest (Artikel, Sektion, Kategorie), nimm zu Einfachheit folgende Funktion. Diese liest die aktuelle URI aus gibt diese zurück.

<?php
	function own_action_url()
	{
		if (serverSet('REQUEST_URI') and serverSet('HTTP_HOST'))
		{
			return PROTOCOL.serverSet('HTTP_HOST').serverSet('REQUEST_URI');
		}
		return '';
	}
?>

Und im Formular rufst Du die Funktion einfach auf:

<form action="<?php echo own_action_url(); ?>" method="post">

Vielliecht solltest Du Dir im Textbook die Sachen für die Plugins anschauen. Es macht mehr Sinn Dein komplettes Script als Plugin einzubinden.

Last edited by trenc (2009-12-03 10:32:01)


Digital nomad, sailing the world on a sailboat: 32fthome.com

Offline

#10 2009-12-03 13:37:04

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] [erledigt] PHP-Kode in Seitenvorlage oder Baustein integrieren

trenc

Ich bin am Lernen von PHP und argumentiere im Folgenden nicht als PHP-Experte, sondern als einer der sich Schritt für Schritt in Lösungen vorarbeitet.

Mein erstes Mail-Formular machte ich vor etwa zwei Jahren und hatte, genau wie du meinst <form action="($_SERVER['SCRIPT_NAME'])" method="post">. Jenes Script von damals war allerdings das aufrufende Script (und das, welches die Nachricht verschickte).

Jetzt ist das teilweise anders, mit ($_SERVER['SCRIPT_NAME']) funktioniert das nicht mehr vollständig.

Du hast recht, mit meiner Lösung kommen unter debug Fehlermeldungen, das heisst, meine innere Freude über meine vermeintliche Lösung ist getrübt. Ich hatte es vorher unterlassen, das mit debug zu prüfen.

Ich muss also weiter daran arbeiten. Ich erkläre dir den Zusammenhang, wie das Formular erscheint. Es ist wird per include in einem Baustein einem beliebigen Artikel angefügt und dabei mit Daten aus drei benutzerdefinierten Feldern ergänzt.

Das ist der aufrufende Baustein, Teil einer Seitenvorlage:

<txp:if_article_list>
<txp:upm_textile><h3><txp:title /> <a href='<txp:permlink />'>Anmeldung und Details</a></h3></txp:upm_textile>
<txp:else />
<txp:upm_textile><h1><txp:title /></h1></txp:upm_textile>
<txp:php>if(isset($_POST['senden'])) {
echo "<p><a href=\"".permlink(array())."\">Kursdaten</a></p>\r\n";
include_once(txpath.'/eigene/anmeldung-script.inc.php');
} else {
echo "<p><a href=\"#kursanmeldung\">Anmelden</a> | <a href=\"/".section(array())."\">Kursbeschreibung</a></p>\r\n";
echo body(array());
echo output_form(array('form' => 'text-kursdaten'));
include_once(txpath.'/eigene/anmeldung-script.inc.php');
}</txp:php>
</txp:if_article_list>

Durch das Script werden dann Daten aus dem aktuellen Artikel in die Nachricht (eine Kursanmeldung) übernommen:

$kursname = strtr(title(array()), array('_' => ''));
$kursort = custom_field(array('name' => 'Ort'));
$kurspreis = custom_field(array('name' => 'Preis'));

Wenn das Formular abgeschickt wird, dann muss es (ist im Sinne eines Affenformulars aufgebaut), um eine Bestätigung oder eine Fehlermeldung auszugeben einerseits wieder die aktuelle Adresse der Seite aufrufen (Sektion/Artikel), aber auch erneut sich selbst.

Kategorien gibt’s auf der Website (bis jetzt) keine, der Aufruf einer Seite erfolgt immer nach dem Schema Sektion und Artikel.

Das mit den Plug-Ins werde ich wohl irgendeinmal angehen müssen. Jetzt ist es Priorität, die Website fertig zu machen (der Termin dazu ist überschritten). Ich hatte es mir vorher einfacher vorgestellt, wie ich das eigentlich funktionierende Script, das im Projekt ein Baustein war (nicht im Sinne von TxP), in TxP einbauen kann.

Meine Vorstellung war, ich hätte <txp:php> … </txp:php> gewissermassen als Rahmen, in dem ich mit PHP isoliert arbeiten könnte. Wäre nicht die Fehlermeldung mit debug, ich würde es sogar überzeugt glauben.

Und doch, mit deinem Script für den Aufruf der URL klappt es nun, sogar ohne Fehlermeldung in debug. In “action” steht danach die URL des Artikels *, und trotzdem funktionieren weitere Aktionen mit meinem Script, sei’s Senden oder Ausgaben von Fehlermeldungen (nicht ausgefüllte Felder).

* Also kein Hinweis darauf, wo das Script liegt!

Ich danke dir, auch dein zweiter Vorschlag war sehr hilfreich.

Last edited by GugUser (2009-12-03 14:42:15)

Offline

Board footer

Powered by FluxBB