Symfony - выпадающий список с фильтром entity.ppriety

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

Окончательный список элементов массива можно изменить, см. пример ниже и запустить это для себя.

Вот неизменный класс с неизменным объявлением List:

public final class ImmutableClassWithArrayList {
 final List<String> theFinalListVar = new ArrayList<String>();
}

И вот драйвер:

public class ImmutableClassWithArrayListTester {
public static void main(String[] args) {
    ImmutableClassWithArrayList immClass = new ImmutableClassWithArrayList();
    immClass.theFinalListVar.add("name");
    immClass.theFinalListVar.forEach(str -> System.out.println(str));
 }
}

Как вы можете видеть, основным методом является добавление (изменение) списка. Так что единственное, что нужно отметить, это то, что «ссылка» на объект типа коллекции не может быть переназначена другому такому объекту. Как и в ответе adarshr выше, вы не можете сделать immClass.theFinalListVar = new ArrayList (); в основном методе здесь.

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

-1
задан Simon Delaunay 27 February 2019 в 15:35
поделиться

2 ответа

Вы должны начать использовать формы Symfony. Вот документация https://symfony.com/doc/current/forms.html . Вначале все не так просто, но это определенно важно. Тогда вы сможете использовать EntityType https://symfony.com/doc/current/reference/forms/types/entity.html

0
ответ дан VladRia 27 February 2019 в 15:35
поделиться

Спасибо за совет, ВладРия, но я нашел другой способ сделать это, я объясняю: что ты думаешь об этом? Какова лучшая практика? это немного странно / странно, я думаю?

Вот моя сторона контроллера:

/**
 * @Route("/recherche/{skillId}/{levelId}", name="recherche")
 */
public function recherche(Skill $skillId=null, Level $levelId=null): Response
{
    $filtre = $this->init();
    $answers = $filtre['answers'];
    $skills = $filtre['skills'];
    $levels = $filtre['levels'];
    $responses = null;

    $jointureRepository= $this->getDoctrine()->getRepository(Jointure::class);
    $jointures = $jointureRepository->findBySkillAndLevel($skillId,$levelId);
    $this->em->flush();

    foreach($jointures as $uneJointure){
    $responses[]=$uneJointure->getAnswer();
    }

    return $this->render('pages/home.html.twig', [
        'answers' => $answers,
        'skills' => $skills,
        'levels' => $levels,
        'responses' => $responses
    ]);
}

private function init(){

    $LevelRepository = $this->getDoctrine()->getRepository(Level::class);
    $levels = $LevelRepository->findAll();

    $SkillRepository = $this->getDoctrine()->getRepository(Skill::class);
    $skills = $SkillRepository->findAll();

    $AnswerRepository = $this->getDoctrine()->getRepository(Answer::class);
    $answers = $AnswerRepository->findAll();

    $this->em->flush();

    return ([
        'levels' => $levels,
        'skills' => $skills,
        'answers' => $answers,
    ]);
}

моя личная функция init () странная, что вы можете посоветовать мне?

[ 116] Мой JointureRepository, который содержит построитель запросов findBySkillAndLevel ():

/ ** * @return Jointure [] * / открытая функция findBySkillAndLevel ($ skillId, $ levelId): массив {

$query = $this->createQueryBuilder('j')
    //->join('j.answer', 'a')
    ->join('j.skill', 's')
    ->join('j.level', 'l')
    //->where('a.id = :j.answerId')
    ->andWhere('s.id = :skillId')
    ->andWhere('l.id = :levelId')
    ->setParameter('skillId', $skillId)
    ->setParameter('levelId', $levelId)
    ->getQuery()
    ->getResult();

return $query;

}

Мой взгляд на веточку: (Где я могу поместить этот JS? В Best Practice Symfony)

<div class="container-fluid bg-light ">
  <div class="row justify-content-center">
      <div class="col-md-2 pt-3">
          <div class="form-group">
              <select id="inputState" class="form-control">
                <option selected>Compétences</option>
                {% for skill in skills %}
                <option value="{{skill.id}}">{{skill.label}}</option>
                {% endfor %}
              </select>
          </div>
      </div>
      <div class="col-md-2 pt-3">
        <div class="form-group">
          <select id="inputState2" class="form-control">
            <option selected>Maîtrise</option>
            {% for level in levels %}
            <option value="{{level.id}}">{{level.label}}</option>
            {% endfor %}
          </select>
        </div>
      </div>
      <div class="col-md-2 pt-3">
        <button type="button" onclick="search('{{ path('recherche') }}')" class="btn btn-info">Rechercher</button>
      </div>
  </div>
</div>

<div class="container">
  {% if responses is not null %}
    <h3>{{ responses|length }} profils correspondent aux critères séléctionnés :</h3>
  {% elseif responses|length == 0 %}
    <h3>Pas de résultats pour ces critères..</h3>
  {% else %}
    <h3>Faites votre recherche</h3>
  {% endif %}
  {% for rep in responses %}
  <div class="card">
    <div class="card-header">Email : {{ rep.UserEmail }}</div>
    <div class="card-body">Compétences :<br>
      {% for j in rep.jointures %}
      <p>{{j.level.label}} la compétence {{ j.skill.label }}</p>
      {% endfor %}
    </div>
    <div class="card-footer">Formulaire envoyé le : {{ rep.Date|date("d/m/Y") }} </div> 
  </div><br>
  {% endfor %}

</div>

<script>
function search(path){
var e = document.getElementById("inputState");
var value = e.options[e.selectedIndex].value;
var text = e.options[e.selectedIndex].text;
var l = document.getElementById("inputState2");
var test = l.options[l.selectedIndex].value;
path = path + '/' + value + '/' + test;
document.location.href = path;
}
</script>

Мой вопрос: как я могу сделать это лучше, чтобы уважать Лучшие практики Symfony ?

0
ответ дан Simon Delaunay 27 February 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: