neues modul :: simpleArticleList

Gesperrt
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

neues modul :: simpleArticleList

Beitrag von kummer »

bei der simpleArticleList handelt es sich - wie der name schon sagt - um eine einfache artikelliste ohne schnickschnack. also nur eine ebene und kein bild.

hier der code (erklärungen weiter unten):

Code: Alles auswählen

<?php
/**
  * $Revision: 1.10 $
  * $Source: D:/cvs/cvsrepo/test/PPI_Nade/module/articleList/output.php,v $
  * $Date: 2005/11/28 10:42:26 $
  */

/**
 * articleList
 * @author Andreas Kummer
 * @copyright Copyright &copy; 2005 w3concepts AG
 */

class articleList {
	
	/**
	 * Konstruktor der Klasse.
	 * @param Integer  Primärschlüssel der Artikelkategorie.
	 */
	function articleList($myIdCat) {
		
		global $client, $lang, $idcat;
		
		$this->myIdCat = $myIdCat;
		
		$this->client = $client;
		$this->lang = $lang;
		$this->idcat = $idcat;
		
		$this->db = new DB_Contenido();
	}
	
	/**
	 * Setzt den vor der Artikelliste auszugebenden HTML-Code.
	 * @param String  HTML-Code, der vor der Artikelliste ausgegeben werden
	 * soll.
	 */
	function setBefore($before) {
		
		$this->before = $before;
	}
	
	/**
	 * Setzt den nach der Artikelliste auszugebenden HTML-Code.
	 * @param String  HTML-Code, der nach der Artikelliste ausgegeben werden
	 * soll.
	 */
	function setAfter($after) {
		
		$this->after = $after;
	}
	
	/**
	 * Setzt das Template (respektive die Maske) für die Ausgabe eines Teasers.
	 * Für die Ausgabe wird der Titel sowie die Artikelbeschreibung verwendet.
	 * @param String  Template für die Asugabe des Teasers. Folgende Platzhalter
	 * sind vorgesehen {title} für den Titel, {teaser} für die
	 * Artikelbeschreibung, {idcat} für die Artikelkategorie sowie {idart} für
	 * die Artikelidentifikation, {link} für die Artikelreferenzierung und
	 * {created} für das Erstellungsdatum.
	 */
	function setTeaserMask($mask) {
		
		$this->mask = $mask;
	}
	
	/**
	 * Gibt die Artikelliste zurück. Die Ausgabe an den Browser muss dann über
	 * ein echo oder ein print erfolgen.
	 * @param String  Sortierkriterium. Zur Auswahl stehen: 'created'
	 * (Erstellungsdatum), 'modified' (Aktualisierungsdatum), 'sorted'
	 * (Contenido-Sortierkriterium), 'alphabetical' (alphabetisch nach Titel).
	 * @param Boolean  True für aufsteigende Sortierung, false für absteigend.
	 * @param Integer  Maximale Anzahl Artikel, die angezeigt werden sollen.
	 * Wird 0 angegeben, werden alle Artikel ausgegeben.
	 */
	function getArticleList($sortOrder, $asc, $maxArticles = 0) {
		
		/*
		 * Ordnungsprinzip fest legen
		 */
		$order = ($asc) ? ('ASC') : ('DESC');
		
		/*
		 * Sortierkriterium fest legen
		 */
		switch ($sortOrder) {
			case 'created':
				$sortCriteria = 'b.created '.$order;
				break;
			case 'modified':
				$sortCriteria = 'b.lastmodified '.$order;
				break;
			case 'sorted':
				$sortCriteria = 'b.artsort '.$order.', b.title '.$order;
				break;
			case 'alphabetical':
				$sortCriteria = 'b.title '.$order;
				break;
			default:
				$sortCriteria = 'b.created '.$order;
		}
		
		/*
		 * Artikel aus der Datenbank lesen
		 */
		$articles = $this->getArticles($this->myIdCat, $this->lang, $sortCriteria, $maxArticles);
		
		/*
		 * Rückgabewert initialisieren
		 */
		$returnValue = '';
		
		if (!empty($articles)) {
			$returnValue = $this->before;
			
			foreach ($articles as $article) {
				if ($article['online'] == 1) {
					$mask = $this->mask;
					if ($article['redirect'] != '0') {
						$article['link'] = $article['redirect'];
					}
					foreach ($article as $part => $content) {
						$mask = str_replace('{'.$part.'}',$content,$mask);
					}
					$returnValue .= $mask;
				}
			}
			
			$returnValue .= $this->after;
		}
		
		return $returnValue;
	}
	
