Seite 1 von 2

Die Klassen Article und ArticleCollection

Verfasst: Do 23. Okt 2003, 10:30
von asmo
Ab Contenido Version 4.4.0 werden einige Klassen der Contenido-API mitgeliefert.
Diese erleichtern das Entwickeln der Module erheblich.

Dieser Artikel befasst sich mit der Contenido-API Klassen Article und ArticleCollection,
die für die Erzeugung von Artikellisten gedacht sind.

Grundkenntnisse in Objektorientierter Programmierung werden benötigt.


Die Klasse Article

Diese Klasse erleichtert den Zugriff auf Artikel und deren Eigenschaften.

Zur Erzeugung eines Objektes der Klasse Article werden 3 Parameter benötigt. Diese sind:

Code: Alles auswählen

$idart  // Die Artikel Id
$client // Mandanten Id
$lang  // Sprach Id
Das Artikelobjekt wird mit dem operator new instanziert.

Code: Alles auswählen

$meinArtikel = new Article(23, 1, 1);
Das Objekt hat nun alle Daten des Artikels mit der Id 23, Mandant 1, Sprache 1 gespeichtert.

Um die Daten zu extrahieren besitzt das Objekt 2 Methoden get und getContent.


get wird benutzt um die Artikel Eigenschaften zu extrahieren, diese sind in der Contenido Systemtabelle 'con_art_lang' definiert.

Code: Alles auswählen

// Artikeltitel extrahieren
$titel = $meinArtikel->get("title");
// Artikelzusammenfassung extrahieren
$zusammenfassung = $meinArtikel->get("summary");
// Artikel Id extrahieren
$idart = $meinArtikel->get("idart");
Alle Informationen, die im Fenster Arikeleigentschaften definiert sind, können mit der Methode get extrahiert werden.


getContent wird benutzt um den Artikelinhalt zu extrahieren. Dieser setzt sich in der Regel aus verschiedenen Text und Headline Elementen zusammen..

Als ersten Parameter erwartet getContent die Angabe des Contenido CMS Typs als String. Gültige Typen sind in der Systemtabelle 'con_type' definiert.

Standard sind: head, text, html, htmlhead, img, imgdescr, link, linktarget, linkdescr, swf

Die Methode verarbeitet die Kurzform html ebenso wie cms_html
Gross- und Kleinschreibung müssen nicht beachtet werden.

Code: Alles auswählen

$text = $meinArtikel->getContent("html", 1);
$headline = $meinArtikel->getContent("htmlhead", 1);
Die Angabe des zweiten Parameters ist optional, er definiert die Id des Content-Elementes.
Also 1 für das erste Content-Element des angeforderten typs, 2 für das zweite, usw..
Wird er weggelassen liefert die Methode ein Array mit allen Elementen des angeforderten Typs zurück.

Code: Alles auswählen

$alleHeadlines = $meinArtikel->getContent("htmlhead");
$alleHeadlines[1] // Erste headline
$alleHeadlines[2] // Zweite headline

Die Klasse ArticleCollection

Diese Klasse verwaltet mehrere Objekte des Typs Article in einer Sammlung (engl. Collection).

Code: Alles auswählen

$artikelListe = new ArticleCollection(array("idcat"=>12));
Als Parameter erwartet diese Klasse ein assoziatives Array mit Optionen.

Code: Alles auswählen

array("idcat"=>12, 
         "client"=>1, 
         "lang"=>1, 
         "start"=>false, 
         "order"=>"title", 
         "direction"=>"asc"); 
idcat Muss angegeben werden
client Optional, standard ist der aktive Mandant
lang Optional, standard ist die aktive Sprache
start Sollen Startartikel extrahiert werden, standard ist aus
order Entspricht den Feldnamen der Tabelle 'con_art_lang' nach dem sortiert werden soll
direction 'asc' / 'desc' für auf- oder absteigende Sortierung


