[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
bestimmte Anzahl an Artikel soll in ein div - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Maw.
Beiträge: 129
Registriert: 4. Aug 2008, 10:05
Kontaktdaten: Website

bestimmte Anzahl an Artikel soll in ein div

18. Jan 2010, 18:50

Hallo,
gibt es solch eine Lösung:
Ich hab eine Kategorie, dort drinnen sind 25 Artikel.
Nun möchte ich im Startartikel dieser Kategorie ein Modul einbinden, das alle Artikel (25 stück) dieser Kategorie aufgelistet werden (dazu gibts ja Artikellisten-Module)
Jedoch sollen diese immer gruppiert zu 5 Stück in ein Div gepackt werden:

Code: Alles auswählen

<div class="artikel">
    Artikel mit der Priorität 1-5
</div>
<div class="artikel">
    Artikel mit der Priorität 2-10
</div>
Für einen PHP-Könner bestimmt eine Leichtigkeit, für mich als Designer jedoch nicht.

Lg Maw

Benutzeravatar
timo.huber
Beiträge: 305
Registriert: 22. Dez 2009, 13:26

18. Jan 2010, 22:17

Hallo,

viele Wege führen nach Rom. Dies ist einer davon.
Damit kannst du bestimmt etwas anfagen. Den Quelltext, das Modul, oder wie auch immer du das machen willst, einfach einfügen.
Deim zweiten div erhöhst du einfach $i (also die Startposition).
Also z.b. $i = 5

Code: Alles auswählen

<?php

$cat = OOCategory::getCategoryById($this->getValue("category_id"));
$article = $cat->getArticles();

$zaehler = 0;
$anzahlProDiv = 3;

if (is_array($article)) 
{
  for($i = 0; $i < count($article); $i++) 
  {

if ($zaehler >= $anzahlProDiv) break;

$var = $article[$i];
    $articleId = $var->getId();
    $articleName = $var->getName();
    $articleDescription = $var->getDescription();
    if (!$var->isStartpage()) 
    {
      echo '<a href="'.rex_getUrl($articleId).'" class="faq">'.$articleName.'</a><br />';

$zaehler ++;
    }
  }
}

?>
Wenn du dir das noch schön per Modul mit Eingaben usw. machen willst ist das natürlich komfortabler ;)

MFG

Maw.
Beiträge: 129
Registriert: 4. Aug 2008, 10:05
Kontaktdaten: Website

19. Jan 2010, 13:58

Danke für deine Antwort, bei mir ist das Problem, wenn ich PHP Code sehe, weiß ich zwar ungefähr was er macht, jedoch selbst schreiben könnt ichs nicht:)

Und ich glaube, hier werden, wenn ich z.B. $i=5 setze 5 mal hintereinander div boxen erstellt wo jeweils drinnen der Titel des jeweiligen Artikels verlinkt auf die artikel url ist.

Auch toll, jedoch nicht ganz das was ich in diesem Fall suche und selber abändern kann ichs leider nicht.

Wenn ich z.B. 10 Artikel in einer Kategorie habe und jeweils 5 in einem div angezeigt werden sollen, brauch ich also zwei div´s wo jeweils 5 Artikel direkt erscheinen, also nicht nur der link zum Artikel, sondern der artikel soll direkt angezeigt werden.

Also:

Code: Alles auswählen

<div class="artikel">
Das ist der Inhalt aus Artikel 1
Das ist der Inhalt aus Artikel 2
Das ist der Inhalt aus Artikel 3
Das ist der Inhalt aus Artikel 4
Das ist der Inhalt aus Artikel 5
</div>


<div class="artikel">
Das ist der Inhalt aus Artikel 6
Das ist der Inhalt aus Artikel 7
Das ist der Inhalt aus Artikel 8
Das ist der Inhalt aus Artikel 9
Das ist der Inhalt aus Artikel 10
</div>
Und wenn ich als $i=3 einstelle, dann werden automatisch 4 div boxen erstellt, wo jeweils 3 Artikel darin abgebildet werden und einmal logischerweise nur ein Artikel in der letzten div box.

