Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: Obsługa formularzy w Symfony 2

Mam taki formularz
<form action="{{path('admin_comment_new', {'slug':a.slug})}}" method="post" novalidate >
<textarea></textarea>
<div class="form-actions">
<input class="btn btn-primary" type="submit" value="Komentuj"/>
</div>
</form>


controler obsługujący go:
/**
* @Secure(roles=" ")
* @Route("../article/{slug}", name="admin_comment_new")
* @Template
*/
public function newAction() {

$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'));


$commentform = new CommentForm();
$commentform->setComment(new Comment());

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

if ($process) {
$this->setFlash('aviso1', 'Komentarz dodany');
}

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

);
}


Jak je połączyć żeby zapisywało komentarze z textarea do tabeli comments ???

konto usunięte

Temat: Obsługa formularzy w Symfony 2

Zacznij od przeczytania tego poradnika.

Generalnie schemat wygląda tak:
1. Tworzysz nowy obiekt Comment
2. Tworzysz formularz i przekazujesz jako $data ten pusty obiekt Comment.
3. Dodajesz odpowiednie pola do formularza
4. W akcji sprawdzasz czy został wysłany odpowiedni request
5. Sprawdzasz czy formularz nie zawiera błędów (isValid).
6. Robisz persist obiektu Comment w EntityManagerze
7. Robisz flusha i wyświetlasz ładny komunikat.

Z kodu, który przedstawiłeś wynika, że punktami od 4 do 7 zajmuje się CommentFormHandler. Masz źle wyrenderowany formularz, textarea bez atrybutu name nie przejdzie ;) Poza tym w Symfony2 atrybuty name występują w postaci tablic form_name["field_name"], zamiast ręcznie renderować powinno się użyć form_widget (rozszerzenie Twiga)
Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: Obsługa formularzy w Symfony 2

Rzeczywiście form.widget {{ form_widget(form) }} działa w innych szablonach tylko jak dołączam go do szablonu wychodzi: Variable "form" does not exist in MiblogBundle:Articles:index.html.twig at line 28Krzysztof Płonka edytował(a) ten post dnia 07.03.13 o godzinie 21:31

konto usunięte

Temat: Obsługa formularzy w Symfony 2

Dołączasz to najwidoczniej do złego szablonu. Kod, który przedstawiłeś tyczy się newAction czyli jak już to MiblogBundle:Articles:new.html.twig, przynajmniej na to wskazuje konfiguracja.
Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: Obsługa formularzy w Symfony 2

Problem w tym że to pole tekstowe musi być w szablonie Article, bo to komentarz dopisywany do artykułów...
Krzysztof Płonka

Krzysztof Płonka Magento front-end

Temat: Obsługa formularzy 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_idKrzysztof Płonka edytował(a) ten post dnia 10.03.13 o godzinie 19:40

Następna dyskusja:

Wspólna nauka Symfony




Wyślij zaproszenie do