Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Решение нестандартных задач на Symfony

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nkl
Отправлено: 26 Февраля, 2015 - 11:37:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Всем привет. Давеча я создавал тему, в которой жаловался на этот фреймворк. В частности, на способность решения нестандартных задач. и пользователь digi обещал помочь в решение этих самых задач. Так вот собственно задача возникла. Нужно создать админ-интерфейс для управления комментариями оставленными на сайте.

Вот код админ класса генерированный командой sonata:admin:generate:
PHP:
скопировать код в буфер обмена
  1.  
  2. class InCommentsAdmin extends Admin
  3. {
  4.         public $baseRouteName = 'Комментарии';
  5.         public $baseRoutePattern = 'comments';
  6.         public $translationDomain = 'comments';
  7.         /*protected $formOptions = array('validation_groups' => array(), 'cascade_validation' => true);
  8.         protected $datagridValues = array(
  9.                 //'_page' => 1,
  10.                 '_sort_order' => '', // sort direction
  11.                 '_sort_by' => 'rated DESC, id ASC' // field name
  12.         );*/
  13.        
  14.     /**
  15.      * @param DatagridMapper $datagridMapper
  16.      */
  17.     protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  18.     {
  19.         $datagridMapper
  20.             ->add('id')
  21.             ->add('text')
  22.             /*->add('leftKey')
  23.             ->add('rightKey')
  24.             ->add('level')
  25.             ->add('answerFor')
  26.             ->add('createdDt')
  27.             ->add('published')
  28.             ->add('deleted')
  29.             ->add('editDt')
  30.             ->add('editReason')
  31.             ->add('authorGuestName')
  32.             ->add('originalText')
  33.             ->add('objectType')
  34.             ->add('objectId')
  35.             ->add('branchEditDt')
  36.             ->add('rootId')
  37.             ->add('ip')*/
  38.         ;
  39.     }
  40.  
  41.     /**
  42.      * @param ListMapper $listMapper
  43.      */
  44.     protected function configureListFields(ListMapper $listMapper)
  45.     {          
  46.         $listMapper
  47.                         ->add('commentAuthor','string',array(
  48.                                 'template' => '***AdminBundle:Admin:list_comment_author.html.twig',
  49.                         ))
  50.                         ->add('author')
  51.             ->add('text')
  52.             ->add('createdDt')
  53.             ->add('published')
  54.             ->add('deleted')
  55.             ->add('editDt')
  56.             ->add('editReason')
  57.             ->add('originalText')
  58.             /*->add('objectType')
  59.             ->add('objectId')*/
  60.             ->add('_action', 'actions', array(
  61.                 'actions' => array(
  62.                     'show' => array(),
  63.                     'edit' => array(),
  64.                     'delete' => array(),
  65.                 )
  66.             ))
  67.         ;
  68.     }
  69.  
  70.     /**
  71.      * @param FormMapper $formMapper
  72.      */
  73.     protected function configureFormFields(FormMapper $formMapper)
  74.     {
  75.         $formMapper
  76.             ->add('id')
  77.             ->add('text')
  78.             ->add('leftKey')
  79.             ->add('rightKey')
  80.             ->add('level')
  81.             ->add('answerFor')
  82.             ->add('createdDt')
  83.             ->add('published')
  84.             ->add('deleted')
  85.             ->add('editDt')
  86.             ->add('editReason')
  87.             ->add('authorGuestName')
  88.             ->add('originalText')
  89.             ->add('objectType')
  90.             ->add('objectId')
  91.             ->add('branchEditDt')
  92.             ->add('rootId')
  93.             ->add('ip')
  94.         ;
  95.     }
  96.  
  97.     /**
  98.      * @param ShowMapper $showMapper
  99.      */
  100.     protected function configureShowFields(ShowMapper $showMapper)
  101.     {
  102.         $showMapper
  103.             ->add('id')
  104.             ->add('text')
  105.             ->add('leftKey')
  106.             ->add('rightKey')
  107.             ->add('level')
  108.             ->add('answerFor')
  109.             ->add('createdDt')
  110.             ->add('published')
  111.             ->add('deleted')
  112.             ->add('editDt')
  113.             ->add('editReason')
  114.             ->add('authorGuestName')
  115.             ->add('originalText')
  116.             ->add('objectType')
  117.             ->add('objectId')
  118.             ->add('branchEditDt')
  119.             ->add('rootId')
  120.             ->add('ip')
  121.         ;
  122.     }
  123. }
  124.  