Geht das auch?

Benutzeravatar
timo.huber
Beiträge: 305
Registriert: 22. Dez 2009, 13:26

19. Jan 2010, 14:42

Hallo,

das $i = ... gibt nur an AB welchem Index die Auflistung beginnt.
Somit weisst du z.b. dass in deiner vorherigen DIV-Bock 5 Artikel erschienen sind, und in der nächsten Box Artikel ab dem 6. Artikel erscheinen sollen (vorsicht, arrays beginnen mit 0)

Ich habe nun einmal Testweise ein 2 Spaltiges Template erstellt.
2-Spaltig im Sinne von 2 Ctypes.

In die 1 Ctype Spalte erstelle ich einen neuen Artikel mit einem Modul das PHP Code erwartet:

Code: Alles auswählen

<?php 

$cat = OOCategory::getCategoryById($this->getValue("category_id")); 
$articles = $cat->getArticles(); 

$zaehler = 0; 
$anzahlProDiv = 3; 
$artikelStart = 0;

if (is_array($articles)) 
{ 
  for($i = $artikelStart;  $i < count($articles); $i++) 
  { 

if ($zaehler >= $anzahlProDiv) {
break; 
}

$cur = new rex_article();

    if (!$articles[$i]->isStartpage()) 
    { 
     $cur->setArticleId($articles[$i]->getId());
     echo $cur->getArticle();

$zaehler ++; 
    } 
  } 
} 

?>

<hr />


Und in der 2. Ctype Spalte folgener Artikel:

Code: Alles auswählen

<?php 

$cat = OOCategory::getCategoryById($this->getValue("category_id")); 
$articles = $cat->getArticles(); 

$zaehler = 0; 
$anzahlProDiv = 3; 
$artikelStart = 3;

if (is_array($articles)) 
{ 
  for($i = $artikelStart;  $i < count($articles) ; $i++) 
  { 

if ($zaehler >= $anzahlProDiv) {
break; 
}

$cur = new rex_article();

    if (!$articles[$i]->isStartpage()) 
    { 
     $cur->setArticleId($articles[$i]->getId());
     echo $cur->getArticle();

$zaehler ++; 
    } 
  } 
} 

?>

<hr />
Sollte eigentlich so funktionieren.

MFG
Zuletzt geändert von timo.huber am 19. Jan 2010, 18:31, insgesamt 1-mal geändert.

zehbaeh
Beiträge: 556
Registriert: 17. Okt 2006, 11:52
Wohnort: Solingen

19. Jan 2010, 17:14

Für einen übersichtlichen globalen Namensraum packe ich sowas immer in Funktionen. Für deinen Zweck würde das so aussehen:

Code: Alles auswählen

<?php
if (FALSE === function_exists('fn_REX_MODULE_ID')) {
/**
 * Get chunks of articles from a category.
 *
 * @param integer $catId      id of the category to collect articles from
 * @param integer $clang      id of the language
 * @param array   $surround   array of (starttag, endtag) to surround the chunks with
 * @param integer $chunkSize  number of articles per chunk
 * @param integer $ctype
 * @return array
 */
function fn_REX_MODULE_ID_($catId, $clang, $surround, $chunkSize, $ctype = 1)
{
    $articles = array_filter(OOArticle::getArticlesOfCategory($catId, $clang), 'fn_REX_MODULE_ID_filterCurrentArticle');
    $result = array();
    foreach (array_chunk($articles, $chunkSize) as $chunk) {
        $result[] = $surround[0];
        foreach ($chunk as $article) {
            $content = new rex_article($article->getId(), $article->getClang());
            if (NULL !== $content) {
                $result[] = $content->getArticle($ctype);
            }
            elseif ($REX['REDAXO'] && error_reporting() & E_USER_WARNING) {
                trigger_error(sprintf('invalid article id:%d in module id:REX_MODULE_ID', $article->getId()), E_USER_WARNING);
            }
        }
        $result[] = $surround[1];
    }
    return $result;
}
function fn_REX_MODULE_ID_filterCurrentArticle($article)
{
    return REX_ARTICLE_ID != $article->getId();
}
}
echo implode("\n", fn_REX_MODULE_ID_(REX_CATEGORY_ID, REX_CLANG_ID, array('<div class="article">', '</div>'), 3));
?>
EDIT: Korrektur.
Zuletzt geändert von zehbaeh am 19. Jan 2010, 20:32, insgesamt 2-mal geändert.

