Создаешь круд компонента и его типов (карусель, контакты и на что фантазии хватит), делаешь выборку с базы данных. У компонента обязательно добавить type_id. Для каждого компонента создаешь виджет, с соотвествующей вью. Затем можно либо условями выводить , либо свитчем в index.php.
Я делаю так:
foreach ($components as $component) {
switch ($component->type) {
case Component::TYPE_CAROUSEL:
echo Carousel::widget(['id' => $component->id]);
break;
case Component::TYPE_BLOCKS:
echo Blocks::widget(['id' => $component->id]);
break;
case Component::TYPE_MAP:
echo Map::widget(['id' => $component->id]);
break;
case Component::TYPE_CONTACT:
echo Contact::widget(['id' => $component->id]);
break;
}
}
А при создании компонента можно использовать scenarios() для разных типов полей.