	function getArticles($idcat, $idlang, $sortCriteria, $limit) {
		
		global $cfg;
		
		/*
		 * Initialisierung des Rückgabewertes
		 */
		$returnValue = array();
		
		/*
		 * Setzen der Abfragelimiten
		 */
		if ($limit != 0) {
			$limit = "LIMIT 0, $limit";
		} else {
			$limit = '';
		}
		
		/*
		 * Absetzen des Queries.
		 */
		$this->db->query("" .
				"SELECT " .
				"	b.idart, " .
				"	b.title, " .
				"	b.summary, " .
				"	b.created, " .
				"	b.lastmodified, " .
				"	b.artsort, " .
				"	b.redirect_url, " .
				"	b.online, " .
				"	DATE_FORMAT(b.created, '%d.%m.%y') as erstellungsdatum, " .
				"	DATE_FORMAT(b.lastmodified, '%d.%m.%y') as aktualisierungsdatum " .
				"FROM {$cfg['tab']['cat_art']} as a " .
				"LEFT JOIN {$cfg['tab']['art_lang']} as b ON a.idart = b.idart " .
				"LEFT JOIN {$cfg['tab']['cat_lang']} as c ON a.idcat = c.idcat " .
				"WHERE " .
				"	a.idcat = $idcat " .
				"	AND b.idlang = {$this->lang} " .
				"	AND c.startidartlang != b.idartlang " .
				"ORDER BY " .
				"	$sortCriteria " .
				"$limit" .
				"");
				
		while ($this->db->next_record()) {
			$returnValue[] = array(
				'teasertitle'=>$this->db->f('title'), 
				'teaser'=>$this->db->f('summary'),
				'idcat'=>$idcat,
				'idart'=>$this->db->f('idart'),
				'link'=>'front_content.php?idcat='.$idcat.'&idart='.$this->db->f('idart'),
				'redirect'=>$this->db->f('redirect_url'),
				'online'=>$this->db->f('online'),
				'created'=>$this->db->f('erstellungsdatum'));
		}
		
		return $returnValue;
	}
}

$articleList = new articleList("CMS_VALUE[1]");
$articleList->setBefore('');
$articleList->setAfter('');
$articleList->setTeaserMask('
     <div class="teaserBlock">
      <div class="teaserBlockLink">
       <a href="{link}">
        <img src="images/templateImages/buchWeissAufOrange.png" alt="Erfahren Sie mehr..."/>
       </a>
      </div>
      <div class="teaserBlockTitle">{teasertitle}</div>
      <div class="teaserBlockContent">{created}_ {teaser}</div>
     </div>
');
echo $articleList->getArticleList('created', false);
?>
mit setBefore und setAfter können eingangs- und ausgangsausgaben vor und nach der artikelliste vorgenommen werden.

mit der methode setTeaserMask wird die maske für die ausgabe eines teaser gesetzt. als platzhalter dienen: teasertitle, created, teaser, idart, idcat und link (jeweils in geschweiften klammern, vgl. beispiel).

der teasertitle entspricht dem titel (achtung: nicht seitentitel, sondern titel) des artikels. der teaser selber wird aus dem summary genommen (zusammenfassung).

für die konfiguration wird die klasse chooseTree verwendet:

Code: Alles auswählen

?><?
/**
  * $Revision: 1.7 $
  * $Source: D:/cvs/cvsrepo/test/PPI_Nade/module/articleList/input.php,v $
  * $Date: 2005/11/25 17:41:12 $
  */

/**
  * chooseTree
  * @author Andreas Kummer
  * @copyright Copyright &copy; 2005 w3concepts AG
  */

if (!class_exists('chooseTree')) {

	class chooseTree {
		
		function chooseTree($selected, $index) {
			
			global $lang, $client;
			
			$this->selected = $selected;
			$this->index = $index;
			$this->lang = $lang;
			$this->client = $client;
			
			$this->db = new DB_Contenido();
			$this->queryStructure();
			
			$this->outputInterface();
		}
		
		function queryStructure() {
			
			global $cfg;
			
			$this->db->query("" .
					"SELECT " .
					"	a.idcat, " .
					"	a.level, " .
					"	c.name " .
					"FROM {$cfg['tab']['cat_tree']} AS a, " .
					"{$cfg['tab']['cat']} AS b, " .
					"{$cfg['tab']['cat_lang']} AS c " .
					"WHERE " .
					"	a.idcat = b.idcat " .
					"	AND b.idcat = c.idcat " .
					"	AND c.idlang = '{$this->lang}' " .
					"	AND b.idclient = '{$this->client}' " .
					"	AND c.visible=1 " .
					"ORDER BY " .
					"	a.idtree" .
					"");
					
			$this->structure = array();
			while ($this->db->next_record()) {
				$this->structure[$this->db->f('idcat')] = array('level'=>$this->db->f('level'), 'name'=>$this->db->f('name'));
			}
		}
		
		function outputInterface() {
			
			/*
			 * Tabellenanfang ausgeben
			 */
			echo "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">";
			
			/*
			 * Zeilenanfang ausgeben
			 */
			echo "<tr><td>Baum wählen:</td><td>";
			
			/*
			 * Select-Feld ausgeben
			 */
			echo $this->getSelect($this->structure, $this->index);
			
			/*
			 * Zeilenende ausgeben
			 */
			echo "</td></tr>";
			
			/*
			 * Tabellenende ausgeben
			 */
			echo "</table>";
		}
		
		function getSelect($structure, $name) {
			
			$returnValue = '<select size="1" name="'.$name.'" class="text_medium">'."\n";
			
			foreach ($structure as $idcat => $item) {
				if ($idcat == $this->selected) {
					$selected = ' selected = "selected"';
				} else {
					$selected = '';
				}
				
				$spaces = "|";
				for ($i = 0; $i < $item['level']; $i ++) {
					$spaces = $spaces . "--";
				}
				$spaces .= ">";
				
				$returnValue .= '<option value="'.$idcat.'"'.$selected.'>'.$spaces.$item['name'].'</option>';
			}
			
			$returnValue .= '</select>'."\n";
			
			return $returnValue;
		}
	}
}

$chooseTree = new chooseTree("CMS_VALUE[1]", "CMS_VAR[1]");
hope this is useful!

regards,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
jost
Beiträge: 322
Registriert: Mo 10. Jan 2005, 20:12
Kontaktdaten:

Beitrag von jost »

Ganz lieben Dank, Kummer, super :-)!!!
JensH
Beiträge: 6
Registriert: So 14. Mai 2006, 13:18
Wohnort: Dorsten
Kontaktdaten:

Beitrag von JensH »

Erst mal besten Dank für die Artikelliste; funktioniert soweit bestens.
Kann jemand einem ablosuten Neuling erklären, ob bzw. an welcher Stelle im Code der Startartikel aktiviert werden kann?
Läßt sich zudem auch der aktuelle Artikel ausblenden?
Leider konnte ich nichts verständliches im Forum finden :?

Grüße
Jens
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Sieht das Modul nicht vor.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
JensH
Beiträge: 6
Registriert: So 14. Mai 2006, 13:18
Wohnort: Dorsten
Kontaktdaten:

Beitrag von JensH »

Das war schnell.... Besten Dank HerrB!
(Nun ja, ich habe es fast vermutet, aber immer noch gehofft, etwas übersehen zu haben...)
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