Maw.
Beiträge: 129
Registriert: 4. Aug 2008, 10:05
Kontaktdaten: Website

19. Jan 2010, 18:02

also die erste Lösung von timo.huber hab ich gleich probiert - hat auch super funktioniert.

die zweite lösung von zehbaeh blicke ich zwar mangels meinen Kenntnissen nicht durch, scheint aber noch eine edlere Variante zu sein, da hier keine Spalten angelegt werden müssen.

Nur scheint es hier ein Problem zu geben, und zwar wird das div nur einmal angezeigt und die ersten 5 Artikel werden ausgegeben. Es geht also nicht weiter, dass ein zweites div geöffnet wird, wo artikel 6-10 ausgegeben werden.

Wenn du/ihr mir das bitte nochmal schauen könnt, seid ihr meine Helden des Tages :)

Benutzeravatar
timo.huber
Beiträge: 305
Registriert: 22. Dez 2009, 13:26

19. Jan 2010, 18:35

Hallo,

beim ersten bitte noch das ändern (falls noch nicht getan)

Code: Alles auswählen

$artikelStart = 1; 
in

Code: Alles auswählen

$artikelStart = 0; 
Das mit den Ctypes ist natürlich (wieder einmal) nur ein Beispiel.
Du kannst natürlich auch ein Modul anlegen, welches die erforderlichen Angaben animmt, und dieses dann beliebig oft in deine Seite einfügen.
Dann wäre da nur noch die Sache die Ausgaben innerhalb eines Artikels zu positionieren.

Zu deinem aktuellen Problem kann ich jetzt leider nichts sagen...

Du hast 2 verschiedene Blöcke eingefügt? Beide male mit dem oben genannten PHP Code?

Hast du vllt. einen Testlink? Oder kannst deinen spezifischen Code posten?

MFG

Maw.
Beiträge: 129
Registriert: 4. Aug 2008, 10:05
Kontaktdaten: Website

19. Jan 2010, 20:14

Guten Abend,
ja den artikelstart habe ich geändert, wie du geschrieben hast, dass arrays bei 0 anfangen.

Zum aktuellen Problem - die 2 verschiedenen Blöcke, beziehst du das auf deinen Code, oder auf den von "zehbaeh"?

Weil das "Problem" besteht bei zehbaeh´s code und dort muss ich ja nicht 2 verschiedene Blöcke einfügen, oder?

Ich hab den Code durchgeschaut, und finde nichts, was ich individuell auf mich anpassen müsste bis auf die Zahl am Schluss, die die Anzahl der Artikel in einem Div definiert.

Und ich hab jetzt ein div und dort drinnen 5 Artikel. Fehlt noch das zweite div mit den restlichen 5 Artikel, was ich noch nicht angezeigt bekomme...

Schönen Abend.

zehbaeh
Beiträge: 556
Registriert: 17. Okt 2006, 11:52
Wohnort: Solingen

19. Jan 2010, 20:27

Hmm...mein Fehler, Quelltext ist korrigiert.

PS: Artikel die offline sind werden nicht berücksichtigt. Falls das gewünscht wird, muss der Funktion "getArticlesOfCategory" ein dritter Parameter IMHO FALSE übergeben werden. Das müsstest Du aber gerade selbst bei der entsprechenden Funktioniosdeklaration nachschauen.

Maw.
Beiträge: 129
Registriert: 4. Aug 2008, 10:05
Kontaktdaten: Website

19. Jan 2010, 20:31

ja das ist ja spitze, genauso hab ich mir das vorgestellt.

Ich wünschte ich könnte euch auch einen Gefallen (im grafischen Bereich) tun...

Vielen Dank euch für die Hilfe!
Schönen Abend

Zurück zu „Allgemeines [R4]“