Die Klasse ArticleCollection bestitzt die Methoden nextArticle und startArticle. Beide Methoden erwarten keinen Parameter.


nextArticle liefert ein Objekt der Klasse Article zurück, false wenn kein Objekt mehr in der Sammlung ist.

Code: Alles auswählen

while ($artikel = $artikelListe->nextArticle())
{
    echo $artikel->get("title");
}
startArticle liefert ein Objekt der Klasse Article für den Startartikel zurück.

Code: Alles auswählen

$startartikel = $artikelListe->startArticle();

Artikellisten-Modul mit den Klassen Article und ArticleCollection

Hier der Beispiel Code für ein Artikellisten-Modul für die Contenido Beispiel Seite:

Code: Alles auswählen

<?php

/**
* Beispiel eines Artikellisten-Modules
* mit Hilfe der Contenido-API Klassen.
*
* Jan Lengowski / four for business AG
*/

// Artikellisten Optionen einstellen
// Idcat ist ein MUSS feld, array("idcat"=>n);
$articleListOptions = array("idcat" => 12,          // Idcat (Muss angegeben werden)
                                      "lang"  => $lang,       // Sprach id (optional), standard ist die aktive Sprache
                                      "client"=> $client,     // Mandant id (optional), standard ist der aktive Mandant
                                      "start" => true,        // Startartikel
                                      "order" => "created",   // Feldname nach dem sortier wird, siehe tabelle 'con_art_lang'
                                      "direction" => "asc"); // Ab- oder Aufsteigende sortierung ('asc', oder 'desc')

// Artikellisten Objekt erzeugen
$articleList = new ArticleCollection($articleListOptions);

// Artikelliste mit Head1, Head2 und HTML1 ausgeben
while ($article = $articleList->nextArticle())
{
    $head1 = $article->getContent('htmlhead', 1);
    $head2 = $article->getContent('htmlhead', 2);
    $html1 = $article->getContent('html', 1);
    
    echo $head1 . "<br>";
    echo $head2 . "<br>";
    echo $html1 . "<br><br>"; 
}

?>

Diese 2 Contenido-API Klassen sind ein mächtiges Werkzeug für den Contenido-Entwickler.
Sie ermöglichen einfachen Zugriff auf Artikel-Content in jeder Sprache und für jeden Mandanten.
Somit sind mehrsprachige Artikellisten, Mandantenübergreifender Content etc.. möglich.

Falls sie noch mehr Informationen wünschen, entnehmen Sie diese bitte der Contenido-API Dokumentation.

Der nächste Howto-Artikel wird sich mit der Klasse TemplateConfig befassen, die für das extrahieren der CMS Variablen zuständig ist.

Kommentare, Kritik und Anregungen sind erwünscht.


Jan Lengowski
four for business AG

Verfasst: Do 23. Okt 2003, 11:01
von HerrB
Vielen Dank für die Einführung.

Gibt es bereits Erfahrungen in Bezug auf die Performance? Ist also die Verwendung der Collection für das Artikellisten-Modul evtl. schneller als eine SQL-Abfrage (weil vielleicht die Angaben bereits geladen worden sind), gleich schnell (aber dafür mächtiger, da mehr Eigenschaften) oder um einen Betrag x langsamer?

Gruß
HerrB

Verfasst: Do 23. Okt 2003, 11:19
von asmo
Zur Performance:

Die Klassen sind mit Sicherheit langsamer als spezifische SQL Statements.

Ich würde jetzt mal schätzen das die Klassen ca. doppelt so lange brauchen, da Sie ja alles extrahieren.

Kann einfach getestet werden wenn man das frontend Debugging einschatet:

front_content.php?idcat=x&alldebug=1

Bei dem Modul auf die lupe klicken..

Gruss Jan / 4fb

Verfasst: Fr 5. Dez 2003, 00:08
von emergence
sehr guter artikel, sehr brauchbar...

