Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: [SF2] Obsługa formularza w Symfony 2

Próbuję dołączyć form_widget ale wyskakuje: An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Argument 1 passed to Symfony\Bridge\Twig\Extension\FormExtension::setTheme() must be an instance of Symfony\Component\Form\FormView, null given, called in C:\xampp\htdocs\miblog-symfony-demo\app\cache\prod\twig\4f\80\29bc590343503f42640624a2600e.php on line 23 and defined in C:\xampp\htdocs\miblog-symfony-demo\vendor\symfony\src\Symfony\Bridge\Twig\Extension\FormExtension.php line 56") in AdminBundle:Comments:new.html.twig at line 2.

new.html.twig

{% form_theme form 'AdminBundle:Form:fields.html.twig' %}

{% block contenido %}

<form action="{{path('admin_comment_new') }}" method="post" novalidate >
{{ form_widget(form.age) }}
<div class="form-actions">
<input class="btn btn-primary" type="submit" value="Komentuj"/>
</div>
</form>
{% endblock %}

plik fields.html.twig

{% extends 'form_div_layout.html.twig' %}
{% block integer_widget %}
<div class="integer_widget">
{% set type = type|default('number') %}
{{ block('field_widget') }}
</div>
{% endblock %}

konto usunięte

Temat: [SF2] Obsługa formularza w Symfony 2

Źle wykorzystujesz blok form_theme.
form_theme pozwala ustawić szablon twiga, z którego będą wybierane bloki podczas renderowania konkretnego widoku formularza.
Założmy, że masz akcje w kontrolerze o nazwie "create"


use Acme\TaskBundle\Entity\News;

class DefaultController extends Controller
{
/**
* @Route("/", name="news_create")
* @Template()
*/
public function createAction()
{
$news = new News();

$form = $this->createFormBuilder($news)
->add('title', 'text')
->add('content', 'text')
->getForm();

return array(
'form_edit' => $form->createView();
);
}
}


Do widoku przekazujesz instancję FormView pod nazwą form_edit.
Załóżmy, że masz szablon AdminBundle:Form:fields.html.twig w którym nadpisałeś blok renderujący zwykłego inputa tekstowego. Jeżeli chcesz aby form_widget podczas renderowania wykorzystał Twój szablon musisz go wcześniej ustawić a robisz to w następujący sposób:

{% form_theme form_edit 'AdminBundle:Form:fields.html.twig' %}

Pamiętaj, że zaraz po form_theme podajesz zmienną będącą instancją FormView.
Równie dobrze zamiast 'AdminBundle:Form:fields.html.twig' mógłbyś użyć zmiennej predefiniowanej _self, która wskazuje na aktualnie renderowany szablon.
Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: [SF2] Obsługa formularza w Symfony 2

Ale ja nie chcę tworzyć swojego formularza tylko wyświetlić form_widget ...

konto usunięte

Temat: [SF2] Obsługa formularza w Symfony 2

form_theme nie tworzy formularza, definiuje jedynie sposób jego wyświetlania.

Ale skoro nie chcesz go "tworzyć" to w jakim celu używasz {% form_theme form 'AdminBundle:Form:fields.html.twig' %}? To właśnie ten kawałek generuje błąd.
Poczytaj trochę więcej dokumentacji zamiast na siłę używać kodu, którego nie rozumiesz
Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: [SF2] Obsługa formularza w Symfony 2

Zmieniłem sposób zapisu,
to jest widok index.html.twig z przyciskiem Komentuj:
<div class="btn-group">
<a href="{{ path('admin_comment_new', {'id':a.id}) }}"><button class="btn btn-primary">Komentuj</button></a>
</div>

controller AdminCommentController.php:
/**
* @Secure(roles="ROLE_ADMIN")
* @Route("comment/new/{id}", name="admin_comment_new")
* @Template("AdminBundle:Comments:new.html.twig")
*/
public function newAction($id) {

// chodzi o przyporządkowanie komentarza do okreslonego artykułu - article_id
$em = $this->container->get('doctrine')->getEntityManager();
$rs = $em->getRepository('MiblogBundle:Comment')->findOneBy(
array(
'article_id' => $id,
));

$form = $this->container->get('form.factory')->create(new CommentFormType(), array());

$form_handler = new CommentFormHandler(
$form,
$this->container->get('request'),
$this->container->get('doctrine.orm.entity_manager'),
$this->container->get('security.context')->getToken()->getUser());

$commentform = new CommentForm();
$commentform->setComment(new Comment());
$commentform->setComment($rs);
// $commentform->setConfirmTags(true);

$process = $form_handler->process($commentform);

if ($process) {
$this->setFlash('aviso1', 'Komentarz dodany');
return new RedirectResponse($this->container->get('router')->generate('web_main'));
}

return array(
'form' => $form->createView(),
);
}

i widok new.html.twig:
{% extends "AdminBundle::layout_admin.html.twig" %}

{% block contenido %}

<form action="{{path('admin_comment_new', {'id':id})}}" method="post" novalidate >
{{ form_widget(form) }}
<div class="form-actions">
<input class="btn btn-primary" type="submit" value="Komentuj"/>
</div>
</form>
{% endblock %}

Ale niestety wychodzi: Unrecognized field: article_id. W jaki sposób przypisać do nowotworzonego rekordu wartość $id pod pole article_id tabeli comments ???Krzysztof Płonka edytował(a) ten post dnia 10.03.13 o godzinie 21:05



Wyślij zaproszenie do