protected function mergeNextStep($elements, $parent = null)
{
if (!($event = $this->event)) {
throw new \CException('No event set for step merging');
}
if (!($next_step = $this->getNextStep($event))) {
throw new \CException('No next step available');
}
$parent_id = $parent ? $parent->id : null;
//TODO: should we be passing episode here?
$extra_elements = $this->getElementsByWorkflow($next_step, $this->episode, $parent_id);
$extra_by_etid = array();
foreach ($extra_elements as $extra) {
$extra_by_etid[$extra->getElementType()->id] = $extra;
}
$merged_elements = array();
foreach ($elements as $element) {
$element_type = $element->getElementType();
$merged_elements[] = $element;
if (isset($extra_by_etid[$element_type->id])) {
unset($extra_by_etid[$element_type->id]);
}
}
foreach ($extra_by_etid as $extra_element) {
$extra_element->setDefaultOptions();
// Precache Element Type to avoid bug in usort
$extra_element->getElementType();
$merged_elements[] = $extra_element;
}
usort($merged_elements, function ($a, $b) {
if ($a->getElementType()->display_order == $b->getElementType()->display_order) {
return 0;
}
return $a->getElementType()->display_order > $b->getElementType()->display_order ? 1 : -1;
});
return $merged_elements;
}