Rubric-Include per mod_functions

Fragen zur Implementierung und/oder Anpassung von ConPresso 4 werden in diesem Forum diskutiert.
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo!

Kann man das Rubric-Include eigentlich auch als Funktion in mod_functions einbinden?

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

Beitrag von MarkusR »

Man kann es probieren.

Allerdings gibt es ja dafür ja <!-- Page: articles; --> in Seitentemplates.

Um was für einen Code geht es denn?
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,

es geht um etwas, das wie das hier http://community.conpresso.de/viewtopic ... 6724#26724 funktioniert. An der Stelle, wo der Funktionsaufruf steht, sollten die eingebundenen Artikel ausgegeben werden - so zumindest in der Fantasie. Das Ersetzen eines Platzhalters ###PLATZHALTER### im Artikelcode funktioniert leider nicht, wenn man den obigen Code einfach per mod_functions einbindet.

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

Beitrag von MarkusR »

Ich nehme mal an, Du hast es nicht probiert, sonst hättest Du ja ein Ergebnis mitteilen können. Soll ich das jetzt machen???

Grundsätzlich zu Funktionen in PHP:
verwendet man in der Funktion eine Variable wie $cpoSystem, die nicht in der Funktion selbst definiert wurde, dann muß man sie erst globalisieren.
Und falls Du auch weitere Variablen benutzen willst, dann mußt Du diese auch globalisieren, z.B. $activeModules für alles, was mit Modulen zu tun hat.

Test doch einfach die Funktion in einer test.php im _rubric-Verzeichnis

Code: Alles auswählen

define('CPO', true);
require_once('../_include/common.inc.php');

$pagetype = 'index';
require(CPO_BASEDIR.'_include/var_category.php');
require(CPO_BASEDIR.'_include/secure.php');

include(CPO_BASEDIR.$directory.'/loadheaders.php');

function xyz($args) {
 //code ...
}
echo xyz($args);

include(CPO_BASEDIR.$directory.'/loadfooters.php');
Dann legst Du im Zweifel nicht den Webauftritt lahm und kannst hier Fehlermeldungen oder Ergebnisse posten.
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Ok, dann nochmal konkret gefragt:
Folgender Code (siehe oben) funktioniert nicht über mod_functions:

Code: Alles auswählen

$pagetype_page = $pagetype;
$anzahl_page = $anzahl;
$parsecount_page = $parsecount;

// klasseninfos klasse 10 ---------------------------------------------------------------
ob_start();
// Die Parameter:
$rubrikid = 32;                             // der ID der Rubrik
$artikelanzahl = 10;                        // maximale Anzahl der auszugebenden Artikel
$sortierung = 'sort_id desc';               // Art der Artikelsortierung: manuell
$templates_id = 13;                         // template-id für die anzeige
$inline_name = 'KLASSE1-3';                // Das ist neu: Name des Platzhalters, der dann im weiteren Verlauf benutzt wird

// ab hier nix mehr ändern


$query = "SELECT rubric_id, commentary, 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." LIMIT 0," . $artikelanzahl . " ";
$db = new DB;
$db->query($query);

while($db->next_record()) {

    $db_template      = $templates_id;
    $db_nr            = $db->v('nr');
    $db_idx           = $db->v('idx');
    $db_email         = $db->v('email');
    $db_autor         = $db->v('autor');
    $db_changer       = $db->v('changer');
    $db_pub_datum     = $db->v('pub_datum');
    $db_verfallsdatum = $db->v('verfallsdatum');
    $db_commentary    = $db->v('commentary');
    $db_titel         = $db->v('titel');
    $db_initial       = $db->v('initial');
    $db_freigabe      = $db->v('freigabe');
    $db_rubric_id     = $db->v('rubric_id');
    require(CPO_BASEDIR.'_include/select_template.php');

}
$inlineReplace[$inline_name] = '###'.$inline_name.'###';
$inlineContent[$inline_name] = ob_get_contents();
$tmpContent = ob_get_contents();
$inlineContent[$inline_name] = (empty($tmpContent)) ? '' : $tmpContent;
ob_end_clean();
// --------------------------------------------------------------
// variablen wiederherstellen:
$pagetype = $pagetype_page;
$anzahl = $anzahl_page;
$parsecount = $parsecount_page;
Wie kann ich den Code so verändern, dass mir [!-- function: rubricinclude; --] die entsprechenden Artikel mit dem gewählten Template ausgibt. Leider funktioniert das so nicht. Ich habe es bereits probiert. Der Funktionsaufruf gefolgt von dem Platzhalter ###Klasse1-3### liefert nix.

