У меня есть форма 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;
});
});