mod_functions

Diskussion zu nicht so umfangreichen Modulen und Start-Up für neue Module. Ansonsten bitte die speziellen Kategorien benutzen!
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Noch ne Funktion für mod_functions:

Code: Alles auswählen

function titellinkliste ($rubrikid)

// diese funktion gibt alle artikelüberschriften als linkliste aus z.B. für faq-rubriken
// parameter: sortierung der artikelüberschriften:
$sortierung = 'sort_id desc';                    // Artikelsortierung: manuell

$query = "SELECT rubric_id, verfallsdatum, templates_id, nr, idx, email, autor, pub_datum, titel, initial, freigabe, changer FROM " . CPO_NEWS . " WHERE " . ( $cpoSystem['release'] ? "artikel_archiv<2 AND freigabe=" . STATE_RELEASED : "artikel_archiv<1 AND freigabe!=" . STATE_BLOCKED ) . " AND pub_datum<='" . date('Y-m-d H:i:s', time()) . "' AND verfallsdatum>='".date('Y-m-d H:i:s', time())."' AND rubric_id='".$rubrikid."' ORDER BY ".$sortierung. " ";
$db = new DB;
$db->query($query);

// link-liste starten:
$linkliste .= '<ul>';

$i = 0;
while($db->next_record()) {

    $nr            = $db->v('nr');
    $titel         = $db->v('titel');

    if ($i == 0) $linkliste .= '';        // 1. Artikel rausfiltern ;-)
    else {
       $linkliste .= '<li><a href="index.php?rubric='. $rubrikid .'#' .$nr. '" titel="" target="_self">';
       $linkliste .= $titel .'</a></li>';
    }
    $i = $i + 1;
}
$linkliste .= '</ul>';
$linkliste .= '<p>Insgesamt ' . $i . ' Beiträge ';

return $linkliste;
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

fatale Folgen bei fehlerhaften Funktionen

Beitrag von hscha »

Hallo mod_functions-Benutzer,

ich habe am letzten Wochenende in Erfahrung gebracht, was passiert, wenn eine eingegebene Funktion einen Syntax-Fehler enthält:
Nix ging mehr! Selbst das Frontend wollte nicht mehr.
Einloggen ins Backend ging schon gar nicht...
Es half nur noch entweder per FTP das mod_functions-Verzeichnis zu löschen, damit die fehlerhafte Funktion nicht mehr ins System eingebunden wird oder direkt in der Datenbank die Funktion zu löschen.
Daher 2 Fragen an Markus:
1) kann man Syntax-Fehler an früherer Stelle abfangen?
2) kann man die Zugriffsrechte für den Gebrauch des Moduls personifizieren, damit wirklich nur noch SysAdmins mit php-Kenntnissen das Modul benutzen?
Eigentlich ist mod_functions wie ich finde genial. Man spart sich mod_inline - das auch keine Parameter übernimmt und kann alles im Backend regeln...
Ein bisschen mehr Sicherheit wäre schick 8)

Grüße aus Berlin von
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Du kannst Die Zeile

