I've got the following tables with relationships:
UserAddresstable (Holds basic information for the address)UserAddressFieldstable (Holds the value for each field associated to an address)UserAddressFieldsTranslationtable (Holds the field ids)UserStatestable (Holds the values of all the states in the US and the abbreviations)
UserAddress has 2 foreign keys:
Profile_id->useraccounts.idstate_id->userstates.id
UserAddressFields has one foreign key:
address_id->useraddress.id
I've created entities for all 4 of these tables (Getters and Setters have been removed to save space, generated via console):
UserAddress.php
<?php
namespace SCWDesignsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use SCWDesignsBundle\Entity\UserStates;
use UsersBundle\Entity\User;
/**
* @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\
UserAddressesRepository")
* @ORM\Table(name="user_addresses")
*/
class UserAddresses {
/**
* @ORM\ID
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="UsersBundle\Entity\User")
* @ORM\JoinColumn(name="profile_id", referencedColumnName="id")
*/
protected $profile_id;
/**
* @ORM\ManyToOne(targetEntity="UserStates")
* @ORM\JoinColumn(name="state_id", referencedColumnName="id")
*/
protected $state_id;
/**
* @ORM\Column(type="boolean")
*/
protected $isBilling;
/**
* @ORM\Column(type="boolean")
*/
protected $isShipping;
/**
* @ORM\Column(type="string", columnDefinition="CHAR(1)")
*/
protected $addressType;
UserAddressFieldsTranslation.php
<?php
namespace SCWDesignsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use SCWDesignsBundle\Entity\UserAddressFields;
use UsersBundle\Entity\User;
/**
* @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\UserAddressFieldsTranslationRepository")
* @ORM\Table(name="user_address_fields_translation")
*/
class UserAddressFieldsTranslation {
/**
* @ORM\ID
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", columnDefinition="VARCHAR(255) NOT NULL")
*/
protected $name;
UserStates.php
<?php
namespace SCWDesignsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\StatesRepository")
* @ORM\Table(name="user_states")
*/
class UserStates {
/**
* @ORM\ID
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", columnDefinition="CHAR(2)")
*/
protected $country_code;
/**
* @ORM\Column(type="string", columnDefinition="VARCHAR(64)")
*/
protected $state;
I have 2 form types, UserAddressFormType and UserAddressFieldsFormType.
UserAddressFormType
<?php
namespace SCWDesignsBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserAddressFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('profile_id', null, array('label' => 'Profile ID'))
->add('state_id', null, array('label' => 'State ID'))
->add('isBilling', null, array('label' => 'Billing Address'))
->add('isShipping', null, array('label' => 'Shipping Address'))
->add('addressType', null, array('label' => 'Address Type'))
->add('addressFields', new UserAddressFieldsFormType());
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'SCWDesignsBundle\Entity\UserAddresses'
));
}
public function getName() {
return 'UserAddressFormType';
}
}
UserAddressFieldsFormType.php
<?php
namespace SCWDesignsBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserAddressFieldsFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('address_id', null, array('label' => 'Address Field'))
->add('address_field_id', null, array('label' => 'Address Field ID'))
->add('value', null, array('label' => 'Value'));
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'SCWDesignsBundle\Entity\UserAddressFields'
));
}
public function getName() {
return 'UserAddressFieldsFormType';
}
}
In the controller is your basic form call. ProfileController.php
<?php
namespace SCWDesignsBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use SCWDesignsBundle\Entity\UserAddresses;
use SCWDesignsBundle\Form\Type\UserAddressFormType;
use SCWDesignsBundle\Form\Type\UserAddressFieldsFormType;
class ProfileController extends Controller {
public function editAddressAction() {
$address = new UserAddresses();
$form_address = $this->createForm(new UserAddressFormType(), $address);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
// Perform some action.
return $this->redirect($this->generateUrl('fos_user_profile_show'));
}
return $this->render('SCWDesignsBundle:Profile:edit.html.twig', array(
'active_page' => 'profile',
'form_address' => $form_address->createView(),
));
}
}
Everywhere I've read this is the correct means of adding another entity to your form builder but everytime I do this, or any other variation I've ran across I get the following error
Neither the property "addressFields" nor one of the methods
"getAddressFields()", "isAddressFields()", "hasAddressFields()", "__get()" exist
and have public access in class "SCWDesignsBundle\Entity\UserAddresses".
Aucun commentaire:
Enregistrer un commentaire