Не могу получить входное значение с Twig - PullRequest
0 голосов
/ 19 февраля 2020

Здравствуйте, я пытался передать некоторые аргументы, но я не знаю, как получить значение ввода с помощью ветки. Вот мой код: okey, во-первых, я отображаю детали блога, используя эту операцию, которая также отображает форму для добавления комментариев. в блоге;

public function detailsAction(Request $request,Blog $blog){

        $user=$this->getUser();
        if($user==null)
            return $this->redirectToRoute('fos_user_security_login');
        $add_comment = new CommentaireBlog();
        $em = $this->getDoctrine()->getManager();

        $comments = $em->getRepository(CommentaireBlog::class)->findByBlog($blog);
        $add_comment->setBlog($blog);
        $add_comment->setUser($user);
        $add_comment->setDate( new \DateTime());

        $form = $this->createFormBuilder($add_comment)

            ->add('contenu', TextareaType::class)

            ->getForm();

        if ($request->getMethod() == 'POST') {
            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $add_comment = $form->getData();
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($add_comment);
                $em->flush();

                return $this->redirectToRoute('blog_details', array('id' => $blog->getId()));
            }
        }


        return $this->render('blog/details.html.twig', array(
            'form' => $form->createView(),
            'comment' => $add_comment,
            'blog' => $blog,
            'comments'=>$comments,
        ));

    }

страница ветки:

   {{ form_start(form) }}
                                <div class="row form-group">

                                    <div class="col col-md-3"><label class=" form-control-label">Votre Commentaire  </label></div>
                                    <div class="col-12 col-md-9"> {{ form_widget(form.contenu, { 'attr': {'class': 'form-control'} }) }}<small class="form-text text-muted"></small></div>
                                    <button type="submit" class="btn btn-default">Envoyer</button>
                                    <div class="col-12 col-md-9">
                                    </div>
                                </div>
                                    {{ form_end(form) }}

Теперь я хочу сделать так, чтобы после того, как кто-то добавил комментарий и его (расистское / словесное оскорбление ..) другой пользователь может сообщить о комментарии, и письмо будет отправлено, поэтому я использовал reportAction, который принимает три аргумента, причину сообщения и идентификатор комментария

public function reportAction($msg,$type,$id)
    {

    }

Я до сих пор не написал в нем, потому что прежде всего мне нужно значение входов, поэтому я пошел на страницу ветки и сделал эту маленькую форму, чтобы получить входные данные, но idk, как получить значение здесь, это форма:

<div class="modal-body">
  <form id="lala" method="GET">
    <label for="cars">Reason:</label>
            <select id="reportreason">
                <option value="Inappropriate Content">Inappropriate Content</option>
                 <option value="Spam">Spam</option>
                <option value="Racism">Racism</option>
                <option value="Nudity">Nudity</option>
                 <option value="Other">Other</option>
      </select>
    <div class="form-group">
        <label for="message-text" class="col-form-label">Message:</label>
        <textarea id="reportmessage" class="form-control" id="message-text"></textarea>
    </div>
  </form>
</div>
 <div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    <a id="reportlink" href="{{ path('comment_report', { 'msg': form.vars.data.reportmessage ,'type': form.vars.data.reportreason, 'id': comment.id  }) }}" type="button" class="btn btn-primary">Send message</a>
</div>

это файл yml:

blog_details:
    path:      /{id}/details
    defaults: { _controller: "BlogBundle:Blog:details" }
    methods:  [GET, POST]
comment_report:
    path:     /{msg}/{type}/{id}/report
    defaults: { _controller: "BlogBundle:Blog:report" }
    methods:  [GET, POST]

но сейчас я получаю эту ошибку: ни свойство "reportmessage", ни один из методов "reportmessage ()", "getreportmessage ()" / "isreportmessage ()" или "__call ()" не существуют и не имеют publi c доступ в классе "BlogBundle \ Entity \ CommentaireBlog".

так, как я могу получить значение входов, используя веточку?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Синтаксис объекта ветки https://twigfiddle.com/01iobj

По сути, сообщение об ошибке ветки говорит, что в ваших path() аргументах вы передаете объект без связанного ключа как {value}. правильный синтаксис будет {key: value} или [value], напоминающий синтаксис JSON.

{ 
   "key1": { "key1a": "value1a" }, 
   "key2": ["value2"], 
   "key3": "value3" 
}

Результат

$_GET = array(
    'key1' => array('key1a' => 'value1a'), 
    'key2' => array('value2'), 
    'key3' => 'value3'
);