auf den template beitrag bin ich wirklich neugierig...

lg

Verfasst: Mo 8. Dez 2003, 03:57
von mtealc
Spize Artikel!

Hoffe es kommt noch mehr über die API


thx


gruss micha

Verfasst: Mi 18. Feb 2004, 12:44
von matze
hi,

ich hab gerade mit der klasse article herumgespielt.
dabei ist mir folgendes aufgefallen:

dieser code liefert keinen wert, sondern zeigt nur "Array" an, obwohl ein wert in der datenbank steht!

Code: Alles auswählen

$art = new Article($idart, 1, 1);
$head1 = $art->getContent('cms_head', 0);

echo $head1;


wenn ich die abfrage nach element 1 oder die abfrage über den kompletten array dann wird der korrekte wert ausgegeben!

Code: Alles auswählen

$art = new Article($idart, 1, 1);
$head1 = $art->getContent('cms_head', 1);

echo $head1;

Code: Alles auswählen

$art = new Article($idart, 1, 1);
$head1 = $art->getContent('cms_head');

echo $head1[0];

riecht das nach bug oder hab ich was falsch gemacht?
matze

Verfasst: Fr 5. Mär 2004, 16:09
von asmo
Hi Matze,

das ist ein Bug. Ist in der nächsten Version gefixed.

Bis dahin hier der Bugfix:

Die Methode getContent in der class Article modifizieren:

Code: Alles auswählen

function getContent($type, $id = NULL)
    {	
        if ($type == '')
        {
            return 'Class ' . get_class($this) . ': content-type must be specified!';
        }
        
        $type = strtolower($type);
        
        if (!strstr($type, 'cms_'))   
        {
       		$type = 'cms_' . $type;	
       	}

        if (is_null($id))
        { // return Array
            return $this->content[$type];
        }

        // return String
        return $this->content[$type][$id];
    }

Gruss Jan

Verfasst: Mi 17. Mär 2004, 10:28
von emergence

Verfasst: Do 18. Nov 2004, 20:56
von Luigi
Hallo,

ich bekomme über die Article-Klasse keinen Zugriff auf die Bilder eines Artikels. Texte eines Artikels funktionieren problemlos.
Ein Anzeigen mittels var_dump liefert seltsamerweise ein Array mit Zahlen.

Bsp.:

[1]=>
string(1) "4"
[5]=>
string(0) ""


Output-Teil meines Moduls:
<?php

$liste = "CMS_VALUE[1857]";
$max_bildbreite = "50";
$detailtext = "detailliertes Angebot";

// Artikellisten Optionen einstellen
// Idcat ist ein MUSS feld, array("idcat"=>$liste);
$articleListOptions = array("idcat" => $liste, // Idcat (Muss angegeben werden)
"lang" => $lang, // Sprach id (optional), standard ist die aktive Sprache
"client"=> $client, // Mandant id (optional), standard ist der aktive Mandant
"start" => true, // Startartikel
"order" => "created", // Feldname nach dem sortier wird, siehe tabelle 'con_art_lang'
"direction" => "asc"); // Ab- oder Aufsteigende sortierung ('asc', oder 'desc')

$artikelListe = new ArticleCollection($articleListOptions);

echo '<table height="100%" width="100%" border="0" cellpadding="0" cellspacing="5">';

