armetiz/form-extension-bundle

此包已被废弃,不再维护。未建议替代包。

Symfony Bundle 扩展 Form

dev-master / 1.x-dev 2013-05-21 15:55 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:22:21 UTC


README

此包添加了一个名为 "entity_ajax" 的新 Form 类型。

它看起来像默认的 "entity" 类型,但它只加载关联实体。

示例

一本书通过 "owner" 属性链接到 User。

如果你在 BookType 上使用 "entity" 类型来显示 "owner" 属性。表单将加载所有 "users" 来渲染页面。

使用 "entity_ajax" 类型,表单将只加载当前 "owner"。在这种情况下,你可以自由地通过 AJAX 或其他方式加载更多的 "users"。

安装

安装是快速的两步过程

  1. 使用 composer 下载 ArmetizFormExtensionBundle
  2. 启用 Bundle

步骤 1: 使用 composer 下载 ArmetizFormExtensionBundle

在 composer.json 中添加 ArmetizFormExtensionBundle

{
    "require": {
        "armetiz/form-extension-bundle": "1.x-dev"
    }
}

现在告诉 composer 下载包,运行以下命令

$ php composer.phar update armetiz/form-extension-bundle

Composer 将将包安装到项目的 vendor/armetiz 目录。

步骤 2: 启用 Bundle

在内核中启用 Bundle

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Armetiz\FormExtensionBundle\ArmetizFormExtensionBundle(),
    );
}

用法

只需使用 "entity_ajax" 类型代替 "entity"。所有 EntityType 选项仍然可用和/或需要。

我在 Chosen & Ajax Chosen 中使用它。

// src/Acme/TaskBundle/Controller/DefaultController.php
namespace Acme\TaskBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Acme\TaskBundle\Entity\Task;

class DefaultController extends Controller
{
    public function newAction(Request $request)
    {
        $task = new Task();

        $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(),
        ));
    }
}
// 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");
<!-- 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>