beides lässt sich machen. der startartikel wird nicht angezeigt, oder? dazu müsste nur der query ein wenig angepasst werden. und um den aktuellen artikel auszublenden müsste nur bei der iteration eingegriffen und der aktuelle artikel mit einer if-prüfung ausgeschlossen werden.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
JensH
Beiträge: 6
Registriert: So 14. Mai 2006, 13:18
Wohnort: Dorsten
Kontaktdaten:

Beitrag von JensH »

Aha. Klingt soweit schonmal recht positiv. Dann werde ich mich mal reinarbeiten. Eine kleine Bitte noch (wenn es die Zeit erlaubt): wo beim Query muss die Sache angepackt werden? Stehe momentan etwas auf dem Schlauch.

Im Query wird der Startarikel doch abgefragt (oder?):
"WHERE " .
" a.idcat = $idcat " .
" AND b.idlang = {$this->lang} " .
" AND c.startidartlang != b.idartlang " .
"ORDER BY " .
" $sortCriteria " .
"$limit" .
"");
Auch die Suche im Forum brachte mich nicht gerade weiter, obgleich einige interessante Artikel zu eben diesem Thema existieren. Vermutlich bin auch nur ich in Folge von Übernächtigung etwas verwirrt.

(Bin kein großartiger php-Profi; eher Einsteiger.) :oops:

Gruß
JensH
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

nein, genau dadurch wird er ausgeschlossen. einfach genau die fette zeile entfernen, dann ist auch der startartikel mit dabei...
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
JensH
Beiträge: 6
Registriert: So 14. Mai 2006, 13:18
Wohnort: Dorsten
Kontaktdaten:

Beitrag von JensH »

Ok - Das war peinlich. Werde mich wohl tiefer in PHP reinknien müssen. Aber besten Dank, vorallem für die superschnelle Unterstützung.

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

Beitrag von HerrB »

Hinweis: Diese Lösung gilt nur bei neuen Installationen auf Basis V4.6.x oder wenn $cfg["is_start_compatible"] = false; (siehe contenido/includes/config.php).

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
moin
Beiträge: 20
Registriert: Di 15. Aug 2006, 19:38
Kontaktdaten:

Klick auf das gleiche?

Beitrag von moin »

Hallo,

ich habe das Ding mal ausprobiert. Sieht ganz gut aus aber wenn ich auf den Button klicke , komme ich auf die gleiche Seite mit den Artikeln? !?!

WO muss ich den den "LAngtext udn den Kurztext eingeben?

Gibt es auch eine Möglichkeit weitere Infos z.B. zur Quelle einzugeben?
Thorsten G.
Beiträge: 124
Registriert: Do 14. Jul 2005, 22:37
Kontaktdaten:

Beitrag von Thorsten G. »

kummer hat geschrieben:und um den aktuellen artikel auszublenden müsste nur bei der iteration eingegriffen und der aktuelle artikel mit einer if-prüfung ausgeschlossen werden.
Ertsmal auch an dieser Stelle meinen verbindlichsten Dank an kummer für dieses und andere Module.

Dass die iteration die Wiederholung resp. die Schleife ist, in der die Artikelliste generiert wird, habe ich schon rausgefunden. Wie so eine if-Abfrage gecodet werden muss, weiß ich leider nicht. Wenn mal jemand der Profis GAAAANZ viel Zeit hat, würde ich mich über einen Tipp freuen.

Ich möchte dabei den aktuellen Artikel nicht ausblenden, sondern mit einer anderen Klasse versehen.

So funktioniert es jedenfalls nicht:

Code: Alles auswählen

$articleList = new articleList("CMS_VALUE[1]");
$articleList->setBefore('[...]');
$articleList->setAfter('');

if ($db->f("idcat") == $idcat) { 
$articleList->setTeaserMask('
     <div class="navi" style="margin-left:30px;">
       <a class="navileft_active" style="font-size:0.8em;" href="{link}">
        {teaser}</a></div>');
 } 

else { 
$articleList->setTeaserMask('
<div class="navi" style="margin-left:30px;">
<a class="navileft_passive" style="font-size:0.8em;" href="{link}">{teaser}</a></div>'); }

echo $articleList->getArticleList('created', false);
?>
SG
TG
Gesperrt