Как хранить флажки при навигации по нумерации страниц в Symfony 4 - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть форма Symfony, которая отображает большое количество вопросов из моей базы данных, которые я могу выбрать и добавить в тест. Чтобы упростить выбор вопросов, я разбил результаты на страницы так, чтобы на странице отображалось только 5 вопросов. Каждый вопрос имеет флажок рядом с ним, чтобы указать, следует ли добавить его в тест. Однако при отправке формы добавляются только флажки на текущей странице. Я использовал JQuery, чтобы сохранить флажки на клиенте, но я не могу понять, как сохранить их на сервере во время навигации по страницам. Любая помощь / предложения будут приветствоваться.

Я включил соответствующий код ниже - если есть что-то еще, что я могу добавить, пожалуйста, дайте мне знать.

Заранее спасибо,

Мартын (вырывает мои волосы, пытаясь понять это ...)

Вот мой контроллер:

    /**
     * @Route("/addquestions/{quizid}/{levelid}/{topicid}/{categoryid}", name="addquestions")
     */
    public function add(Request $request, PaginatorInterface $paginator, QuizEditorServices $quizeditservice, $quizid, $levelid=null, $topicid=null, $categoryid=null)
    {
        //Get the quiz object
        $quiz = $this->getDoctrine()->getRepository(Quiz::class)->find($quizid);

        $formOptions = $quizeditservice->AddQuestions($levelid, $topicid, $categoryid);

        // Paginate the results of the query
        $questions = $formOptions['pagination'];
        $formOptions['pagination'] = $paginator->paginate($formOptions['pagination'], $request->query->getInt('page', 1), 5);

        //Set some form attr
        $formOptions['attr'] = ['id' => 'target'];

        // Create the form
        $form = $this->createForm(AddQuizQuestionType::class, $quiz, $formOptions);        
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $questions = $form->get('question')->getData();
            foreach ($questions as $question){
                $quizquestion = new QuizQuestion();
                $quizquestion->setQuestion($question);
                $quiz->addQuizQuestion($quizquestion);
            }
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($quiz);
            $entityManager->flush();
            return $this->redirectToRoute('homepage');
        }

        return $this->render('editquiz/addquestions.html.twig', [
            'form' => $form->createView(),
            'pagination' => $formOptions['pagination'],
            'quiz' => $quiz,
        ]);
    }

и моя форма

<?php

namespace App\Form;

use App\Entity\Quiz;
use App\Entity\Question;
use App\Entity\QuestionCategory;
use App\Entity\QuestionTopic;
use App\Entity\QuestionLevel;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class AddQuizQuestionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('category', EntityType::class, [
                'class' => QuestionCategory::class,
                'placeholder' => 'Choose a category',
                'mapped' => false,
                'required' => false,
                'choices' => $options['categories'],
                'data' => $options['category'],
                'attr' => [ 'class' => 'selectquery' ],
            ])
            ->add('topic', EntityType::class, [
                'class' => QuestionTopic::class,
                'placeholder' => 'Choose a topic',
                'mapped' => false,
                'required' => false,
                'choices' => $options['topics'],
                'data' => $options['topic'],
                'attr' => [ 'class' => 'selectquery' ],
            ])
            ->add('level', EntityType::class, [
                'class' => QuestionLevel::class,
                'placeholder' => 'Choose a level',
                'mapped' => false,
                'required' => false,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('l')
                        ->orderBy('l.LevelName', 'ASC');
                },
                'data' => $options['level'],
                'attr' => [ 'class' => 'selectquery' ],
            ])
            ->add('question', EntityType::class, [
                'class' => Question::class,
                'expanded' => true,
                'multiple' => true,
                'mapped' => false,
                'choices' => $options['pagination'],
                'choice_label' => function () {
                    return 'Select this question';
                },
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Quiz::class,
            'pagination' => null,
            'category' => null,
            'topic' => null,
            'level' => null,
            'topics' => null,
            'categories' => null,
        ]);
    }
}

и JQuery

$( document ).ready(function() {
  var formValues = JSON.parse(localStorage.getItem('formValues')) || {};
  var $checkboxes = $('.form-check-input');

  function updateStorage(){
    $checkboxes.each(function(){
      formValues[this.id] = this.checked;
    });
    localStorage.setItem('formValues', JSON.stringify(formValues));
  }

  $checkboxes.on('change', function(){
    updateStorage();
  });

  $.each(formValues, function(key, value) {
    console.log($('#' + key).text());
    $('#' + key).prop('checked', value);
  });

  $( '#target' ).submit(function( event ) {
    localStorage.removeItem('formValues');
  });

  $( '#cb-clear' ).click(function( event ) {
    $checkboxes.each(function(){
      $(this).prop("checked", false);;
    });
    localStorage.removeItem('formValues');
  });

  $( '.selectquery' ).change(function() {
    var query = "/";
    $( '.selectquery' ).each(function(i, obj){
      if(!obj.value){
        value = 0;
      } else {
        value = obj.value;
      }
      query += value + '/'
    });
    path = window.location.pathname;
    path = path.split("/");
    var url = window.location.origin + '/' + path[1] + '/' + path[2] + query;
    if (url) { window.location = url; }
    return false;
  });
});
...