http-redirectzend-framework3zend-route

ZF3 redirect()->toUrl() not redirecting


I'm having a weird issue with ZF3. I have a vanilla form in the view and a jquery ajax to send it to the controller, something like this:

<form>some form</form>
<script>
    $("#form").submit(function (e) {
        e.preventDefault();
        $.ajax({
            method: "POST",
            url: "stats",
            data: {name: 'TEST'} // name selected in the form
        });
    });
</script>

The controller for action stats looks like this:

$stat = new Stat();

$route_name = $this->params()->fromRoute('name', 'none');
$post_name = $this->params()->fromPost('name', 'none');

if(!strcmp($route_name, 'none')) // if no redirection yet
{
    if(!strcmp($post_name, 'none')) // if no form was sent
    {
        // display the form to choose the customer
        return new ViewModel([
            'customer_list' => $stat->get_customer_list(),
        ]);
    }
    else // if the form was sent, get name and direct to /stats/someName
    {
        return $this->redirect()->toRoute('stats', ['name' => 'someName']);
    }
}
else // after redirection, get the name in the URL and show some data about this customer
{
    return new ViewModel([
        'avg_time' => $stat->get_avg_time(rawurldecode($route_name)),
    ]);
}

The problem is that the redirection does not occure on the screen but I still get the route parameter if I print $route_name after submitting the form.

Anyway, the goal is to have a form with a select to choose the customer name and load the customer data into /stats/[name]. Am I going in the wrong direction ? And is the redirection issue a bug or my code is wrong ?


Solution

  • So there I solved it thx to rkeet, this is the form & jquery:

    <form id="customer_choice" method="POST" action=""> some form </form>
    <script>
        $("#customer_choice").submit(function () {
            $("#customer_choice").attr('action', 'stats/' + $("#customer_select").val())
        });
    </script>
    

    And this is the controller (hope no customer is named 'none'):

    $stat = new Stat();
    
    $name = $this->params()->fromRoute('name', 'none');
    
    if(!strcmp($name, 'none'))
    {
        return new ViewModel([
            'customer_list' => $stat->get_customer_list(),
        ]);
    }
    else
    {
        return new ViewModel([
            'avg_time' => $stat->get_avg_time($name),
        ]);
    }
    

    The result is basepath/stats/[customer name] and changing the url manually works as well.

    (if you don't want changing the url manually to change the result, use fromPost instead of fromRoute)