Как я, не зная YII2, виджет писал.

Прекрасным днём ничего в офисе не предвещало беды, как вдруг пришёл маркетолог Серёжа с кучей всего, что хочет видеть их отдел на сайте. Серёжа принёс с собой кучу бумажек, а которых наши «дизайнеры» передают свои макеты…

И так, как я реализовывал виджет, позволяющий отобразить 3 последних записи из рубрики, включая заголовок, имя респондента, а также, его фото. Проблема заключалась в том, что мне только достался этот монстр-сайт, который в свою очередь является злым самописом на YII2, с которым я, собственно, и не работал никогда.


Сразу предупрежу: то, что Вы увидите далее может Вас шокировать, напугать, подтолкнуть к самоубийству. Смелых же попрошу всё досконально прокомментировать, можно даже с проклятиями.
Подсмотрев в документацию я обнаружил, как yii2 позволяет составлять запросы и засунул в модель что-то вроде:

{
    public function getSomePosts($count, $rubricId)
    {
        $rows = (new \yii\db\Query())
            ->select(['id', 'title'])
            ->from(ArticleBase::tableName())
            ->where(['`rubric_id`'=>$rubricId])
            ->orderBy('date DESC')
            ->limit($count)
            ->all();
        return $rows;
    }

}

Дёргаем из БД необходимые данные. Вы спросите: «А где же имя, фотка и всё остальное?  Узнаете далее.

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

<?php
$latestexpert = new Experts;
$posts = $latestexpert->getSomePosts(3,114);
?>

<?php for($i=0; $i<3; $i++ ){ ?>
    <div class="experts-widget">
        <?php
        echo "<div class=\"experts-widget-image\"><img class=\"experts-widget-image\" src=\"http://services.zagorod.spb.ru/images/preview/290x290x_nocrop_".$posts[$i]['id'].".jpg\"></div>";
        echo "<div class=\"experts-widget-text\">";
        echo "<p><strong>Мнение:</strong></p>";
        echo "<p>".substr($posts[$i]['title'] , strpos($posts[$i]['title'], ":")+1, strlen($posts[$i]['title']))."</p>";
        echo "<a href=\"../articles/".$posts[$i]['id']."\"><p>подробнее...</p></a>";
        echo "<p><span>".substr($posts[$i]['title'] , 0, strpos($posts[$i]['title'], ":"))."</span></p>";
        echo "</div><div class=\"clear\"></div>";?>
    </div>
<?php } ?>

С foreach у меня что-то не сложилось, так что я решил сделать for. Функция getSomePosts `возвращает массив из массивов, где каждый элемент индексированного массива $posts представляет собой ассоциативный массив, содержащий в себе результат запроса в модели, а именно [id] и [title]. Другие поля мне не нужны.
Уже существует определённая структура хранения изображений.   Каждый файл содержит в имени id статьи, к превью которой он относится, что упрощает задачу.

Также весьма интересный момент в том, что заголовок каждой статьи представляет собой что-то вроде «Имя респондента: тема беседы». Как конченный профессиональный разработчик я просто оторвал имя от заголовка и пихнул его в <p></p>.
И вот, что получилось:
Screenshot_54
Спасибо за бесполезно потраченное время, господа.