Artikel ini dirunut berdasarkan Jobeet Tutorial, yang dibuat oleh Fabien Potencier, untuk Symfony 1.4.
Memodifikasi form Job
Job form adalah contoh yang sempurna untuk memodifikasi form. Mari kita mulai selangkah demi selangkah. Pertama tambahkan link untuk memposting Job.src/Ibw/JobeetBundle/Resources/views/layout.html.twig
<a href="{{ path('ibw_job_new') }}">Post a Job</a>
Kemudian ubah roting untuk createAction di JobController
src/Ibw/JobeetBundle/Controller/JobController.php
// ...
public function createAction(Request $request)
{
$entity = new Job();
$form = $this->createForm(new JobType(), $entity);
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('ibw_job_show', array(
'company' => $entity->getCompanySlug(),
'location' => $entity->getLocationSlug(),
'id' => $entity->getId(),
'position' => $entity->getPositionSlug()
)));
}
return $this->render('IbwJobeetBundle:Job:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
// ...
Secara default doctrine menggenerate form sesuai dengan field yang ada di table. Untuk itu edit Job form menjadi seperti berikut ini:
src/Ibw/JobeetBundle/Form/JobType.php
namespace Ibw\JobeetBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class JobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type')
->add('category')
->add('company')
->add('logo')
->add('url')
->add('position')
->add('location')
->add('description')
->add('how_to_apply')
->add('token')
->add('is_public')
->add('email')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Ibw\JobeetBundle\Entity\Job'
));
}
public function getName()
{
return 'job';
}
}
Ok, untuk menambahkan validasi pada form, buatlah file validation.yml di dalam folder src/Ibw/JobeetBundle/Resources/config/validation.yml.
src/Ibw/JobeetBundle/Resources/config/validation.yml
Ibw\JobeetBundle\Entity\Job:
properties:
email:
- NotBlank: ~
- Email: ~
Meskipun di dalam skema database kolom type berupa varchar tetapi kita ingin membuatnya lebih ketat hanya dengan tiga pilihan yang kita set sendiri yaitu: fulltime, partime dan freelence. Tambahkan option tersebut pada form Job tadi:
src/Ibw/JobeetBundle/Form/JobType.php
// ...
use Ibw\JobeetBundle\Entity\Job;
class JobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', 'choice', array('choices' => Job::getTypes(), 'expanded' => true))
// ...
}
// ...
}
Agar pilihan tersebut dapat muncul di halaman form tambahakan kode berikut ini di file model Job.php
src/Ibw/JobeetBundle/Entity/Job.php
// ...
public static function getTypes()
{
return array('full-time' => 'Full time', 'part-time' => 'Part time', 'freelance' => 'Freelance');
}
public static function getTypeValues()
{
return array_keys(self::getTypes());
}
// ...
Method getTypes() digunakan untuk mendapatkan value tipe job yang kita buat tadi, dan method getTypeVlues(), digunakan untuk melakukan validasi field.
src/Ibw/JobeetBundle/Resources/config/validation.yml
Ibw\JobeetBundle\Entity\Job:
properties:
type:
- NotBlank: ~
- Choice: { callback: getTypeValues }
email:
- NotBlank: ~
- Email: ~
Untuk masing-masing field di Symfony 2 sudah memiliki label yang digenerate secara otomatis. Ini dapat diedit dengan label option pada form.
src/Ibw/JobeetBundle/Form/JobType.php
public function buildForm(FormBuilderInterface $builder, array $options)
php app/console cache:clear --env=prod
{
$builder
// ...
->add('logo', null, array('label' => 'Company logo'))
// ...
->add('how_to_apply', null, array('label' => 'How to apply?'))
// ...
->add('is_public', null, array('label' => 'Public?'))
// ...
}
Kamu dapat menambahkan validase untuk kesemua field dengan cara sebagai berikut:
src/Ibw/JobeetBundle/Resources/config/validation.yml
Ibw\JobeetBundle\Entity\Job:
properties:
category:
- NotBlank: ~
type:
- NotBlank: ~
- Choice: {callback: getTypeValues}
company:
- NotBlank: ~
position:
- NotBlank: ~
location:
- NotBlank: ~
description:
- NotBlank: ~
how_to_apply:
- NotBlank: ~
token:
- NotBlank: ~
email:
- NotBlank: ~
- Email: ~
url:
- Url: ~
Setelah melakukan perubahan pada validasi kamu perlu membersihkan cachenya:
php app/console cache:clear --env=dev
No comments:
Post a Comment