This bundle add a new Form type named "entity_ajax"., (*1)
It looks like the default "entity" type, but it loads only associated entities., (*2)
Example
A Book is link to User throught "owner" property., (*3)
If you are using the "entity" type on the BookType to display the "owner" property.
The form will load all the "users" to render the page., (*4)
With the "entity_ajax" type, the form will load only the current "owner". In this case, you are free
to load further "users" via AJAX or something else., (*5)
Installation
Installation is a quick 2 step process:, (*6)
- Download ArmetizFormExtensionBundle using composer
- Enable the Bundle
Add ArmetizFormExtensionBundle in your composer.json:, (*7)
{
"require": {
"armetiz/form-extension-bundle": "1.x-dev"
}
}
Now tell composer to download the bundle by running the command:, (*8)
``` bash
$ php composer.phar update armetiz/form-extension-bundle, (*9)
Composer will install the bundle to your project's `vendor/armetiz` directory.
### Step 2: Enable the bundle
Enable the bundle in the kernel:
``` php
<?php
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new Armetiz\FormExtensionBundle\ArmetizFormExtensionBundle(),
);
}
Usage
You just have to use "entity_ajax" type instead of "entity". All EntityType options are still availabled and/or needed., (*10)
I'm using it with Chosen & [Ajax Chosen][3]., (*11)
``` php
// src/Acme/TaskBundle/Controller/DefaultController.php
namespace Acme\TaskBundle\Controller;, (*12)
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Acme\TaskBundle\Entity\Task;, (*13)
class DefaultController extends Controller
{
public function newAction(Request $request)
{
$task = new Task();, (*14)
$form = $this->createFormBuilder($task)
->add('task', 'text')
->add('dueDate', 'date')
->add('owner', 'entity_ajax')
->getForm();
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($task);
$em->flush();
return $this->redirect($this->generateUrl('task_success'));
}
}
return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
'form' => $form->createView(),
));
}
}, (*15)
``` js
// part of edit.html.twig file
var ajaxChosenSimplifier = function(selector, url, label) {
var options = {
method: 'GET',
url: url,
data: {
method: "search"
},
jsonTermKey: "value",
dataType: 'xml'
};
var success = function(data, textStatus, jqXHR) {
var jSearched = $(data);
var result = {};
jQuery.each(jSearched.find("item"), function(indexInArray, item) {
var jItem = $(item);
var id = jItem.find("id").text();
var text = jItem.find(label).text();
result[id] = text;
});
return result;
};
return $(selector).ajaxChosen(options, success);
};
ajaxChosenSimplifier("#task_owner", "http://api.domain.tld/user, "username");
xml
<!-- data content example -->
<response status="success" message="user.search">
<item key="0" id="3" type="user">
<id>3</id>
<username><![CDATA[ john ]]></username>
</item>
<item key="0" id="4" type="user">
<id>4</id>
<username><![CDATA[ iron man ]]></username>
</item>
</response>
, (*16)