Noch ein später Gruß aus Berlin von
Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Du hast witzigerwiese vergessen die Variablen zu globalisieren und einen Rückgabewert (return) hast Du auch nicht.

Lies Dir doch mal die Doku zu mod_functions durch und fummel was in der Art zusammen

Code: Alles auswählen

function FUNKTIONSNAME($argument1, $argument2 [,...] )  { 
    //hier kommt nun der Beispiel-Code ... 
    $ergebnis = $argument1 + $argument2; 
    return $ergebnis; 
}
Wie sieht das im Klartext aus:
Der Funktionsaufruf gefolgt von dem Platzhalter ###Klasse1-3###
Wird die Funktion mit diesem Text als Argument aufgerufen oder folgt der Text der Funktion? Was ist an diesem Text ein Platzhalter?
Zuletzt geändert von MarkusR am 23.03.2013 21:42, insgesamt 2-mal geändert.
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,

beim Globalisieren weiß ich gar nicht, wo ich anfangen soll. Die Fehlerbeschreibung "funktioniert nicht" habe ich ja wegen ihrer Beliebtheit gewählt :lol: ! Es passiert halt definitiv gar nichts. Beim Parsen wird auch keine Fehlermeldung ausgegeben.
O.k., ich mach mich mal ans Basteln und poste hier die Löcher und Fallstricke...
So long

Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Während dieses Posts habe ich meines noch überarbeitet:

Wie sieht das im Klartext aus:
Der Funktionsaufruf gefolgt von dem Platzhalter ###Klasse1-3###
Wird die Funktion mit diesem Text als Argument aufgerufen oder folgt der Text der Funktion? Was ist an diesem Text ein Platzhalter?
beim Globalisieren weiß ich gar nicht, wo ich anfangen soll.
Fange doch mal mit $activeModules und $cpoSystem an...
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Here we go:

Code: Alles auswählen

function rubricinclude($rubric_id, $template_id, $artikelanzahl, $sortierung){

Code: Alles auswählen

global $activeModules, $cpoSystem, $rubric_id, $template_id, $artikelanzahl, $sortierung;
switch ($sortierung){ 
	case 'manual': $sortierung = 'sort_id desc'; break;
	case 'index aufwärts': $sortierung = 'index asc'; break;
	case 'index abwärts': $sortierung = 'index desc'; break;
	default: $sortierung = 'sort_id desc';
}

// variablen sichern:
$pagetype_page = $pagetype;
$anzahl_page = $anzahl;
$parsecount_page = $parsecount;

ob_start();

// ab hier nix mehr ändern

$query = "SELECT rubric_id, commentary, 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." LIMIT 0," . $artikelanzahl . " ";
$db = new DB;
$db->query($query);

while($db->next_record()) {

    $db_template      = $templates_id;
    $db_nr            = $db->v('nr');
    $db_idx           = $db->v('idx');
    $db_email         = $db->v('email');
    $db_autor         = $db->v('autor');
    $db_changer       = $db->v('changer');
    $db_pub_datum     = $db->v('pub_datum');
    $db_verfallsdatum = $db->v('verfallsdatum');
    $db_commentary    = $db->v('commentary');
    $db_titel         = $db->v('titel');
    $db_initial       = $db->v('initial');
    $db_freigabe      = $db->v('freigabe');
    $db_rubric_id     = $db->v('rubric_id');
    require(CPO_BASEDIR.'_include/select_template.php');

}

$rubriccontent = ob_get_contents();
ob_end_clean();
// --------------------------------------------------------------
// variablen wiederherstellen:
$pagetype = $pagetype_page;
$anzahl = $anzahl_page;
$parsecount = $parsecount_page;

return $rubriccontent;
}
Der Funktionsaufruf [!-- function: rubricinclude; rubric_id=32; template_id=11; artikelanzahl=10; sortierung=manual; --] liefert einen leeren String :roll:

Du siehst, dass das hier meine php-Kompetenzen übersteigt...
Horstgrüße
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Parameter, die Du der Funktion explizit übergibst, brauchst Du nicht zu globalisieren!
Bei

Code: Alles auswählen

function rubricinclude($rubric_id, $template_id, $artikelanzahl, $sortierung)
sollten $rubric_id, $template_id, $artikelanzahl, $Sortierung nicht globalisiert werden.
Das

Code: Alles auswählen

// variablen sichern: 
$pagetype_page = $pagetype; 
$anzahl_page = $anzahl; 
$parsecount_page = $parsecount;
und

Code: Alles auswählen

// variablen wiederherstellen: 
$pagetype = $pagetype_page; 
$anzahl = $anzahl_page; 
$parsecount = $parsecount_page; 
kannst Du Dir sparen, weil Du Dich ja nicht im Seitencode sondern in einer Funktion befindest.
Dagegen solltest Du den pagetype aber auch mal setzen, denn ohne pagetype auch keine Ausgabe.

