[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
getSlicesForArticleOfType nach REX-Sortierung ausgeben - 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/
Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

getSlicesForArticleOfType nach REX-Sortierung ausgeben

11. Mär 2011, 01:55

Hallo,

ich habe mit getSlicesForArticleOfType die Slices ausgelesen, diese kommen aber nicht nach der sortierung, wie sie die redakteure im backend einstellen können gelistet, sondern nach der reihenfolge, wie sie angelegt wurden.

Kann ich aus getSlicesForArticleOfType() resultierende arrays nach der backend-sortierung ausgeben oder geht das wirklich nur mit getNextSlice?
Viele Grüße
cukabeka

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

11. Mär 2011, 09:27

Hej,

wenn du mit Slices arbeiten möchtest, empfehle ich dir die SQL Abfrage direkt zu machen. OOArticleSlice arbeitet nur mit DB-Abfragen da nichts gecached wird.

Bei einer eigenen Abfrage erhälst du gleich das was du tatsächlich brauchst.

Ein Allgemeines Bspl.:

Code: Alles auswählen

'
SELECT        s.*
FROM          rex_article_slice AS s
  LEFT JOIN   rex_module AS m
    ON        s.modultyp_id=m.id
  LEFT JOIN   rex_article AS a
    ON        s.article_id=a.id
WHERE         a.clang="'.$clang.'"
  AND         s.article_id="'.$article_id.'"
  AND         s.clang="'.$clang.'"
  AND         s.revision="'.$slice_revision.'"
  AND         s.modultyp_id = "'.$module_id.'"
ORDER BY      s.re_article_slice_id
'
Beim SELECT würde ich notieren, was du tatsächlich von der DB brauchst.

vg Thomas

Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

11. Mär 2011, 21:04

Danke Thomas,

das hat für mich funktioniert.

Für alle, die was Ähnliches brauchen, hier meine funktionierende Lösung:

Code: Alles auswählen

			$qry = '
				SELECT        s.*
				FROM          rex_article_slice AS s
				  LEFT JOIN   rex_module AS m
				    ON        s.modultyp_id=m.id
				  LEFT JOIN   rex_article AS a
				    ON        s.article_id=a.id
				WHERE         a.clang="'.$REX['CLANG'].'"
				  AND         s.article_id="'.$art_id.'"
				  AND         s.clang="'.$REX['CLANG'].'"
				  AND         s.modultyp_id = "'.$mod_id.'"
				ORDER BY      s.re_article_slice_id
				';
			$sql = new sql();
			$array = $sql->get_array($qry);
Viele Grüße
cukabeka

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

12. Mär 2011, 10:41

Hej,

wie schon geschrieben, im SELECT nur die Felder notieren die tatsächlich gebraucht werden.

Besser wäre:
$REX['CLANG'] -> $REX['CUR_CLANG']
$sql->get_array -> $sql->getArray()

vg Thomas

Benutzeravatar
Gregor.Harlan
Entwickler
Beiträge: 1130
Registriert: 4. Jun 2007, 10:35
Wohnort: Frankfurt am Main

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

12. Mär 2011, 11:20

Hi,

und:
new sql -> new rex_sql

Gruß, Gregor
Friends Of REDAXO: Gemeinsame REDAXO-Entwicklung!

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

12. Mär 2011, 12:04

danke gregor. hatte ich übersehen.

nuun_ka
Beiträge: 13
Registriert: 15. Aug 2011, 17:32

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

15. Aug 2011, 17:38

OiOi!

Ich weiß alter Thread... aber es passt so gut:

Alles genannte klappt sehr gut - nur: wie komme ich dann an das entsprechende html des Slice?
Ich Sachen Redaxo-Datenbank... bin ich ein ziemlicher Noob. Entschuldigt also die Frage!


vielen Dank
Fabian

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 07:46

Hej und willkommen bei REDAXO,

du suchst getSlice()

vg Thomas

nuun_ka
Beiträge: 13
Registriert: 15. Aug 2011, 17:32

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 08:42

Guten Morgen Thomas!

Schonmal vielen Dank! Ich habs aber immer noch nich ganz verstanden :-(
Ich dachte "getSlice()" kann man nur innerhalb des OOF benutzen - und nich wenn ich die Sachen manuell per sql mache.

ich habs so versucht:

$array = $sql->getArray()
echo $array[4]->getSlice();

aber hat nicht funktioniert...
und was musss ich dann eigentlich oben im SELECT angeben?

eine schönen Tag
Fabian

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 08:54

Hej,

das hängt jetzt ganz davon ab was du umsetzen möchtest.

Du könntest das obige Sql nehmen und das Result via Schleife durchgehen.

Code: Alles auswählen

foreach ($results as $result)
{
  $slice = OOArticleSlice::getArticleSliceById($result['article_id'], $result['clang']);
  echo $slice->getSlice();
}
Das müsstest du im Select natürlich mit angeben:
a.id AS article_id,
a.clang AS clang

Aber ich vermute mal, das es für dich widerum sinnvoller ist, es direkt via OOArticleSlice zu machen.
Hängt wirklich davon ab was du machen möchtest.

vg Thomas

nuun_ka
Beiträge: 13
Registriert: 15. Aug 2011, 17:32

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 09:08

Hey Thomas!

Ich schätze, dass dein Ansatz schon zu dem passt, was ich haben möchte: Ich will alle Slices eines Artikels in der richtigen Ordnung in nem Array haben. Das muss ich ja dann nur noch in der Schleife berücksichtigen.

Ich danke dir also vielmals und wünsche dir nen schönen Tag!
grüße
Fabian

nuun_ka
Beiträge: 13
Registriert: 15. Aug 2011, 17:32

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 09:29

Kannst du vll doch nochmal drüber schauen? (:)

$qry = '
SELECT a.id
FROM rex_article_slice AS s
LEFT JOIN rex_module AS m
ON s.modultyp_id=m.id
LEFT JOIN rex_article AS a
ON s.article_id=a.id
WHERE a.clang="'.$REX['CUR_CLANG'].'"
AND s.article_id="'.$this->getValue("article_id").'"
AND s.clang="'.$REX['CUR_CLANG'].'"
ORDER BY s.re_article_slice_id
';
$sql = new rex_sql();
$results = $sql->getArray($qry);

foreach ($results as $result)
{
$slice = OOArticleSlice::getArticleSliceById($result['id']);
echo $slice->getSlice();
}


liefert bei mir: Call to a member function getSlice() on a non-object in...,
wobei die IDs alle gleich 9 sind - warum auch immer...

danke
Fabian

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 10:23

9 ist deine Artikel id nicht die Slice id.
Hatte mich vorhin vertan. Du musst anstatt a.id -> s.id schreiben


Wenn du alle Slices eines Artikels ausgeben willst, kannst du auch den Artikel gleich komplett ausgeben.

Code: Alles auswählen

REX_ARTICLE[ID]
vg Thomas

nuun_ka
Beiträge: 13
Registriert: 15. Aug 2011, 17:32

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

16. Aug 2011, 10:43

So Thomas... jetzt funktionierts!!

Danke dir! Ich brauche die geordneten Slices, weil ich eine Navigation habe, in der man sich in den Slices vor und zurück bewegt - das könnte man natürlich auch mit Artikeln machen... in meinem Fall ist es mit Slices aber deutlich bedienungsfreundlicher (man muss nicht x Artikel erstellen usw...)


grüße und Danke
Fabian

feinshdens
Beiträge: 3
Registriert: 19. Apr 2012, 20:54

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

28. Mai 2012, 19:51

Hallo,

ein Jahr später, doch ich glaube bin hier meinem Ziel am nächsten.

Ich frage mich ob es normal ist das in der Tabelle 'rex_article_slice' die Spalte
  • 'revision' auf 0
und
  • 'next_article_slice_id' auf NULL
gesetzt ist?

Kann das der Grund für meine Schwierigkeiten mit der Sortierung der Sclices sein?

Wo in der DB wird die Reihenfolge der Sclices notiert?

Vielen Dank
Peter

Marshall
Beiträge: 70
Registriert: 8. Dez 2008, 22:05

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

29. Mai 2012, 16:48

Hallo, ich klinke mich hier kurz mal ein, da ich eben vor dem selben Problem stand.
Meine Lösung um z.B. alle Slices der Startseite mit einem bestimmten Modul (1), einer bestimmten Spalte (ctype = 2) auf allen weiteren Seiten auszugeben, wäre diese:

Code: Alles auswählen

<?php
$html = '';
if ("REX_ARTICLE_ID" != $REX['START_ARTICLE_ID']) {
	// Alle Startarticle Slices
	$startArticleSlices = OOArticleSlice::getSlicesForArticleOfType($REX['START_ARTICLE_ID'], 1, 'REX_CLANG_ID');
	if ($startArticleSlices) {
		// Collection
		$items = array();
		foreach($startArticleSlices as $slice) {
			// Beispiel: nur wenn in Spalte 2
			if ($slice->getCtype() == '2') {
				$item  = '<div class="textblock clearfix">';
				$item .= $slice->getValue(1);
				$item .= '</div>';
				// In Collection aufnehmen (_re_article_slice_id ist die Sortierung)
				$items[$slice->_re_article_slice_id] = $item;
			}
		}
		// Sortieren
		ksort($items);
		$html = implode('', $items);
	}
}
echo $html;
?>
Imho hätte man damit auch nur einen Query?

Viele Grüße

iherwig
Beiträge: 1
Registriert: 27. Jan 2014, 17:35

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

27. Jan 2014, 18:15

Hallo,
die Diskussion ist zwar schon eine Weile alt, ich habe aber auch gerade nach einer Möglichkeit gesucht, die Slices eines Artikels nach Backend-Sortierung auszugeben.

Soweit ich sehe, funktioniert die Sortierung per SQL nicht ohne weiteres, da die Slices als verkettete Liste ohne explizite Sortierspalte gespeichert sind (_re_article_slice_id zeigt auf das Prev-Slice). Deshalb können die Slices erst nach dem Laden sortiert werden, z.B. mit folgender Funktion:

Code: Alles auswählen

function getOrderedArticleSlices($articleId) {
  $slices = array();
  $slicesTmp = OOArticleSlice::getSlicesForArticle($articleId);
  if ($slicesTmp) {
    if (is_array($slicesTmp)) {
      $sliceMap = array();
      $sliceRefMap = array();
      foreach($slicesTmp as $slice) {
        $sliceMap[$slice->getId()] = $slice;
        $sliceRefMap[$slice->_re_article_slice_id] = $slice->getId();
      }
      $nextSlice = $sliceMap[$sliceRefMap[0]];
      while($nextSlice) {
        $slices[] = $nextSlice;
        $nextSlice = $sliceMap[$sliceRefMap[$nextSlice->getId()]];
      }
    }
    else {
      $slices = array($slicesTmp);
    }
  }
  return $slices;
}
Viele Grüße, Ingo

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

10. Feb 2014, 17:28

Die Funktion von @iherwig inkl. optionaler Filterung nach Module ID, Clang Berücksichtigung und ohne Notices:

Code: Alles auswählen

function getSortedSlices($articleId, $clang = false, $moduleId = 0) {
    $slices = array();
    $slicesTmp = OOArticleSlice::getSlicesForArticle($articleId, $clang);
    
    if ($slicesTmp) {
        if (is_array($slicesTmp)) {
            $sliceMap = array();
            $sliceRefMap = array();
            
            foreach ($slicesTmp as $slice) {
                $sliceMap[$slice->getId()] = $slice;
                $sliceRefMap[$slice->_re_article_slice_id] = $slice->getId();
            }

            $nextSlice = $sliceMap[$sliceRefMap[0]];

            while ($nextSlice) {
                $slices[] = $nextSlice;

                if (!isset($sliceRefMap[$nextSlice->getId()])) {
                    break;
                }
                
                $nextSlice = $sliceMap[$sliceRefMap[$nextSlice->getId()]];
            }
        } else {
            $slices = array($slicesTmp);
        }
    }

    if ($moduleId > 0) {
        $moduleSlices = array();
        
        foreach($slices as $slice) {
            if ($slice->getModuleId() == $moduleId) {
                $moduleSlices[] = $slice;
            }
        }

        return $moduleSlices;
    } else {
        return $slices;
    }
} 

Benutzeravatar
alsahh
Beiträge: 20
Registriert: 24. Feb 2011, 14:50
Kontaktdaten: ICQ

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

12. Mär 2014, 00:27

Danke schön, funktioniert einwandfrei.
RexDude hat geschrieben:Die Funktion von @iherwig inkl. optionaler Filterung nach Module ID, Clang Berücksichtigung und ohne Notices:

Code: Alles auswählen

function getSortedSlices($articleId, $clang = false, $moduleId = 0) {
    $slices = array();
    $slicesTmp = OOArticleSlice::getSlicesForArticle($articleId, $clang);
    
    if ($slicesTmp) {
        if (is_array($slicesTmp)) {
            $sliceMap = array();
            $sliceRefMap = array();
            
            foreach ($slicesTmp as $slice) {
                $sliceMap[$slice->getId()] = $slice;
                $sliceRefMap[$slice->_re_article_slice_id] = $slice->getId();
            }

            $nextSlice = $sliceMap[$sliceRefMap[0]];

            while ($nextSlice) {
                $slices[] = $nextSlice;

                if (!isset($sliceRefMap[$nextSlice->getId()])) {
                    break;
                }
                
                $nextSlice = $sliceMap[$sliceRefMap[$nextSlice->getId()]];
            }
        } else {
            $slices = array($slicesTmp);
        }
    }

    if ($moduleId > 0) {
        $moduleSlices = array();
        
        foreach($slices as $slice) {
            if ($slice->getModuleId() == $moduleId) {
                $moduleSlices[] = $slice;
            }
        }

        return $moduleSlices;
    } else {
        return $slices;
    }
}


RexTiger
Beiträge: 3
Registriert: 29. Aug 2014, 14:13

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

29. Aug 2014, 14:18

Hi und danke für diese Super Anleitung.
Ich benötige genau das, aber mit umgekehrter Sortierreihenfolge, so dass die neuesten Slices oben angezeigt werden. Wie mache ich das? Bzw. was muss ich an deisem Script ändern?
Danke und Gruß

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

29. Aug 2014, 14:25

Hi,

vor dieser Zeile:

Code: Alles auswählen

if ($moduleId > 0) {
theoretisch dass hier einfügen:

Code: Alles auswählen

$slices = array_reverse($slices);
Mal schauen obs auch praktisch so ist ;)

Marshall
Beiträge: 70
Registriert: 8. Dez 2008, 22:05

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

29. Aug 2014, 21:07

Wunderbar! Danke @ iherwig und rexDude.

RexTiger
Beiträge: 3
Registriert: 29. Aug 2014, 14:13

Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben

1. Sep 2014, 11:47

SUUUPER! Klappt, vielen Dank.

Zurück zu „Allgemeines [R4]“