Code: Alles auswählen

	if ($_SESSION['SID_user']['admin']>=ROLE_SUPERUSER) {
in common-module.inc.php ändern zu

Code: Alles auswählen

	if ($_SESSION['SID_user']['admin']>=ROLE_ADMIN) {
dann kann nur noch der oberste Admin das Modul benutzen.

Eigentlich sollte da nichts blockiert werden, denn gerade das verwendete eval ist folgendermaßen definiert:
Falls im ausgewerteten Code ein Parse Error auftritt, gibt eval() FALSE zurück und der weitere Code wird normal ausgeführt.
Allerdings steht weiter unten
Im Fall eines schweren Fehlers im augewerteten Code wird das komplette Skript beendet.
Es sollte übrigens reichen die common-module.inc.php per FTP umzubenennen, damit alles wieder läuft (außer einer Meldung, daß das Modul nicht gefunden wird).
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Danke für deine Tipps, Markus.
Ich habe das eben nochmal durchgespielt:
- eine Funktion mit einem Syntax-Fehler (es fehlt ein abschließendes ";" in der return-zeile) wird gespeichert.
- Im Backend erscheinen php-Fehlermeldungen:

Code: Alles auswählen

Parse error: syntax error, unexpected '}' in /homepages/.../htdocs/.../cms/mod_functions/common-module.inc.php(159) : eval()'d code on line 28
- diese Fehlermeldung erscheint anschließend auch im Frontend
- dann fliege ich aus dem Backend raus. Beim nächsten Versuch, einzuloggen, erscheint die Meldung:

Code: Alles auswählen

Warning: Cannot modify header information - headers already sent by (output started at /homepages/.../htdocs/.../cms/mod_functions/common-module.inc.php(159) : eval()'d code:28) in /.../htdocs/.../cms/_include/member.inc.php on line 177
Es bleibt wirklich nur noch der Klick zum Starten des ftp-Programms.
Es ist auf jeden Fall wichtig, das zu wissen :lol:
Grüße von
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Fehlermeldungen sind doch was ganz anderes als "Nix ging mehr!".

Lösung:

In common-module.inc.php alle Vorkommen von eval durch ein @ davor ergänzen.

Sieht dann so aus:

Code: Alles auswählen

			@eval ( 'function '. $theSign.$functionKey.'($functionarguments) { foreach (functionpageparameters($functionarguments) AS $argkey=>$argvalue) $$argkey = $argvalue; '.$functionContent[$functionKey]. '} ' ) ;
			@eval ( 'function '. $functionKey.'('.$functionArgs[$functionKey].') { '.$functionContent[$functionKey]. '} ' ) ;
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Coole Lösung, Markus!
Die Fehlermeldung erscheint nur noch da, wo die fehlerhafte Funktion eingebaut ist!

Danke!
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,
ich möchte gern eine wahlweise verkürzte Ausgabe von Artikeltexten mit mod_functions realisieren.
Dazu habe ich folgende Funktion geschrieben:

Code: Alles auswählen

function textkuerzen ($text, $laenge){
if (empty ($laenge)) $laenge = 100;
if (empty ($text)) $text = 'kein Text vorhanden. Bitte überprüfen';

// string bedingt kürzen:
else {
	if (strlen ($text) >= $laenge) $fcstring = $text;
	else $fcstring = substr ($text, 0, $laenge) .'...'; 
}

return $fcstring;
}
Im Template steht:

Code: Alles auswählen

 [!-- function: textkuerzen; text=<!-- HTML: Teaser; strip_tags; -->; laenge=<!-- TEXT: textLaenge; -->; --]
Leider erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

{{{{ ERROR: unable to find replacement for the following placeholder (unknown type?): }}}[!-- function: textkuerzen; text= Traurig und zugleich ...; laenge=150; --]
(Text gekürzt)
Beim Parsen werden die Werte korrekt der Funktion übergeben. Trotzdem tritt die Fehlermeldung auf. Hast du eine Erklärung dafür?:idea:

Einen schönen Abend wünscht
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Ist das hier zufällig der Text?
Traurig und zugleich dankbar f&uuml;r sein segensreiches Wirken in unserer Gemeinde von 1982 bis 1995 nahmen wir am 21. Dezember in einer Gedenkfeier in der Wichernkirche Abschied von unserem langj&auml;hrigen Pfarrer Wolfgang Schallnas, der am Montag, dem 10. Dezember 2012 im Beisein seiner Frau und seiner Tochter nach langem Leiden im Alter von 79 Jahren in Bielefeld verstorben ist.
Dann solltest Du noch html_entity_decode verwenden, weil sonst ein paar Semikolon zuviel drin sind.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Habe es gerade mal live getestet.

Mit den überflüssigen Semikolon durch Semikolons hört der Text eben schon am Umlaut auf. Aber die Funktion funktioniert problemlos.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,
ich habe mal

Code: Alles auswählen

$text = html_entity_decode ($text) 
eingefügt. Leider kommt es auch bei einem Text ohne jeglichen Umlaut zu dieser Fehlermeldung:

Code: Alles auswählen

{{{{ ERROR: unable to find replacement for the following placeholder (unknown type?): }}}[!-- function: textkuerzen; text=Schuelerinnen und Schueler des Berggruen-Gymnasiums konzertieren in unserer Wichernkirche am Sonntag, 17. 03 2013, um 16 Uhr! Eintritt frei. Herzlich willkommen!; laenge=50; --]
Andere Frage: Kann man die Semikolons irgendwie ausmaskieren?

Grüße von
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

Das Problem hat mich jetzt etwas beschäftigt.

Leider gibt es keine Lösung, weil in Deinem Text die Semikolon nun mal vorkommen. Auch ein html_entity_decode in der Funktion bringt nichts, da der Text ja bereits vor dem Semikolon endet und somit auch keine Umwandlung mehr stattfinden kann.

Wie kommen die überhaupt bei Dir da rein?
Ich muß die erst mühsam umwandeln, damit sie so ausgegeben werden...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,
Wie kommen die überhaupt bei Dir da rein?
Ich muß die erst mühsam umwandeln, damit sie so ausgegeben werden...
Das kann am MCE-Editor liegen...

Grüße von
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

In meinen Augen sollte Dein >= ein <= sein.

Dann funst es bei mir (wenn keine ; drin sind) ganz prächtig.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 714
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 217 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,
In meinen Augen sollte Dein >= ein <= sein.
Natürlich :oops: !

Ansonsten funzt bei mir html_entity_decode nicht:
In der Funktion steht jetzt:

Code: Alles auswählen

if (empty ($laenge)) $laenge = 100;
if (empty ($text)) $text = 'kein Text vorhanden. Bitte überprüfen';

$text = html_entity_decode ($text); 

// string bedingt kürzen:
else {
	if (strlen ($text) <= $laenge) $fcstring = $text;
	else $fcstring = substr ($text, 0, $laenge) .'...'; 
}

return $fcstring;
Die Fehlermeldung ist:

Code: Alles auswählen

{{{{ ERROR: unable to find replacement for the following placeholder (unknown type?): }}}[!-- function: textkuerzen; text=Die n&auml;chste Andacht mit Ges&auml;ngen aus Taiz&eacute; in der Wichernkirche findet statt am Freitag, 8. M&auml;rz 2013 um 18.00 Uhr.; laenge=150; --]
<kreisch>...</kreisch>

Nochn Gruß!

edit: Habe gerade festgestellt, dass ich das Template mit der o.g. Funktion im Mechanismus "Rubric-Include einmal anders" verwende. Kann das der Grund sein? Dann wird die Funktion ggf. gar nicht mehr ausgeführt, obwohl sie mit richtigen Werten versorgt wird...
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7362
Registriert: 01.01.1970 01:00
Hat sich bedankt: 111 Mal
Danksagung erhalten: 934 Mal
Kontaktdaten:

Beitrag von MarkusR »

html_entity_decode KANN NICHT funktionieren, denn wenn bei Dir ein

Code: Alles auswählen

f&uuml;r
drinsteht, dann kommt als Text nur

Code: Alles auswählen

f&uuml
an, weil das ; ja nicht mehr zum Text-Parameter gehört.

Das html_entity_decode kannst Du also gerne wieder entfernen, weil es innerhalb der Funktion schlchtweg schon zu spät ist.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Antworten