Allereinfachste Artikelliste

Gesperrt
oio
Beiträge: 78
Registriert: So 13. Aug 2006, 20:38
Kontaktdaten:

Allereinfachste Artikelliste

Beitrag von oio »

schönen guten abend,

da ich recht frisch bin in contenido, von php wenig ahnung habe und mysql nur mit glück funktioniert:
könnten die routiniers mal hier drübersehen und evtl. kritisch kommentieren?

die von mir gefunden artikellisten waren mir alle zu overdosed. ausserdem war mir die verwendung von datenbankabfragen in for- und while-schleifen etwas suspekt.

diese artikelliste listet einfach aus der aktuellen kategorie die enthaltenen artikel auf.
nicht mehr - aber auch nicht weniger, hehe.

für mich eine gute grundlage, um weitere anforderungen einzubauen.

reiner output:

Code: Alles auswählen

<?php

$cfgList = array();
$cfgList["selCat"] = $idcat;
$cfgList["sortBy"] = "ARTLANG.artsort";
$cfgList["sortOrder"] = "DESC";
$cfgList["showStart"] = "false";

if (($cfgList["selCat"] != "0") && ($cfgList["selCat"] != "")){
  if (!is_object($db)) {
    $db = new DB_Contenido;
  }

  $sql  = "SELECT ARTLANG.idart, ARTLANG.idartlang, CONTENT.value, CONTENT.idtype, CONTENT.typeid FROM ";
  $sql .= $cfg["tab"]["cat_art"]." AS CATART, ";
  $sql .= $cfg["tab"]["art_lang"]." AS ARTLANG, ";
  $sql .= $cfg["tab"]["cat_lang"]." AS CATLANG, ";
  $sql .= $cfg["tab"]["content"]." AS CONTENT ";

  $sql .= "WHERE CATART.idcat = '".$cfgList["selCat"]."' ";
  $sql .= "AND ARTLANG.idlang = '".$lang."' ";
  $sql .= "AND ARTLANG.idartlang = CONTENT.idartlang ";
  $sql .= "AND ARTLANG.idart = CATART.idart ";
  $sql .= "AND CATLANG.idlang = ARTLANG.idlang "; 
  $sql .= "AND CATLANG.idcat = CATART.idcat "; 
  $sql .= "AND ARTLANG.idart = CATART.idart "; 
  $sql .= "AND ARTLANG.online = '1' ";

  if ($cfgList["showStart"] == "false") {
    $sql .= "AND CATLANG.startidartlang != ARTLANG.idartlang ";
  }
  $sql .= "ORDER BY ".$cfgList["sortBy"]." ".$cfgList["sortOrder"]."";

  $db->query($sql);

  if ($db->num_rows() > 0) {
    $i = 0;
    $listData = array(array());
    while ($db->next_record()) {
      $i = $db->f("idart");
      $listData[$i]["idart"] = $db->f("idart");
      $listData[$i]["idartlang"] = $db->f("idartlang");

      if (($db->f("idtype") == "2") && ($db->f("typeid") == "1")) {
        $listData[$i]["html_text"] = urldecode($db->f("value"));
      } elseif (($db->f("idtype") == "1") && ($db->f("typeid") == "1")) {
        $listData[$i]["headline"] = urldecode($db->f("value"));
      } elseif (($db->f("idtype") == "1") && ($db->f("typeid") == "2")) {
        $listData[$i]["subheadline"] = urldecode($db->f("value"));
      }
    }

    foreach($listData as $key => $i) {
      if((isset($listData[$key]["headline"])) && ($listData[$key]["headline"] != '') && ($listData[$key]["headline"] != ' ')) {
        echo "<h2>".$listData[$key]["headline"]."</h2>";
      }
      if((isset($listData[$key]["subheadline"])) && ($listData[$key]["subheadline"] != '') && ($listData[$key]["subheadline"] != ' ')) {
        echo "<strong>".$listData[$key]["subheadline"]."</strong>";
      }
      if((isset($listData[$key]["html_text"])) && ($listData[$key]["html_text"] != '') && ($listData[$key]["html_text"] != ' ')) {
        echo "".$listData[$key]["html_text"]."";
      }
    }
  }
}

?>
cu
cg
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

sieht ganz okay aus...
*** make your own tools (wishlist :: thx)
oio
Beiträge: 78
Registriert: So 13. Aug 2006, 20:38
Kontaktdaten:

Beitrag von oio »

danke für die abnahme und "segnung".

:D