Обратите внимание, на строки 47 и 50 (->add('commentAuthor')...->add('author')). Там уже мой костыль небольшой, не обращайте внимание. Так собственно в чем загвоздка, комменты на сайте могут поступать как от зареганых пользователей так и просто от тех кто ввел свое имя и капчу. В entity inСomments есть такие методы:
PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3.      * @var \VbUser
  4.      *
  5.      * @ORM\ManyToOne(targetEntity="***\UserBundle\Entity\User")
  6.      * @ORM\JoinColumns({
  7.      *   @ORM\JoinColumn(name="author_id", referencedColumnName="userid")
  8.      * })
  9.      */
  10.     private $author;
  11.  
  12. /**
  13.      * @var string
  14.      *
  15.      * @ORM\Column(name="author_guest_name", type="string", length=255, nullable=true)
  16.      */
  17.     private $authorGuestName;
  18.  
  19. //*****
  20.  
  21.        /**
  22.          *
  23.          * @return the VbUser
  24.          */
  25.         public function getAuthor() {
  26.                 return $this->author;
  27.         }
  28.         /**
  29.          *
  30.          * @return the string
  31.          */
  32.         public function getAuthorGuestName() {
  33.                 return $this->authorGuestName;
  34.         }


getAuthor() - возвращает объект VbUser, а getAuthorGuestName() - имя гостя. Задач состоит в том, что бы в списке комментов админки был один столбец Автор, а в него выводилось либо имя гостя либо getAuthor()->getUsername(); Причем username должен быть обернут в ссылку, которая ведет на страницу редактирования этого пользователя. Ссылку SonataAdminBundle делает как-то автоматически в поле ->add('author'). Автоматически делает имя пользователя ссылкой на страницу с редактированием этого пользователя, которая уже до этого давно была сделана. Т.е. в таком виде класса InCommentsAdmin в списке комментов у меня 2 столбца, один ->add('commentAuthor') - в котором просто стоит имя автора коммента, а в столбце ->add('author') стоят имена зареганных юзеров, только для тех комментов, которы оставлены от зареганых юзеров, в остальных случаях строка просто пустая.

Буду с нетерпение ждать вашего решение Радость
(Добавление)
Что бы было понятнее вот скрин, нужно объеденить 2 первых столбца в один.
(Добавление)
P.S.
Кстати говоря. Задачку уже решили, правда на её решение у моего более опытного и сообразительного начальника ушло 2 часа времени, не смотря на то, что он работает в этой симфони с июля месяца. На обычном php с обычной библиотекой db_simple я бы решил её за 20 мин.

(Отредактировано автором: 26 Февраля, 2015 - 11:54:43)

 
 Top
nkl
Отправлено: 26 Февраля, 2015 - 13:40:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Ну что, ни у кого нет мыслей на этот счет? Если не хватает данных или я непонятно объяснил задачу, спрашивайте, отвечу более подробно.

(Отредактировано автором: 26 Февраля, 2015 - 13:40:58)

 
 Top
caballero
Отправлено: 26 Февраля, 2015 - 13:50:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




почему вы решили что эта задача представляет для кого то интерес?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Sail
Отправлено: 26 Февраля, 2015 - 13:52:52
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)





caballero пишет:
почему вы решили что эта задача представляет для кого то интерес?

Вы, однако, просто не в курсе предыстории, ссылочку на которую ТС дал в начале сообщения... Закатив глазки

(Отредактировано автором: 26 Февраля, 2015 - 13:54:25)

 
 Top
caballero
Отправлено: 26 Февраля, 2015 - 14:00:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
digi
Отправлено: 27 Февраля, 2015 - 09:49:26
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Видимо в сущности комента надо сделать геттер который будет выводить либо автора, либо юзера, а в шаблончике если юзер выводить ссылку на него.

ЗЫ: с сонатой не работаю Улыбка
 
 Top
nkl
Отправлено: 04 Марта, 2015 - 11:35:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




digi пишет:
Видимо в сущности комента надо сделать геттер который будет выводить либо автора, либо юзера, а в шаблончике если юзер выводить ссылку на него.

ЗЫ: с сонатой не работаю Улыбка

Хм. Интересное решение, но мы сделали немножко по другому. Для этого поля делаем свой template, а в качестве шаблона используем заготовку для бандла, которая определяет, нужно сделать ссылку на редактирования пользователя или нет. Там просто проверяем if object.authorGuestName is not empty:
CODE (htmlphp):
скопировать код в буфер обмена
  1. {% block field %}
  2.         {% if object.authorGuestName is not empty %}
  3.                 {{ object.authorGuestName }}
  4.         {% else %}
  5.                 {% if value %}
  6.                 {% if field_description.hasAssociationAdmin and field_description.associationadmin.hasRoute('edit') and field_description.associationadmin.isGranted('EDIT', value) %}
  7.                     <a href="{{ field_description.associationadmin.generateObjectUrl(field_description.options.route.name, value, field_description.options.route.parameters) }}">{{ value|render_relation_element(field_description) }}</a>
  8.                 {% else %}
  9.                     {{ value|render_relation_element(field_description) }}
  10.                 {% endif %}
  11.             {% endif %}
  12.         {% endif %}
  13. {% endblock %}

а в случае else используется вывод этого поля как это стандартно организовано в \vendor\sonata-project\admin-bundle\doctrine-orm-admin-bundle\Resources\views\CRUD\list_orm_one_to_many.html.twig
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« CMS и фреймворки »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB