2016-05-06 8 views
1

Zunächst einmal bewege ich mich von Symfony 1.4 bis Symfony 3. (Ja, ich war tretend und schreiend auf den ersten)Handbuch SQL Query von Formulartyp/Abstract Klasse

Meine Frage: Ich betreibe eine manuelle Abfrage von der folgenden FormType-Klasse, die für einen Teil meines Registrierungsformulars ist. Ich verschiebe den Adressteil der Anmeldung in eine eigene Klasse. Ich rufe eine geographische Tabelle an, um meine Staatenliste zu bekommen, und ich habe eine Union ... deshalb rufe ich keine Entitätsklasse auf.

Das Problem ist, dass ich eine Verbindung zur Datenbank herstellen muss, aber nicht, weil es eine abstrakte Klasse ist. Wenn ich dies in der Controller-Klasse durchführe, kein Problem, aber kann dies in dieser Abstraktions Klasse nicht machen. Ich habe eine Reihe von manuellen Schritten zu durchlaufen, bevor Sie irgendwelche Einsätze, so kann ich nur

Wie machen Sie die folgende Arbeit? Ich habe keine Dienste erstellt, aber wenn ich alles in eine Controller-Klasse lege, funktioniert es gut.

<?php 

namespace LocationBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Doctrine\ORM\EntityManager; 


class PartialAddressType extends AbstractType 
{ 
    private function getStatesList() 
    { 
     $sql = " 
       SELECT 
       '0' AS id 
       ,'' AS name 
       ,'' AS abbreviation 
       ,'Select State' AS display 
       UNION 
       SELECT 
        id 
       ,trim(name) 
       ,trim(abbreviation) 
       ,CONCAT(trim(abbreviation), ' - ', trim(name)) AS display 
       FROM 
        geo_state 
       WHERE 
        type = 'state' 
       ORDER BY abbreviation ASC; "; 

     $manager = $this->getDoctrine()->getManager('default'); 
     $conn = $manager->getConnection(); 
     $rs = $conn->query($sql)->fetchAll(); 

     return $rs; 
    } 


    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $rs = $this->getStatesList(); 


     // This one is for a Select 
     $builder->add('locationState', ChoiceType::class, array(
       'expanded'   => FALSE, 
       'multiple'   => FALSE, 
       'choices'   => $rs(), 
       'choice_label'  => $rs['display'], 
       'choice_attribute' => $rs['abbreviation'], 
       'preferred_choices' => array('TX'), 
       'choices_as_values' => FALSE, 
       'label'    => 'State', 
      ) 
     ); 
    } 


    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array()); 
    } 

    public function getName() 
    { 
     return 'location_bundle_partial_address_type'; 
    } 
} 

Antwort

0

Ich schlage vor, Sie folgende Schritte:

1) Bewegen Sie die Abfrage in einer separaten Repository-Klasse (ich hoffe, dass Sie die Tabelle als Einheit Karte)

2) Verwenden Sie ein EntityType Feld mit der benutzerdefinierte Abfrage als described here

3) vermeiden Sie die UNION mit den placeholder

Letzte Tipps, sollten Sie implementiert die getBlockPrefix Methode anstelle von getName wie im Migrationsleitfaden here beschrieben.

Hoffe diese Hilfe

+0

Vielen Dank für die Einsicht. Ich werde dies heute verfolgen und mit den Ergebnissen auf Sie zurückkommen. –

+0

Hallo @TomOlson Sie sind herzlich willkommen! Viel Glück bei der Migration! – Matteo