am besten gefällt mir die performance durch nur eine db-abfrage und der geschickte durchlauf der db-ergebnisse, um sie in den array zu schieben.

habe ich bisher so nicht in den artikellisten gesehen.

cu
cg
trixta
Beiträge: 165
Registriert: Di 26. Apr 2005, 12:53
Kontaktdaten:

Beitrag von trixta »

wenn du aus content nur idtype/typeid 1 und 2 brauchst, warum schränkst du das nicht gleich in deiner datenbankabfrage ein?

ich bin jetzt nicht der php profi und hab mir nur dein modul kurz angeguckt, aber warum packst du in der while schleife alles in ein array, um dieses array, innerhalb einer foreach-schleife nochmals auszugeben. hättest du das nicht gleich in der while schleife machen können?
oio
Beiträge: 78
Registriert: So 13. Aug 2006, 20:38
Kontaktdaten:

Beitrag von oio »

trixta hat geschrieben:wenn du aus content nur idtype/typeid 1 und 2 brauchst, warum schränkst du das nicht gleich in deiner datenbankabfrage ein?
den value brauche ich natürlich auch ...
da das da oben zu einem meiner ersten sql-statements gehört, ist das aus bestehenden scripten zusammenklamüstert. der überhang ist aber ja nun nicht wirklich gross.
das ganze ist auch mehr als grundlage gedacht, um daraus andere listen zu entwickeln
trixta hat geschrieben:ich bin jetzt nicht der php profi und hab mir nur dein modul kurz angeguckt, aber warum packst du in der while schleife alles in ein array, um dieses array, innerhalb einer foreach-schleife nochmals auszugeben. hättest du das nicht gleich in der while schleife machen können?
dafür gibt es wiederum einige gute gründe:
1. klare struktur:
- initialisierung der vorgaben und variablen, etc.
- auslesen der daten in ein array
- ausgabe, bzw. nutzung der daten
2. sozusagen trennung der business logik vom view model im kleinen.
derzeit benutze ich diese basis um mit php-dom den array in xml zu wandeln und dann per xsl transformation auszugeben.
die ausgabe ist dabei in eine klasse ausgelagert, die ich für alle module wiederverwenden kann.
in den modulen brauche ich mir also immer nur den daten-array aufzubauen, ohne diesen ganzen wirrwarr von html- und php-code.

und: die zwei schleifen brauchen lange nicht so viel performance, wie die geloopten db-abfragen in den meisten anderen artikellisten.

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

Beitrag von HerrB »

der überhang ist aber ja nun nicht wirklich gross.
Na ja, das SQL-Statement liefert aus allen Artikeln einer Kategorie alle Elemente, um dann maximal 3 pro Artikel zu verwenden. Und natürlich muss die Schleife durch alle Elemente durchgehen, um die relevanten zu filtern.

D.h. bei 10 Artikeln mit 10 Elementen geht das Ganze 100 Elemente durch, um 30 ins Array zu schieben ... so ein Overhead von 70% ... :wink:

Aber ich will die Leistung nicht schmälern - wenn Du die Elemente noch ins SQL-Statement packst, ist es dann wirklich flink und wenn Du die switch-Anweisung zur Identifikation nehmen würdest, noch flexibler.

Übrigens sind die "overdosed" Artikellisten so gestaltet, damit sie ohne Programmierung eingesetzt werden können (sprich: für Einsteiger mit keinen oder wenig PHP-Kenntnissen). Egal, wie einfach eine Artikelliste gestaltet ist - es wird früher oder später die Frage nach Sortierung, Datumk, Kategorie usw. kommen. Sei standhaft... :wink:

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
trixta
Beiträge: 165
Registriert: Di 26. Apr 2005, 12:53
Kontaktdaten:

Beitrag von trixta »

@ oio
2. sozusagen trennung der business logik vom view model im kleinen
das ist überzeugend. bei einigen sachen kann man das stärker andenken. beispiel "hauptnavigation". hier werden ja in der regel die aktiven kategorien (inkl. ihrer vorfahren) ermittelt.

braucht man wenig später die selbe information für die breadcrumb wird sie id.r. neu ermittelt, obwohl die meisten infos bereits für diese da sein müßten (aber ungenutzt bleiben). ähnliches gilt für den artikel titel (unter eigenschaften).

bzgl. der value abfrage kommt es wie herrb schon gesagt hat, stark auf die seite und der menge der verwendten cms_typen an. wenn du das aber so fortführen willst, dann solltest du mal in die api classes/class.artikle.php gucken.
Gesperrt