Можно ли отображение grid перенести из отдельного файла в backend.php

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

работа с датагридами

#1 1 февраля 2025 в 14:14

Пытаюсь работать с датагридами. Сделал простейший вывод своей таблицы аналогично этому. Работает. Но хочется несколько полезных строчек записать не в отдельный экшен, а прямо в backend.php. Как?

C одной стороны вроде удобно, когда все разложено по файловой структуре. Но большое количество объектов конкретно меня выбивает из колеи, ведь их надо держать в голове. И так приходится то и дело ездить из controllers в languages, а оттуда в templates, по пути забывая куда ехал 🤣 так и методы по папкам и файлам разложены.

Так что для меня это важно. Надеюсь на понимание.

#2 1 февраля 2025 в 15:09

Но хочется несколько полезных строчек записать не в отдельный экшен, а прямо в backend.php. Как?

IamB

При подключении трейта сделать алиасы методов, того же run и вызвать его в экшене.

Но это плохая практика программирования, крайне плохая. Откройте самый феншуйный Symfony и убедитесь соблюдению всех принципов программирования. Почитайте про SOLID. В вашем случае как минимум будет нарушен принцип единственной ответственности. Так же подумайте, а что если вы позже захотите что-то изменить, вам постоянно надо будет ходить в трейт, чтобы убедиться в отсутствии накладок. А если вы захотите новый экшен с другим гридом? И так далее. Подходы к программированию выработаны годами, описаны и не зависят от языка.

#3 1 февраля 2025 в 15:54

При подключении трейта сделать алиасы методов, того же run и вызвать его в экшене.

Fuze

Вот готовый трейт я в принципе не хотел трогать, «и заметьте, вы сами это предложили»©

Благодарю за ответ.

#4 1 февраля 2025 в 18:13

Вот готовый трейт я в принципе не хотел трогать

IamB

А зачем его трогать. Я имел в виду что-то вроде этого:

  1. class backendYoucontroller extends cmsBackend {
  2.  
  3. use icms\traits\controllers\actions\listgrid {
  4. run as private traitRun;
  5. }
  6.  
  7. public function prepareRun() {
  8.  
  9. $this->table_name = 'table_name';
  10. $this->grid_name = 'grid_name';
  11.  
  12. }
  13.  
  14. public function actionYouAction() {
  15. return $this->traitRun();
  16. }
  17.  
  18. }
  19.  

«и заметьте, вы сами это предложили»©

IamB

Лишь ответил на вопрос

#5 1 февраля 2025 в 19:43

Благодарю за код, но завелось сразу.

Fatal error: cmsController and icms\traits\controllers\actions\listgrid define the same property ($title) in the composition of backendQscroll. However, the definition differs and is considered incompatible. Class was composed in /home/yozh/php-apps/icms216.loc/system/controllers/qscroll/backend.php on line 3 
В 3 линии:  class backendQscroll extends cmsBackend

Наверно для меня правильнее будет воспользоваться документацией и шаг за шагом все написать.

#6 1 февраля 2025 в 19:52

define the same property ($title) in the composition of backendQscroll

IamB

Тогда откладывается мой совет. Свойство title есть и в контроллере, забыл про него. В общем, используйте отдельный экшен. Это как раз та проблема, о чём я писал выше. frontend.php и backend.php это общий класс для всех экшенов и хуков контроллера. В нём должны быть методы, которые используются в более чем одном месте в целом в контроллере.

#7 1 февраля 2025 в 20:11

Раньше я пытался делать так

  1. class backendQscroll extends cmsBackend {
  2. use icms\traits\controllers\actions\listgrid;
  3. /* и т.д. */
  4. }

Но получал ту же ошибку. По крайней мере ясно, что применение данного трейта как универсальной конструкции проблематично.

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.