我在Silex应用程序中使用Symfony和Twig.
我有一个表格的注册页面:
{% extends "base.twig" %}
{% block title %}Welcome to My Example site{% endblock %}
{% block head %}
{{ parent() }}
{% endblock %}
{% block content %}
<div class="row">
<div class="span12">
<h2>Register</h2>
<p>
Register for this site and we'll give you free access to cool stuff
in addition you can subscribe to our premium content.
</p>
<form action="{{app.config.site.secureUrl}}/register-handler" method="post">
<fieldset >
{{ form_widget(form) }}
<button type="submit" class="btn btn-info">Send</button>
</fieldset>
</form>
</div>
</div>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
尝试呈现页面时出现以下错误: …
在Symfony中上传大于post_max_size的文件时,上传的文件将在内存中分配.
致命错误:第28行的/Applications/MAMP/htdocs/Symfony/vendor/symfony/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php中允许的内存大小为150994944字节(试图分配84627994字节)
为什么symfony试图在POST时将文件分配给内存?
1/php.ini
file_uploads = On
upload_tmp_dir = /Applications/MAMP/tmp/php
upload_max_filesize = 32M
post_max_size = 48M
Run Code Online (Sandbox Code Playgroud)
2 /控制器
<?php
//AcmeDemoBundle/Controller/DemoController
namespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
class DemoController extends Controller
{
public function createAction(Request $request)
{
if ($request->getMethod() == 'POST')
{
if ($_FILES["file"]["size"] < 3000000 )//3Mb
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
if (empty($_POST) && empty($_FILES) && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post')
{
echo "The file is …Run Code Online (Sandbox Code Playgroud) 我一直在关注以下资源的文档
http://silex.sensiolabs.org/doc/providers/form.html
但是我收到以下错误
Twig_Error_Syntax: The function "form_widget" does not exist in "layout.html.twig"
Run Code Online (Sandbox Code Playgroud)
我已经多次查看了文档和我的源代码,我仍然看不到我出错的地方,我错过了什么?我安装了Symfony Twig Bridge.
<?php
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Yaml\Parser;
use Silex\Provider\FormServiceProvider;
$app = new Silex\Application();
$app['debug'] = true;
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__. '/src/views',
'twig.options' => array(
'debug' => true,
'cache' => false
),
));
$app['twig']->addExtension(new Twig_Extension_Debug());
$app['yaml'] = new Parser();
//.....
$app->register(new FormServiceProvider());
$app->register(new Silex\Provider\ValidatorServiceProvider());
$site['name'] = 'My Site';
// More definitions for $site
$app->match('/', function() use($app, $site) {
return $app['twig']->render('layout.html.twig', $site);
})->method('POST|GET'); …Run Code Online (Sandbox Code Playgroud) 我是Symfony 2 Framework的新手.我想形成实体ManyToOne关系的嵌入.我必须实体地址和地址类型
地址实体
namespace Webmuch\ProductBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
class Address
{
private $id;
private $line1;
private $city;
private $zip;
private $phone;
/**
* @var string $type
*
* @ORM\ManyToOne(targetEntity="AddressType")
* @ORM\JoinColumn(name="address_type_id", referencedColumnName="id")
*/
private $type;
}
Run Code Online (Sandbox Code Playgroud)
AddressType实体
namespace Webmuch\ProductBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
class AddressType
{
private $id;
private $title;
}
Run Code Online (Sandbox Code Playgroud)
地址控制器
namespace Webmuch\ProductBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Webmuch\ProductBundle\Entity\Address;
use Webmuch\ProductBundle\Form\AddressType;
/**
* Address controller.
* …Run Code Online (Sandbox Code Playgroud) 将主题应用于表单字段很容易,例如:
{% form_theme form _self %}
{% block _product_name_widget %}
{{ block('field_widget') }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
但是如果表单字段是集合类型怎么办?例如: product['models'][1][comment我不知道如何定制它.(这可能是第一个问题)
更新: anwser here:Symfony2:带有data-prototype的集合表单字段类型
我试图获取实体的所有验证约束并将这些约束转换为Jquery验证规则,现在我能够获得注释定义的约束(感谢:Symfony2获得实体的验证约束),但是我在获取xml和yml时遇到了一些麻烦那些.
$xml_file_loader = new XmlFileLoader("path_to_my_project/vendor/friendsofsymfony/user-bundle\FOS\UserBundle\Resources\config\validation.xml");
Run Code Online (Sandbox Code Playgroud)
使用类似的代码意味着我需要事先知道xml/yml文件的位置,我试图以某种方式编写一个可以自动执行此操作的通用代码.
有没有办法立刻获得所有约束?如果不是我怎么知道xml/yml文件的位置,并且在继承的情况下我需要检查父约束...这可行吗?
我在这里问了一个问题如何在FormType中使用Repository自定义函数但是没有人使用,所以我做了一点挖掘并提前了一点但我仍然得到这个错误:
Notice: Object of class Proxies\__CG__\Kpr\CentarZdravljaBundle\Entity\Category
could not be converted to int in /home/kprhr/public_html/CZ_Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php line 457
Run Code Online (Sandbox Code Playgroud)
现在这是我的CategoryType的样子:
<?php
namespace Kpr\CentarZdravljaBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Bridge\Doctrine\RegistryInterface;
class CategoryType extends AbstractType
{
private $doctrine;
public function __construct(RegistryInterface $doctrine)
{
$this->doctrine = $doctrine;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Kpr\CentarZdravljaBundle\Entity\Category',
'catID' => null,
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$someId = $builder->getData()->getId();
$param = ($someId) ? $someId : 0;
$catID = $options['catID']; …Run Code Online (Sandbox Code Playgroud) 我有一个布尔字段,我把它作为一个选择字段放在一个表单中(是或否).没有数据转换器,我会得到0或1.我添加了一个视图BooleanToStringTransformer(看起来合理):
$builder
->add(
$builder->create('myBooleanField', 'choice', array(
'choices' => array(true => 'Yes', false => 'No'),
))
->addViewTransformer(new BooleanToStringTransformer('1'))
)
Run Code Online (Sandbox Code Playgroud)
当我尝试显示表单时,我收到错误"Expected a Boolean.".在创建表单之前,我的字段设置为false.
我试图将它设置为模型转换器:表单被调度,但是当我提交它时,我的字段被声明为无效.
我究竟做错了什么?
编辑:我差不多了.
array(true => 'Yes', false => 'No')为array('yes' => 'Yes', 'no' => 'No')所以代码现在看起来像 ->addModelTransformer(new BooleanToStringTransformer('yes'))
数据转换工作,除了我的字段始终设置为true,无论我选择什么值.
怎么了?
我想在一种形式中使用来自少数实体的字段,我可以这样做吗?例如,我想surname从ProfileType类型和name字段中添加一个表单字段CountryType.这个字段必须是一个简单的字符串(text).
我该怎么做?谢谢!
注意:我不能使用实体类型,因为Symfony只提供复选框,单选按钮并选择它,但是我需要使用一个简单的文本字段.
我有indexAction和contactAction
contactAction是一个简单的表单,没有映射字段(FormType),如下所示:
/**
* @Route("/contact", name="contact")
* @Template()
* @param Request $request
* @return array
*/
public function contactAction(Request $request)
{
$form = $this->createForm(new ContactType());
$form->handleRequest($request);
if ($form->isValid()) {
$firstName = $form->get('first_name')->getData();
$lastName = $form->get('last_name')->getData();
$email = $form->get('email')->getData();
$message = $form->get('message')->getData();
}
return array(
'form' => $form->createView()
);
}
Run Code Online (Sandbox Code Playgroud)
我用这个TWIG命令在我的indexAction中渲染这个表单:
{{ render(controller('RusselBundle:Default:contact')) }}
Run Code Online (Sandbox Code Playgroud)
一切都很好,如果页面没有重新加载,HTML5验证器工作正常,但如果表单有一些错误,如:firstName长度,错误根本不显示,我该怎么办,以便错误出现在indexAction形式?任何帮助,将不胜感激.我只是好奇它是可能的,如果 - 如何?对不起我的英语不好....
symfony-forms ×10
symfony ×9
php ×5
twig ×3
forms ×2
silex ×2
doctrine ×1
doctrine-orm ×1
many-to-one ×1
symfony-2.3 ×1