2016-05-04 7 views
0

Ich habe derzeit einen Controller, der Objekte aus den Pimcore Objects genau wie die Beispieldaten zeigt.Pimcore: Einzelobjektliste nach mehreren Klassenarten abrufen

Was wir mit diesem Build erreichen müssen, ist zu ermöglichen, dass eine "Featured" -Kategorie einem beliebigen NewsArticle-Objekt oder EventSarticle-Objekt zugewiesen wird. Wir müssen eine kombinierte Liste aus den Objekten NewsArticle und EventsArticle erstellen, denen auch die Kategorie Featured zugewiesen ist. Wir müssen alle IDs, die in dieser Liste zurückgegeben werden, im Auge behalten und sie aus den einzelnen Titellisten ausschließen, damit sie nicht zweimal auf derselben Seite angezeigt werden.

Dies sind unsere zwei Single-Track-Listen, die wie erwartet funktionieren, begrenzt durch benutzerdefinierte Eigenschaften, die auf dem Dokument leben.

Anforderungen:

  • Filter nach featured Kategorie.
  • Verhindern, dass ein Beitrag zweimal aufgeführt wird.
  • Sortiert nach Datum asc oder desc.

// TODO: List Featured News and Events Objects... 
// $this->view->featured = $featuredList->getObjects(); 

// List News Objects... 
$newsList = new Object\NewsArticle\Listing(); 
$newsList->setOrderKey("date"); 
$newsList->setOrder("DESC"); 
$newsList->setLimit($this->document->getProperty('newsLimit')); 
// TODO: Exclude any IDs in $this->view->featured 
$this->view->news = $newsList->getObjects(); 

// List Events Objects... 
$eventsList = new Object\EventsArticle\Listing(); 
$eventsList->setOrderKey("date"); 
$eventsList->setOrder("DESC"); 
$eventsList->setLimit($this->document->getProperty('eventsLimit')); 
// TODO: Exclude any IDs in $this->view->featured 
$this->view->events = $eventsList->getObjects(); 

Antwort

1

Nach einiger Mühe Ich habe einen Weg gefunden, dies zu tun. Es ist vielleicht nicht optimal, aber es funktioniert und erledigt die Arbeit.

Der Grund, warum ich diesen Weg gefunden habe, um am effektivsten zu sein, ist, weil setCondition auch Nicht-Ziel-Klassen für Spalten überprüfen, die sie möglicherweise nicht haben, wodurch die Liste fehlschlägt.

# 
# Hybridized Featured Articles List 
# 

# Get News and Events Objects... 
$hybridList = new Object\Listing(); 
$hybridList->setCondition("o_className IN ('newsArticle', 'eventsArticle')"); 

# Get a list of IDs for News and Events that have the "featured" category... 
$featuredList = array(); 
foreach($hybridList->getObjects() as $obj) { 
    foreach($obj->categories as $obj_cat) { 
     if($obj_cat->o_key == 'featured') { 
      $key = strtotime($obj->date->date); 
      $key .= str_pad($obj->o_id, 8, "0", STR_PAD_LEFT); 
      $featuredList[ $key ] = $obj; 
      break; 
     } 
    } 
} 

# Sort and Slice the list... 
if($this->document->getProperty('featuredSort') == 'asc') { 
    ksort($featuredList); // Oldest First 
} else { 
    krsort($featuredList); // Newest First 
} 
$this->view->featured = array_slice($featuredList, 0, $this->document->getProperty('featuredLimit')); 

# 
# Audit the Hybridized Featured Articles List for IDs 
# 

$block_ids = array(); 
foreach($this->view->featured as $featured) { 
    $block_ids[] = (int)$featured->o_id; 
} 

# 
# News Articles List... 
# 

$newsList = new Object\NewsArticle\Listing(); 
$newsList->setOrderKey("date"); 
$newsList->setOrder($this->document->getProperty('newsSort') == 'asc' ? 'asc' : 'desc'); 
$newsList->setCondition('o_id NOT IN ('.implode(',', $block_ids).')'); 
$newsList->setLimit($this->document->getProperty('newsLimit')); 
$this->view->news = $newsList->getObjects(); 

# 
# Events Articles List... 
# 

$eventsList = new Object\EventsArticle\Listing(); 
$eventsList->setOrderKey("date"); 
$eventsList->setOrder($this->document->getProperty('eventsSort') == 'asc' ? 'asc' : 'desc'); 
$eventsList->setCondition('o_id NOT IN ('.implode(',', $block_ids).')'); 
$eventsList->setLimit($this->document->getProperty('eventsLimit')); 
$this->view->events = $eventsList->getObjects(); 
1

Dieser Ansatz wird Ihnen die vorgestellten Liste:

$featuredListObj = \Pimcore\Model\Object::getByPath("featured-list"); 
$featuredListObjId = $featuredListObj->getId(); 

$eventClassId = \Pimcore\Model\Object\ClassDefinition::getByName("news")->getId(); 
$newsClassId = \Pimcore\Model\Object\ClassDefinition::getByName("event")->getId(); 

$combinedListing = new Pimcore\Model\Object\Listing(); 
$combinedListing->setCondition("o_className IN ('event','news') AND o_id IN (
    SELECT o_id FROM object_$eventClassId WHERE categories LIKE '%,$featuredListObjId,%' 
    UNION SELECT o_id FROM object_$newsClassId WHERE categories LIKE '%,$featuredListObjId,%' 
)"); 

foreach ($combinedListing as $item) { 
    echo get_class($item) . "<br>"; 
} 
+0

Die WHERE = vorge 1 'wäre eine benutzerdefinierte Eigenschaft anstelle einer Kategoriezuordnung sein, richtig? – RedYetiCo

+0

In meinem Beispiel ist es ein boolesches Feld, aber es kann auch jede andere Art von Feld sein. Überprüfen Sie einfach, wie es in der Datenbank gespeichert ist und fragen Sie es ab. –

+0

Der Client müsste diese Eigenschaft auf dem Objekt erstellen und ausfüllen. Wir hatten gehofft, den Prozess zu vereinfachen, indem wir "featured" ein Objekt, das als Kategorie funktioniert, zur Verfügung stellen, um Drag-and-Drop-Einfachheit zu bieten. – RedYetiCo