denisbondar
@denisbondar
Python, PHP developer

Как разбить сложное представление на части?

Имеем представление, содержащие множество разных таблиц, связанных с различными сущностями. Для примера: информация о клиенте, а также связанная с ним информация: контактные данные, приобретенные товары, комментарии, логи, сообщения в техподдержку, сообщения рассылок и другое, связанное с этим клиентом. Все это рендерится одним файлом представления и содержит множество GridView, связанных с различными провайдерами данных.

Также имеем жирный контроллер, который рендерит это представление и формирует огромное количество провайдеров данных и моделей фильтров для него, в результате чего в представление передается огромный массив из моделей фильтров и провайдеров данных.
В представлении каждая табличка обернута в pjax и, на первый взгляд, проблемы при фильтрации/сортировки/пагинации отдельной таблицы не возникает. Но, по факту, отрабатывает толстое действие контроллера, формирующее множество запросов к БД и инстанцирующее множество не нужных для этой одной таблицы моделей.

Как правильно разбить представление на части?
Была мысль для каждой сущности выделить отдельный контроллер, который позволял бы взаимодействовать изолированно с этой сущностью (добавлять новые контактные данные, удалять старые, обновлять, отображать), а для каждой таблички, взаимодействующей с этим контроллером, выделить свой файл представления. При этом должен быть основной контроллер, формирующий главный каркас представления, внутри которого рендерятся эти отдельные файлы представлений с табличками. Что-то в таком роде:
<div class="panel">
    <div class="panel-body">
        <div class="pjax">
            <?= $this->render('first_grid_view') ?>
        </div>
    </div>
</div>
<div class="panel">
    <div class="panel-body">
        <div class="pjax">
            <?= $this->render('second_grid_view') ?>
        </div>
    </div>
</div>
<div class="panel">
    <div class="panel-body">
        <div class="pjax">
            <?= $this->render('third_grid_view') ?>
        </div>
    </div>
</div>


Какие есть практики для реализации подобных сложных интерфейсов без применения фронтенд фреймворков?
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
YokiToki
@YokiToki
PHP-разработчик
Не совсем понял суть вопроса, но возможно стоит посмотреть сюда https://github.com/yiisoft/yii2/blob/master/docs/g...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
dmitriylanets
@dmitriylanets
веб-разработчик
я решаю путем выделение функционала в модули которые содержат: контроллер и шаблон
вызов в php шаблоне делаю: <?=Module("module_name")?>
или в twig: {{module("module_name")}}
Ответ написан
qonand
@qonand
Software Engineer
А в чем проблема использовать описанную Вами конценпцию? это вполне нормальный вариант аля HMVC
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Делайте тонкий контроллер. А датапровайдеры формируйте в моделе. По сути у Вас есть модель пользователя и куча связей и методов в моделе. При этом толстая модель и тонкий контроллер.
С view все верно, разбиваете на много вью, что бы читабельнее код был. Некоторые из этих вью возможно правильнее оформить не как отдельное вью, а как виджет, а может быть несколько из них можно объеденить в 1 настраиваемый виджет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы