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?
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/
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/
getSlicesForArticleOfType nach REX-Sortierung ausgeben
Viele Grüße
cukabeka
cukabeka
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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.:
Beim SELECT würde ich notieren, was du tatsächlich von der DB brauchst.
vg Thomas
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
'
vg Thomas
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
Danke Thomas,
das hat für mich funktioniert.
Für alle, die was Ähnliches brauchen, hier meine funktionierende Lösung:
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
cukabeka
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
- Gregor.Harlan
- Entwickler
- Beiträge: 1130
- Registriert: 4. Jun 2007, 10:35
- Wohnort: Frankfurt am Main
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
Hi,
und:
new sql -> new rex_sql
Gruß, Gregor
und:
new sql -> new rex_sql
Gruß, Gregor
Friends Of REDAXO: Gemeinsame REDAXO-Entwicklung!
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
danke gregor. hatte ich übersehen.
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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.
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
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();
}
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
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
$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
- Thomas.Blum
- Entwickler
- Beiträge: 5063
- Registriert: 24. Aug 2004, 22:11
- Wohnort: Dresden
- Kontaktdaten: Website
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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.
vg Thomas
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]
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
-
- Beiträge: 3
- Registriert: 19. Apr 2012, 20:54
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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
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
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
- 'next_article_slice_id' auf NULL
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
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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:
Imho hätte man damit auch nur einen Query?
Viele Grüße
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;
?>
Viele Grüße
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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:
Viele Grüße, Ingo
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;
}
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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;
}
}
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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; } }
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
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ß
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ß
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
Hi,
vor dieser Zeile:
theoretisch dass hier einfügen:
Mal schauen obs auch praktisch so ist
vor dieser Zeile:
Code: Alles auswählen
if ($moduleId > 0) {
Code: Alles auswählen
$slices = array_reverse($slices);
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
Wunderbar! Danke @ iherwig und rexDude.
Re: getSlicesForArticleOfType nach REX-Sortierung ausgeben
SUUUPER! Klappt, vielen Dank.