Du übergibst der Funktion übrigens eine Variable $rubric_id, die Du dann aber gar nicht benutzt. Stattdessen benutzt Du $rubricid, die aber gar nicht definiert ist und somit auch nichts enthalten kann, also leere Ausgabe. Tippfehler?
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Hallo Markus,
so sieht der Code jetzt aus:

Code: Alles auswählen

function rubricinclude ($rubric_id, $template_id, $artikelanzahl, $sortierung){

global $activeModules, $cpoSystem, $pagetype;
switch ($sortierung){ 
	case 'manual': $sortierung = 'sort_id desc'; break;
	case 'index aufwärts': $sortierung = 'index asc'; break;
	case 'index abwärts': $sortierung = 'index desc'; break;
	default: $sortierung = 'sort_id desc';
}

$pagetype = 'index';

ob_start();

// ab hier nix mehr ändern

$query = "SELECT rubric_id, commentary, 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='".$rubrik_id."' ORDER BY ".$sortierung." LIMIT 0," . $artikelanzahl . " ";
$db = new DB;
$db->query($query);

while($db->next_record()) {

    $db_template      = $templates_id;
    $db_nr            = $db->v('nr');
    $db_idx           = $db->v('idx');
    $db_email         = $db->v('email');
    $db_autor         = $db->v('autor');
    $db_changer       = $db->v('changer');
    $db_pub_datum     = $db->v('pub_datum');
    $db_verfallsdatum = $db->v('verfallsdatum');
    $db_commentary    = $db->v('commentary');
    $db_titel         = $db->v('titel');
    $db_initial       = $db->v('initial');
    $db_freigabe      = $db->v('freigabe');
    $db_rubric_id     = $db->v('rubric_id');
    require(CPO_BASEDIR.'_include/select_template.php');

}

$rubriccontent = ob_get_contents();
ob_end_clean();

return $rubriccontent;
}
rubricid war wirklich ein Schreibfehler.
Leider wird immer noch ein leerer String zurückgegeben..
:(
Horstgrüße
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Du übergibst $rubric_id und $template_id
verwendest aber $rubrik_id und $templates_id
bitte korrigieren! (und schiebe das jetzt nicht auf PHP...)

Und bitte entferne $pagetype aus der Globalisierungsliste, weil Du ja nicht den Pagetype von außen haben willst!

Ich habe die Funktion ohne diese Fehler getestet, funzt 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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

Shit happens!

Ich habe die Schreibweise korrigiert und gobal $pagetype rausgenommen. Immerhin passiert jetzt folgendes:
Fehlermeldung:
Warning: Invalid argument supplied for foreach() in /mnt/webd/.../htdocs/cms/_include/parser.php on line 148
:?

P.S: Ich verwende mod_parser 4.0
Zuletzt geändert von hscha am 23.03.2013 23:21, insgesamt 1-mal geändert.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Dann globalisiere noch das, was da in der Zeile steht.
Ich gehe vom enhanced Parser aus, dann ist das
$hdlr_parser_replacement
am besten gleich dazu
$hdlr_parser_content, $placeholders_cache, $typeNames und $fetchedcontent
und alles, was noch bemängelt wird...

wobei ich immer noch nicht verstehe, warum Du nicht ein PHP-Template anlegst und dann die offizielle Version benutzt
<!-- Page: articles; id=32; pagetype=php; noOfArticles=10; sorting=sort_id desc; -->
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: 712
Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 216 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Beitrag von hscha »

O.k.,
habe ich gemacht. Wenn ich nur $hdlr_parser_replacement globalisiere, erhalte ich ca. 3 Meter sich wiederholend:
Warning: array_key_exists() expects parameter 2 to be array, null given in /mnt/webd/.../htdocs/cms/_include/parser.php on line 166
Wenn ich alle von dir angegebenen Variablen globalisiere, ist alles still - zu still - es wird wieder ein leerer String ausgegeben.
Sorry, Markus!

Ich danke dir für deine Mühe. Ich schaue morgen nochmal über den Code. Vllt. habe ich noch irgendwo einen blöden Schreibfehler gemacht, an dem wir uns jetzt nen Wolf suchen...

P.S:
wobei ich immer noch nicht verstehe, warum Du nicht ein PHP-Template anlegst und dann die offizielle Version benutzt
<!-- Page: articles; id=32; pagetype=php; noOfArticles=10; sorting=sort_id desc; -->
Ich verwende keine Seitentemplates...

So long und Grüße von
Horst
Antworten