Die Klassen Article und ArticleCollection

asmo
Beiträge: 21
Registriert: Fr 20. Sep 2002, 09:29
Kontaktdaten:

Die Klassen Article und ArticleCollection

Beitrag von asmo » Do 23. Okt 2003, 10:30

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

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Do 23. Okt 2003, 11:01

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

asmo
Beiträge: 21
Registriert: Fr 20. Sep 2002, 09:29
Kontaktdaten:

Beitrag von asmo » Do 23. Okt 2003, 11:19

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

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 5. Dez 2003, 00:08

sehr guter artikel, sehr brauchbar...

auf den template beitrag bin ich wirklich neugierig...

lg

mtealc
Beiträge: 22
Registriert: Sa 29. Nov 2003, 03:22
Kontaktdaten:

Beitrag von mtealc » Mo 8. Dez 2003, 03:57

Spize Artikel!

Hoffe es kommt noch mehr über die API


thx


gruss micha

matze
Beiträge: 106
Registriert: Mi 17. Dez 2003, 00:17
Wohnort: L.E.
Kontaktdaten:

Beitrag von matze » Mi 18. Feb 2004, 12:44

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

asmo
Beiträge: 21
Registriert: Fr 20. Sep 2002, 09:29
Kontaktdaten:

Beitrag von asmo » Fr 5. Mär 2004, 16:09

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

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

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


Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Do 18. Nov 2004, 20:56

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>";

?>

Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Fr 11. Feb 2005, 22:26

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;

}

phoku
Beiträge: 1
Registriert: Fr 8. Jul 2005, 17:45
Kontaktdaten:

Beitrag von phoku » Fr 8. Jul 2005, 17:49

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

swelpot
Beiträge: 101
Registriert: Mo 26. Jul 2004, 20:42
Wohnort: Rhein-Main
Kontaktdaten:

Beitrag von swelpot » Fr 8. Jul 2005, 18:52

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)
Grüße

Stefan

ctschorsch
Beiträge: 101
Registriert: So 21. Nov 2004, 23:48
Kontaktdaten:

Re: Die Klassen Article und ArticleCollection

Beitrag von ctschorsch » So 12. Dez 2010, 18:13

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

McHubi
Beiträge: 1094
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Die Klassen Article und ArticleCollection

Beitrag von McHubi » Mo 3. Jan 2011, 17:43

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.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

(NEU!) Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Dodger77
Beiträge: 3625
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Re: Die Klassen Article und ArticleCollection

Beitrag von Dodger77 » Mi 5. Jan 2011, 09:02

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" />';

?>

Gesperrt