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';
}
}
Vielen Dank für die Einsicht. Ich werde dies heute verfolgen und mit den Ergebnissen auf Sie zurückkommen. –
Hallo @TomOlson Sie sind herzlich willkommen! Viel Glück bei der Migration! – Matteo