damianociarla / select-city-form-field-bundle
此扩展包为Symfony2提供了一种新的表单字段,用于渲染三个选择项 '国家、地区、城市'。
v1.0.2
2015-04-28 15:40 UTC
Requires
- php: >=5.3
- symfony/symfony: ~2.3
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';
}
}