Другой подход

Глядя на то, что вы хотите сделать, вам нужно реорганизовать свой подход.

Сначала измените путь вашего контроллера ТОЛЬКО для комментария.

blog_details:
    path:      /{id}/details
    defaults: { _controller: "BlogBundle:Blog:details" }
    methods:  [GET, POST]
comment_report:
    path:     /{comment}/report
    defaults: { _controller: "BlogBundle:Blog:report" }
    methods:  [POST]

Затем создайте форму экземпляр для вашего модального режима, это позволит вам использовать FormInstance для рендеринга и проверки отправленной формы в другом месте. Убедитесь, что все проверки выполняются, и вам не нужно обновлять разные сценарии для одной и той же формы.

/* /src/Form/CommentReportForm.php */

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type as Form;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;

class CommentReportForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             ->add('reason', Form\ChoiceType::class [
                'choices' => [
                     'Inappropriate Content' => 'Inappropriate Content',
                     'Spam' => 'Spam',
                     'Racism' => 'Racism',
                     'Nudity' => 'Nudity',
                     'Other' => 'Other'
                ]
            ])
             ->add('message', Form\TextType::class, [
                'constraints' => [
                    new Assert\Length(['min' => 10]),
                    new Assert\NotBlank(),
                ],
            ]);
    }

    public function getBlockPrefix()
    {
       return 'report_comment_form';
    }
}

Затем обновите действия контроллера соответствующим образом.

public function detailsAction(Request $request, Blog $blog)
{
    if (!$user = $this->getUser()) {
        //this should be handled in your firewall configuration!!!!
        return $this->redirectToRoute('fos_user_security_login');
    }
    $em = $this->getDoctrine()->getManager();

    $add_comment = new CommentaireBlog();
    $add_comment->setBlog($blog);
    $add_comment->setUser($user);
    $add_comment->setDate(new \DateTime());

    $form = $this->createFormBuilder($add_comment)
        ->add('contenu', TextareaType::class)
        ->getForm();
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        //Symfony form sets values for the model by_reference
        $em->persist($add_comment);
        $em->flush();

        return $this->redirectToRoute('blog_details', array('id' => $blog->getId()));
    }

    /*
    * create the report form
    */
    $reportForm = $this->createForm(\App\Form\CommentReportForm::class);
    $reportForm->handleRequest($request);

    return $this->render('blog/details.html.twig', array(
        'form' => $form->createView(),
        'comment' => $add_comment,
        'blog' => $blog,
        'comments'=> $em->getRepository(CommentaireBlog::class)->findByBlog($blog),
        /*
         * give the report form a different name in twig
         */
        'report_form' => $reportForm->createView(),
    ));

}
public function reportAction(Request $request, CommentaireBlog $comment)
{
    $reportForm = $this->createForm(\App\Form\CommentReportForm::class);
    $reportForm->handleRequest($request);
    /** @var array|string[message, reason] */
    $reportData = $reportForm->getData();
    /*
      array( 'reason' => 'value', 'message' => 'value' )
     */
    dump($reportData);
    if ($reportForm->isSubmitted() && $reportForm->isValid()) {
        //send email

        //redirect to success message
    }
    //display an error message
}

Наконец, обновите ваше представление, чтобы оно поддерживало новую форму в вашем модале.

<div class="modal-body">
  {{ form_start(report_form, { action: path('comment_report', { comment: comment.id }) })
  {{ form_label(report_form.reason) }}
  {{ form_widget(report_form.reason) }}
  <div class="form-group">
      {{ form_label(report_form.message) }}
      {{ form_widget(report_form.message) }}
  </div>
  {{ form_end(report_form) }}
</div>
<div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    <button type="submit" class="btn btn-primary">Send message</button>
</div>

В качестве рекомендации я настоятельно призываю вас записывать отправленные отчеты в базу данных, функционировать как журнал дел и статус отчетов. Мой подход поможет вам пройти большую часть пути, вам просто нужно будет создать вашу сущность App\Entity\CommentReport с необязательной ассоциацией с сущностью CommentaireBlog. Который будет передан в форму и добавит data_class в распознаватель параметров формы, имитируя то, что вы сделали в других формах базы данных.

0 голосов
/ 19 февраля 2020

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

<a 
  href="{{ path('comment_report', { 'msg': form.reportmessage.value ,'type': form.reportreason.value, 'id': comment.id  }) }}" 
  type="button"
  class="btn btn-primary">
     Send message
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...