while ($artikel = $artikelListe->nextArticle())
{
echo '<tr><td valign = "top">';

// 1. Spalte mit Bild

$bild = $artikel->getContent("img");

echo var_dump($bild );

if ($bild != "") {

// BUG?: Es kommt nicht immer ein Ergebnis zurück
$size456 = getimagesize($bild);
if ($size456 != null) $size=$size456;

$img = '<img src="php/thumbnail_show.php?picture='.$bild.'&width='.$max_bildbreite.'" border="0">';

$img = sprintf('<a href="javascript:ext_popup(\'%s\', %s, %s)" target="%s">%s</a>', $bild , $size[0] + 50, $size[1] + 50, "" , $img);

echo $img;


}




// 2. Spalte mit Text
echo '</td><td valign = "top">';

$link = $artikel->get("idart");

echo '<a class="gebrauchtm_more" href=" '.$sess->url('front_content.php?idart='.$link). ' ">';
echo '<span class= "gebrauchtm_more" >'.$artikel->getContent("htmlhead", 1)."</span> ";
echo '</a>';

$detailLink = $artikel ->getContent("link", 7);

echo '<a class="gebrauchtm_more" target="_blank" href="'.$detailLink.'">';
echo '<span class= "gebrauchtm_more">('.$detailtext.')</span>';
echo '</a><br>';


$text = $artikel ->getContent("html", 1);
echo '<span class= "gebrauchtm_text" >'.$text."</span>";

echo "<br><br></td></tr>";

}

echo "</table>";

?>

Verfasst: Fr 11. Feb 2005, 22:26
von Luigi
Ich habe das jetzt so gelöst:

// ************ 1. Spalte mit Bild ***************

$bild = $artikel->getContent("img", 1); // es kommt nur die ID zurück!

//echo "$lang $client $liste";

$sql = "SELECT * FROM ".$cfg['tab']['upl']." WHERE idclient=$client AND idupl =$bild";

//echo $sql;

$db2->query($sql);
$db2->next_record();

$bild = $cfgClient[$client]["path"]["htmlpath"]."upload/".$db2->f("dirname").$db2->f("filename");

//echo var_dump($bild );


if ($bild != "" && $bild != $cfgClient[$client]["path"]["htmlpath"]) {

// BUG?: Es kommt nicht immer ein Ergebnis zurück
$size456 = getimagesize($bild);
if ($size456 != null) $size=$size456;

$img = '<img src="php/thumbnail_show.php?picture='.$bild.'&width='.$max_bildbreite.'" border="0">';

$img = sprintf('<a href="javascript:ext_popup(\'%s\', %s, %s)" target="%s">%s</a>', $bild , $size[0] + 50, $size[1] + 50, "" , $img);

echo $img;

}

Verfasst: Fr 8. Jul 2005, 17:49
von phoku
Gibt es eine Möglichkeit, innerhalb einer ArticleCollection die einzelnen Artikel nach Content-Elementen zu sortieren? Also z.B. aufsteigend alphabetisch nach den Werten, die die einzelnen Artikel über getContent("htmlhead", 1) liefern?

Wäre super sowas! Ansonnsten: Ist das schwer zu implementieren?

thanx!
phoku

Verfasst: Fr 8. Jul 2005, 18:52
von swelpot
direkt in der Klasse implementiert sehe ich da nix.
ein ansatz wäre das sortieren des articles-feld der klasse (enthält alle idart) mit einer callback-sort-funktion von php (z.b. usort)

Re: Die Klassen Article und ArticleCollection

Verfasst: So 12. Dez 2010, 18:13
von ctschorsch
Hallo zusammen,

ich muß den alten Kram noch mal hochholen.

Die Klassen sind ja jetzt schon ein paar Jahre alt. Sind die bei der 4.8.14 in neuer Version ? Eventuell sogar mit einer Funktion um wie oben an den Pfad eines Bildes zu kommen ?

Sind die Klassen zugänglich und man kann diese Funktion selbst einbauen ?

Georg

Re: Die Klassen Article und ArticleCollection

Verfasst: Mo 3. Jan 2011, 17:43
von McHubi
Hallo,

bin grad selbst an einer ähnlichen Problemstellung. Kopier das hier mal in einen Output und pass ggf. die idart für das Beispiel an (und trag im Beispielartikel auch die Werte im Reiter Eigenschaften ein :wink: ):

Code: Alles auswählen

<?php

echo 'idart aktueller Artikel: '.$idart.'<br/>';
echo 'idartlang aktueller Artikel: '.$idartlang.'<br/>';

echo 'Zu Grunde liegende idart für Beispiel: 40 (Startseite)<hr>';

$meinArtikel = new Article(40, 1, 1);

// Artikeltitel extrahieren
$titel = $meinArtikel->get("title");

// Artikelalias extrahieren
$alias= $meinArtikel->get("urlname");

// Artikelzusammenfassung extrahieren
$zusammenfassung = $meinArtikel->get("summary");

// Seitentitel extrahieren
$seitentitel= $meinArtikel->get("pagetitle");

// Datum extrahieren
$datum = $meinArtikel->get("created");

// Datum Veröffentlichung extrahieren
$datum_veroeffentlichung = $meinArtikel->get("published");

// Datum Bearbeitung extrahieren
$datum_bearbeitung = $meinArtikel->get("lastmodified");

// Autor extrahieren
$autor = $meinArtikel->get("author");

// Bearbeitet von extrahieren
$bearbeitet_von = $meinArtikel->get("modifiedby");

// Artikel Id extrahieren
$idart = $meinArtikel->get("idart");

// Artikel Idartlang extrahieren
$idartlang = $meinArtikel->get("idartlang");

echo 'Titel: '.$titel.'<br/>';
echo 'Alias: '.$alias.'<br/>';
echo 'Zusammenfassung: '.$zusammenfassung.'<br/>';
echo 'Seitentitel: '.$seitentitel.'<br/>';
echo 'Datum: '.$datum.'<br/>';
echo 'Datum Veröffentlichung: '.$datum_veroeffentlichung.'<br/>';
echo 'Datum Bearbeitung: '.$datum_bearbeitung.'<br/>';
echo 'Autor: '.$autor.'<br/>';
echo 'Bearbeitet von: '.$bearbeitet_von.'<br/>';
echo 'idart: '.$idart.'<br/>';
echo 'idartlang: '.$idartlang.'<br/>';

?>
Guck Dir dazu mal die Tabelle con_artlang an.

Das hier klappt nicht:
$beschreibung = $meinArtikel->get("description");
$keywords= $meinArtikel->get("keywords");
$robots = $meinArtikel->get("robots");
$copyright = $meinArtikel->get("copyright");

Lösung: Daten über Tabelle con_meta_tag und die entsprechenden idmetatypes in Verbindung mit idartlang holen.

Ansatz für die Ermittlung eines Bildpfades: Nutzen der idartlang um in der tabelle con_content den richtigen Artikel zu finden. Hier dann über den richtigen idtype unter value eine Suche nach Dateinamen mit vorangestelltem "src" durchführen. Sähe dann z. B. so aus src%3D%22upload%2Fbilder%2Fberufswahl_002.jpg . Im Anschluss noch preg_replace() und Du hast den Pfad.

Re: Die Klassen Article und ArticleCollection

Verfasst: Mi 5. Jan 2011, 09:02
von Dodger77
ctschorsch hat geschrieben:Die Klassen sind ja jetzt schon ein paar Jahre alt. Sind die bei der 4.8.14 in neuer Version ? Eventuell sogar mit einer Funktion um wie oben an den Pfad eines Bildes zu kommen ?

Sind die Klassen zugänglich und man kann diese Funktion selbst einbauen ?
Das sollte doch nicht notwendig sein. Man kann da doch viel mehr in Modulen abfangen:

Code: Alles auswählen

<?php

$oArticle = new Article(40, 1, 1);
$iUpload = $oArticle->getContent('img', 1);
$oUploadCollection = new UploadCollection();
$oUpload = $oUploadCollection->loadItem($iUpload);

$sDirname = $oUpload->get('dirname');
$sFilename = $oUpload->get('filename');

$sImg = $cfgClient[$client]["upl"]["htmlpath"] . $sDirname . $sFilename;

echo '<img src="' . $sImg . '" alt="Test" />';

?>