2016-05-04 3 views
0

В настоящее время у меня есть контроллер, который вытягивает объекты из объектов Pimcore точно так, как демонстрируют данные образца.Pimcore: получить список одиночных объектов несколькими типами классов

Мы должны выполнить эту сборку, чтобы обеспечить категорию «Избранные» для любого объекта NewsArticle или объекта EventsArticle. Нам нужно вывести объединенный список из объектов NewsArticle и EventsArticle, которые также имеют категорию Featured. Нам нужно отслеживать все идентификаторы, возвращаемые в этом списке, и исключать их из списков отдельных треков, чтобы они не отображались дважды на одной странице.

Это наши два отдельных списка треков, которые работают как ожидалось, ограниченные пользовательскими свойствами, которые находятся на документе.

Требования:

  • Фильтр по featured категории.
  • Предотвращение того, чтобы любой пост был указан дважды.
  • Умение сортировать по дате asc или 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(); 

ответ

1

После некоторого тяжелого труда я выяснял способ сделать это. Это может быть не оптимальным, но оно работает и выполняет свою работу.

Причина, по которой я нашел этот способ наиболее эффективным, заключается в том, что setCondition также проверит нецелевые классы для столбцов, которые они могут не иметь, в результате чего список завершится неудачей.

# 
# 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

Такой подход даст вам признакам список:

$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

Параметр 'WHERE признакам = 1' бы пользовательское свойство вместо присвоения категории, правильно? – RedYetiCo

+0

В моем примере это булево поле, но это может быть любой другой тип поля. Просто проверьте, как он сохраняется в базе данных и запрашивает его так. –

+0

Клиент должен был бы создать это свойство на объекте и заполнить его. Мы надеялись упростить процесс, сделав «признанным» объектом, функционирующим как категорию, чтобы обеспечить простоту перетаскивания. – RedYetiCo

 Смежные вопросы

  • Нет связанных вопросов^_^