Nick Price
Nick Price

Reputation: 963

Symfony2 - Display data on same page

I am having a little trouble displaying data on the same page again. I have a simple view

{% block main %}
    <div class="col-md-4">

        <section class="panel panel-default">
            <div class="panel-body">
                <form action="{{ path('NickAlertBundle_tsubmit') }}" method="post" enctype="multipart/form-data" class="terminalForm" id="terminalForm">
                    <div class="row">
                        <div class="col-md-12">
                            <input type="text" class="addMargin" id="terminal_command" name="terminal_command" placeholder=">">
                        </div>
                    </div>

                    <div class="row">
                        <div class="col-md-8 col-md-offset-4">
                            <input type="submit" class="btn btn-default" id="terminal_submit" value="Submit">
                        </div>
                    </div>
                </form>
            </div>
        </section>

    </div>

    <div class="col-md-8" id="terminal-window">

    </div>
{% endblock %}

So on that view I display a form. The user enters some data and then I want the response display in the terminal-window div. So I have set up routes

NickAlertBundle_terminal:
    pattern:  /terminal
    defaults: { _controller: NickAlertBundle:Alert:terminal }
    methods:  [GET]

NickAlertBundle_tsubmit:
    pattern:  /terminal
    defaults: { _controller: NickAlertBundle:Alert:tcreate }
    methods:  [POST]

The GET simply renders the initial page, the POST controller is doing

public function terminalAction()
{
    return $this->render('NickAlertBundle:Page:terminal.html.twig');
}

public function tcreateAction(Request $request)
{
    try {
        $terminal_command = strtoupper($request->get('terminal_command'));

        $uapiService = $this->container->get('alert_bundle.api_service');
        $commandData = $uapiService->terminalService($terminal_command);

        return $this->render('NickAlertBundle:Page:terminal.html.twig', array(
            'data' => $commandData,
        ));

    }catch (Exception $e) {
    }
}

Is this the correct way to do it? Reason I ask is because if I add the following to my div in the view

{% for d in data %}
    {{ d }}
{% endfor %}

I obviously get the following error

Variable "data" does not exist in...

So how can I render the data that is returned from the form submission?

Thanks

Upvotes: 1

Views: 451

Answers (1)

bassplayer7
bassplayer7

Reputation: 934

This is because Twig expects data to be passed to the template the first time the page is rendered (which is handled by the initial GET controller). To remedy the issue, you need to check to determine if data has been defined.

I would do something like this:

{% if data is defined %}
    {% for d in data %}
        {{ d }}
    {% endfor %}
{% endif %}

Now, when the form initially loads but is empty, Twig first checks to see if the variables was passed to it, and since it doesn't, it just skips the for loop altogether.

The other option would be to simply pass an empty array in your first controller. I would view it as less desirable unless you are persisting data and at that point it would be practical anyway.

Upvotes: 2

Related Questions