damianociarla/select-city-form-field-bundle

此扩展包为Symfony2提供了一种新的表单字段,用于渲染三个选择项 '国家、地区、城市'。

v1.0.2 2015-04-28 15:40 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:36:21 UTC


README

DCSSelectCityFormFieldBundle 是一个为 Symfony2 开发的扩展包,它添加了一个新的表单字段类型 select_city,用于在表单中渲染三个选择项(国家、地区、城市)。特性包括

  • 无需使用外部库即可支持Ajax
  • 您可以设置一个最小安全角色以保护API
  • 在表单提交时,您有一个默认对象代表三个选择项

1) 安装

A) 下载并安装 DCSSelectCityFormFieldBundle

要安装 DCSSelectCityFormFieldBundle,请运行以下命令

bash $ php composer.phar require damianociarla/select-city-form-field-bundle

B) 启用扩展包

要启用它,请将扩展包实例添加到内核中

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
    	// ...
    	new DCS\Form\SelectCityFormFieldBundle\DCSFormSelectCityFormFieldBundle(),
	);
}

2) 创建您的国家、地区和城市类

在此第一个版本中,DCSSelectCityFormFieldBundle 仅支持 Doctrine ORM。您必须提供具体的 Country、Region 和 City 类。您必须扩展扩展包提供的抽象实体,并创建适当的映射。

国家

<?php
// src/MyProject/MyBundle/Entity/Country.php

namespace MyProject\MyBundle\Entity;

use DCS\Form\SelectCityFormFieldBundle\Entity\Country as CountryBase;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Country extends CountryBase
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

地区

<?php
// src/MyProject/MyBundle/Entity/Region.php

namespace MyProject\MyBundle\Entity;

use DCS\Form\SelectCityFormFieldBundle\Entity\Region as RegionBase;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Region extends RegionBase
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

城市

<?php
// src/MyProject/MyBundle/Entity/City.php

namespace MyProject\MyBundle\Entity;

use DCS\Form\SelectCityFormFieldBundle\Entity\City as CityBase;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class City extends CityBase
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

3) 配置您的应用程序

# app/config/config.yml

dcs_form_select_city_form_field:
    db_driver: orm
    api_security: IS_AUTHENTICATED_ANONYMOUSLY
    model:
        country: MyProject\MyBundle\Entity\Country
        region: MyProject\MyBundle\Entity\Region
        city: MyProject\MyBundle\Entity\City

4) 导入 DCSRatingBundle 路由

导入扩展包路由

dcs_form_select_city_form_field:
    resource: "@DCSFormSelectCityFormFieldBundle/Resources/config/routing.xml"
    prefix:   /

5) 在模板中导入 JavaScript

要导入 JavaScript,请运行以下命令

bash $ php app/console assets:install

并在您的模板中包含 JavaScript

<script type="text/javascript" src="{{ asset('bundles/dcsformselectcityformfield/js/select_city.js') }}"></script>

6) 使用新的表单字段

要将新字段包含在表单中,请使用以下代码

$builder->add('address', 'select_city')

您有以下选项

$builder->add('address', 'select_city', array(
	'country_required'  => true,
    'region_required'   => true,
    'city_required'     => true,
))

提交后

当表单提交时,扩展包提供了一个代表三个选择项的对象。该对象是:DCS\Form\SelectCityFormFieldBundle\Model\SelectData

完整示例

表示新表单字段返回的信息的实体和表单的示例

地址实体

<?php
// src/MyProject/MyBundle/Entity/Address.php

namespace MyProject\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Address
{
    /**
     * @ORM\ManyToOne(targetEntity="MyProject\MyBundle\Entity\Country")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id", nullable=true)
     */
    protected $country;

    /**
     * @ORM\ManyToOne(targetEntity="MyProject\MyBundle\Entity\Region")
     * @ORM\JoinColumn(name="region_id", referencedColumnName="id", nullable=true)
     */
    protected $region;

    /**
     * @ORM\ManyToOne(targetEntity="MyProject\MyBundle\Entity\City")
     * @ORM\JoinColumn(name="city_id", referencedColumnName="id", nullable=true)
     */
    protected $city;

    /**
     * @var \DCS\Form\SelectCityFormFieldBundle\Model\SelectData
     */
    protected $selectData;

    /**
     * Set country
     *
     * @param \DCS\Form\SelectCityFormFieldBundle\Model\CountryInterface $country
     * @return Address
     */
    public function setCountry(\DCS\Form\SelectCityFormFieldBundle\Model\CountryInterface $country = null)
    {
        $this->country = $country;

        return $this;
    }

    /**
     * Get country
     *
     * @return \DCS\Form\SelectCityFormFieldBundle\Model\CountryInterface
     */
    public function getCountry()
    {
        return $this->country;
    }

    /**
     * Set region
     *
     * @param \DCS\Form\SelectCityFormFieldBundle\Model\RegionInterface $region
     * @return Address
     */
    public function setRegion(\DCS\Form\SelectCityFormFieldBundle\Model\RegionInterface $region = null)
    {
        $this->region = $region;

        return $this;
    }

    /**
     * Get region
     *
     * @return \DCS\Form\SelectCityFormFieldBundle\Model\RegionInterface
     */
    public function getRegion()
    {
        return $this->region;
    }

    /**
     * Set city
     *
     * @param \DCS\Form\SelectCityFormFieldBundle\Model\CityInterface $city
     * @return StandardAddress
     */
    public function setCity(\DCS\Form\SelectCityFormFieldBundle\Model\CityInterface $city = null)
    {
        $this->city = $city;

        return $this;
    }

    /**
     * Get city
     *
     * @return \DCS\Form\SelectCityFormFieldBundle\Model\CityInterface
     */
    public function getCity()
    {
        return $this->city;
    }

    /**
     * Set selectData
     *
     * @param \DCS\Form\SelectCityFormFieldBundle\Model\SelectData $selectData
     * @return Address
     */
    public function setSelectData(\DCS\Form\SelectCityFormFieldBundle\Model\SelectData $selectData)
    {
        $this->setCountry($selectData->getCountry());
        $this->setRegion($selectData->getRegion());
        $this->setCity($selectData->getCity());

        $this->selectData = $selectData;

        return $this;
    }

    /**
     * Get selectData
     *
     * @return \DCS\Form\SelectCityFormFieldBundle\Model\SelectData
     */
    public function getSelectData()
    {
        $selectData = new \DCS\Form\SelectCityFormFieldBundle\Model\SelectData();
        $selectData->setCountry($this->getCountry());
        $selectData->setRegion($this->getRegion());
        $selectData->setCity($this->getCity());

        return $selectData;
    }
}

地址表单

<?php
// src/MyProject/MyBundle/Form/Type/Address.php

namespace MyProject\MyBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormBuilderInterface;

class AddressFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('selectData', 'select_city', array(
                'country_required'  => $options['country_required'],
                'state_required'    => $options['state_required'],
                'city_required'     => $options['city_required'],
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'                => 'MyProject\MyBundle\Entity\Address',
            'country_required'          => true,
            'state_required'            => true,
            'city_required'             => true,
        ));

        $resolver->setAllowedTypes(array(
            'country_required'          => 'bool',
            'state_required'            => 'bool',
            'city_required'             => 'bool',
        ));
    }

    public function getName()
    {
        return 'address';
    }
}