我简单的数据转换器将数字转换为实体,反之亦然。就像官方文档中的示例一样。
该reverseTransform方法将数字转换为实体,如果失败,则抛出TransformationFailedException带描述性消息的:
public function reverseTransform($number)
{
if (!$number) {
return null;
}
$issue = $this->om
->getRepository('AcmeTaskBundle:Issue')
->findOneBy(array('number' => $number))
;
if (null === $issue) {
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$number
));
}
return $issue;
}
Run Code Online (Sandbox Code Playgroud)
但是,使用上述转换器的表单字段会收到一般错误消息“此值无效”。即使更改异常文本(我希望将其用作验证消息,但事实并非如此)也不会更改错误消息。
如何显示异常文本而不是“此值无效”?
我正在使用Symfony表单(v3.0)而没有Symfony框架的其余部分.使用Doctrine v2.5.
我创建了一个表单,这里是表单类型:
class CreateMyEntityForm extends BaseFormType {
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('myEntity', EntityType::class);
}
}
Run Code Online (Sandbox Code Playgroud)
加载页面时,我收到以下错误.
传递给Symfony\Bridge\Doctrine\Form\Type\DoctrineType :: __ construct()的参数1必须是Doctrine\Common\Persistence\ManagerRegistry的实例,没有给出,在/ var/www/dev3/Vendor/symfony/form中调用/FormRegistry.php在第85行
我相信有一些配置需要在这里实现,但我不知道如何创建一个实现ManagerRegistryInterface的类 - 如果这是正确的事情.
有什么指针吗?
编辑 - 这是我设置Doctrine的代码
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\Setup;
class Bootstrap {
//...some other methods, including getCredentials() which returns DB credentials for Doctrine
public function getEntityManager($env){
$isDevMode = $env == 'dev';
$paths = [ROOT_DIR . '/src'];
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, null, null, false);
$dbParams = $this->getCredentials($env);
$em = EntityManager::create($dbParams, $config);
return $em;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个silex应用程序(源代码在这里)
在App\Form\DataTransformer我有一个MetadataTransformer类.
但该transform方法不起作用(反向转换).
它适用于a App\Form\Metadata AbstractType,它是一个集合的一部分App\Form\ArticleForm AbstractType.
最后一个表单是在我的编辑方法中调用的App\Controller\Admin\ArticleAdminController
数据转换器应该映射这样的数据
{"key":"value"}
Run Code Online (Sandbox Code Playgroud)
进入"表格数据",如:
[{"name":"key","value":"key"}]
Run Code Online (Sandbox Code Playgroud)
因此它可以显示为集合.
Metadata.php
class MetaData extends AbstractType
{
protected $span4 = "span4";
protected $span3 = "span3";
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder
->add('name', 'text', array(
"label" => ' ',
"attr" => array(
"class" => $this->span3,
"placeholder" => "name"
)
))
->add('value', 'text', array(
'label' => ' ',
'attr' => array(
"class" => $this->span4,
'placeholder' => 'value'
)
)) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在首页上插入自定义奏鸣曲表单字段类型,而不是在 SonataAdmin 中,如下所示:
$form = $this->createFormBuilder($content)
->add('titleEs', 'text', array('required' => true, 'label' => 'label.title.spanish', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
->add('contentEs', 'ckeditor', array('required' => true,'label' => 'label.content.spanish', 'attr' => array('class' => 'col-xs-12')))
->add('titleEn', 'text', array('required' => true,'label' => 'label.title.english', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
->add('contentEn', 'ckeditor', array('required' => true, 'label' => 'label.content.english', 'attr' => array('class' => 'col-xs-12')))
->add('header', 'sonata_type_model', array('required' => true,'label' => 'label.content.headerImage'), array('link_parameters' => array('context' => 'content/front', 'size' => 'big')))
//->add('coverImage', 'sonata_type_model_list', array('required' => true,'label' …Run Code Online (Sandbox Code Playgroud) 假设我将自定义表单类型创建为服务,如Symfony文档中所述.但我想要2个"性别"自定义类型,有2个不同的输入参数,我在Symfony 2.7中这样做:
# app/config/config.yml
parameters:
genders1:
m: Male
f: Female
genders2: # This makes no sense at all, but it is for the example purpose!
h: Horse
t: Turtle
Run Code Online (Sandbox Code Playgroud)
然后,我宣布了两个这样的服务:
<!-- src/AppBundle/Resources/config/services.xml -->
<service id="app.form.type.gender1" class="AppBundle\Form\Type\GenderType">
<argument>%genders1%</argument>
<tag name="form.type" alias="gender1" />
</service>
<service id="app.form.type.gender2" class="AppBundle\Form\Type\GenderType">
<argument>%genders2%</argument>
<tag name="form.type" alias="gender2" />
</service>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用相同的 GenderType类来处理2种自定义表单类型(使用gender1和gender2别名),我可以这样使用:
$builder
->add('field1', 'gender1')
->add('field2', 'gender2');
Run Code Online (Sandbox Code Playgroud)
这允许我在一个GenderType具有不同输入参数的类()中添加一些公共逻辑(在这个例子中我有比2更多的可能性).
但是从Symfony 2.8开始,不推荐使用服务别名添加字段.类名必须作为第二个参数传递,如下所示:
$builder->add('field1', GenderType::class)
Run Code Online (Sandbox Code Playgroud)
那么如何才能区分我的2个服务(每个服务都没有相同的输入参数)?
创建Gender1Type和Gender2Type扩展抽象GenderType …
我有一个带有 ChoiceType 字段的 Symfony3 表单。它使用带有 AJAX 数据源的 Select2。这一点工作正常。然而,当表单被提交时,Symfony 验证开始并抱怨:
This value is not valid
Run Code Online (Sandbox Code Playgroud)
我想这是因为通过 AJAX 选择的选择不存在于表单类型的“选择”键中。
我对 Symfony 比较陌生。有人可以指出我正确的方向以禁用现场验证吗?
鉴于以下表单类型,我如何在提交之前呈现我的第二个字段?我试过了,$form->remove但我总是会收到这个错误:
Warning: Illegal offset type in isset or empty
Run Code Online (Sandbox Code Playgroud)
不太确定如何解决这个问题。
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('survey', EntityType::class, [
'class' => SurveyManager::class,
'attr' => [
'class' => 'field-change',
],
])
->add('submit', SubmitType::class, [
])
->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$modifier = $data['survey'];
$form->add('headquarter', EntityType::class, [
'class' => HeadQuarterManager::class,
'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) {
return $er->getHeadquarter($modifier);
}, …Run Code Online (Sandbox Code Playgroud) 我需要从Symfony发送表单ChoiceType :: class
但是我不需要选择键,我需要发送选择值。
那有可能吗?
$form->add('section', ChoiceType::class, array(
'mapped' => false,
'choices' => array(
1 => 'value1',
2 => 'value2'
),
));
Run Code Online (Sandbox Code Playgroud)
如果我选择value1,我只想发送value1,
不是默认的键1。
我想使用参数修改提交的symfony表单的url。从该平台尝试了许多解决方案,但没有解决方案有帮助!
当前网址如下:http://localhost:8000/search?app_bundle_search_form%5Bsearch%5D=qui&app_bundle_search_form%5Bbrand%5D=&app_bundle_search_form%5Bprice%5D=500%2C100000&app_bundle_search_form%5B_token%5D=BtA5bZb9HErUXzXFzGFbpEhlD6nD33zr7tKiPLxjpy4
我想要它像http:// localhost:8000 / search?search = qui?brand =?minprice = 500?maxprice = 100000
这是我的控制器:
public function searchAction($searchTerm=null,Request $request)
{
if ($request->getMethod() == 'GET') {
$searchTerm = $request->query->get('app_bundle_search_form')['search'];
$searchBrand = $request->query->get('app_bundle_search_form')['brand'];
$price = $request->query->get('app_bundle_search_form')['price'];
$price = explode(",", $price);
$minPrice = $price[0];
$maxPrice = $price[1];
$em = $this->getDoctrine()->getManager();
$search = $em->getRepository('AppBundle:Classified')->searchClassifieds($searchTerm, $searchBrand, $minPrice, $maxPrice);
}
return $this->render('search-result.html.twig', [
'searchTerm' => $searchTerm,
'results' => $search
]);
}
Run Code Online (Sandbox Code Playgroud)
形成:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->setMethod('GET')
->add('search', TextType::class,array(
'required'=> false …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的实体UniqueEntity验证:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\ManyToOne;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity("email", message="Email already in use")
*
*
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $email;
Run Code Online (Sandbox Code Playgroud)
表单(故意删除所有其他表单字段)
namespace App\Form;
use App\Entity\Company;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use …Run Code Online (Sandbox Code Playgroud) symfony ×10
symfony-forms ×10
php ×4
doctrine-orm ×2
form-fields ×1
select2 ×1
silex ×1
sonata ×1
sonata-admin ×1
symfony-2.1 ×1
symfony-2.3 ×1
symfony-2.8 ×1
validation ×1