Pimcore:按多个类类型检索单个对象列表



我目前有一个控制器,它从Pimcore对象中提取对象,确切地说是样本数据所展示的。

我们需要通过这个构建来实现的是,允许将"特色"类别分配给任何NewsArticle对象或EventsArticle。我们需要从NewsArticleEventsArticle对象中提取一个组合列表,这些对象也分配了Featured类别。我们需要跟踪此列表中返回的所有ID,并将它们从单个跟踪列表中排除,这样它们就不会在同一页面上显示两次。

这是我们的两个单轨列表,它们按预期工作,受文档中自定义属性的限制。

要求:

  • featured类别筛选
  • 防止任何帖子被列出两次
  • 能够按日期ascdesc进行排序

// TODO: List Featured News and Events Objects...
// $this->view->featured = $featuredList->getObjects();
// List News Objects...
$newsList = new ObjectNewsArticleListing();
$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 ObjectEventsArticleListing();
$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();

这种方法将为您提供特色列表:

$featuredListObj = PimcoreModelObject::getByPath("featured-list");
$featuredListObjId = $featuredListObj->getId();
$eventClassId = PimcoreModelObjectClassDefinition::getByName("news")->getId();
$newsClassId = PimcoreModelObjectClassDefinition::getByName("event")->getId();
$combinedListing = new PimcoreModelObjectListing();
$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>";
}

经过一番努力,我找到了一种方法。它可能不是最优的,但它有效并完成了任务。

我之所以发现这种方法最有效,是因为setCondition还会检查非目标类中可能没有的列,从而导致列表失败。

#
# Hybridized Featured Articles List
#
# Get News and Events Objects...
$hybridList = new ObjectListing();
$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 ObjectNewsArticleListing();
$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 ObjectEventsArticleListing();
$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();

最新更新