Empty parameter in routing

New topics about Symfony 2 should go here

Moderators: dcobalt, tiagojsag

Empty parameter in routing

Postby kabanek » Sat Apr 07, 2012 10:35 pm

Hello!

I have problem with routing.

Code: Select all
company_index:
    pattern:   /{_locale}/companies/{name}/{page}
    defaults:  { _controller: BkielbasaDataManagerCoreBundle:Company:index, name: '', page:1}
    requirements:
        culture:  pl|en


and it works greate when URI is like: /pl/companies/name/1
but sometimes I want to not have 'name' parameter in use eg: /pl/companies//2 , but I get error

No route found for "GET /pl/companies//2"


is it possible to solve this problem without making additional routing?
kabanek
Member
 
Posts: 79
Joined: Sun Mar 06, 2011 1:18 pm

Re: Empty parameter in routing

Postby dreipunktnull » Mon Apr 09, 2012 1:47 pm

I would change the order of parameters to /{_locale}/companies/{page}/{name}
User avatar
dreipunktnull
Faithful Member
 
Posts: 1244
Joined: Fri Jun 17, 2011 10:03 am
Location: Germany

Re: Empty parameter in routing

Postby kabanek » Mon Apr 09, 2012 2:11 pm

but there will be more parameters whitch can be empty :(
kabanek
Member
 
Posts: 79
Joined: Sun Mar 06, 2011 1:18 pm

Re: Empty parameter in routing

Postby blogsh » Tue Apr 10, 2012 5:09 pm

Set a requirement that matches "everything":

Code: Select all
company_index:
    pattern:   /{_locale}/companies/{name}/{page}
    defaults:  { _controller: BkielbasaDataManagerCoreBundle:Company:index, name: '', page:1}
    requirements:
        name: .*
        culture:  pl|en
blogsh
Faithful Member
 
Posts: 501
Joined: Thu Mar 03, 2011 9:35 pm
Location: Germany

Re: Empty parameter in routing

Postby kabanek » Tue Apr 10, 2012 8:27 pm

it almost working

I wrote:

Code: Select all
company_index:
    pattern:   /{_locale}/companies/{name}/{sort}/{sortType}/{page}
    defaults:  { _controller: BkielbasaDataManagerCoreBundle:Company:index, name: '', sort: 'name', sortType: 'DESC', page:1}
    requirements:
        culture:  pl|en
        page:  \d+
        name: (a-zA-Z0-9)*
        sort: (a-zA-Z)*
        sortType: (a-zA-Z)*


and it is ok, but when i set name = a i get error

An exception has been thrown during the rendering of a template ("Parameter "name" for route "company_index" must match "(a-zA-Z0-9)*" ("a" given).") in BkielbasaDataManagerCoreBundle:Pagination:pagination.html.twig at line 14


template:
Code: Select all
{% if pagination.hasPagination()%}
    <div class="paginator">
    {% if pagination.getCurrentPage() != 1 %}
        <a href="{{ path(pagination.getRoutingName(), pagination.getFirstPageArguments()) }}" class="page-far-left">First</a>
        {% if pagination.getCurrentPage() != 2 %}
        <a href="{{ path(pagination.getRoutingName(), pagination.getPrevPageArguments()) }}" class="page-left">Prev</a>
        {% endif%}
    {% endif%}
    <div id="page-info">{% trans %}Page{% endtrans %} {{pagination.getCurrentPage()}} / {{pagination.countPages()}}</div>
    {% if pagination.countPages() != pagination.getCurrentPage() %}
        {% if pagination.countPages() - 1 != pagination.getCurrentPage() %}
        <a href="{{ path(pagination.getRoutingName(), pagination.getNextPageArguments()) }}" class="page-right">Next</a>
        {% endif%}
        <a href="{{ path(pagination.getRoutingName(), pagination.getLastPageArguments()) }}" class="page-far-right">Last</a>
    {% endif%}
    </div>
{% endif %}


and here is my pagination clas:

Code: Select all
<?php

namespace Bkielbasa\DataManager\CoreBundle\Helper;

/**
 * Pagination class
 *
 * @author Bartłomiej Kiełbasa <bartlomiej.kielbasa@gmail.com>
 */
class Pagination {
   
    /**
     *
     * @var int
     */
    protected $_current_page;
       
    /**
     *
     * @var int
     */
    protected $_limit;
   
    /**
     * array with all items
     * @var array
     */
    protected $_items;
   
    /**
     * Argument to routing
     * helps in creating correct nice URL's
     * @var array
     */
    protected $_routing_arguments = array();
   
    /**
     * Routing using to create URL's
     * @var string
     */
    protected $_routing_name;

    /**
     *
     * @param array $items
     * @param int $page
     * @param int $limit
     */
    function __construct(array $items, $page = 1, $limit = 10)
    {
        $this->_items = $items;
        $this->_current_page = $page > 0 ? $page : 1;
        $this->_limit = $limit;

        foreach ($_GET as $name => $value) {
            $this->addArgument($name, $value);
        }

        $this->addArgument('page', $this->_current_page);
    }
   
    function setRequest(\Symfony\Component\HttpFoundation\Request $request)
    {
       foreach ($request->attributes->all() as $name => $value) {
          if ($name[0] != '_' && !$this->hasArgument($name)) {
             $this->addArgument($name, $value);
          }
       }
    }
   
    /**
     *
     * @param int $page
     */
    function setCurrentPage(int $page)
    {
        $this->_current_page = $page;
        $this->_routing_arguments['page'] = $page;
    }
   
    /**
     *
     * @return int
     */
    function getCurrentPage()
    {
        return $this->_current_page;
    }
   
    /**
     *
     * @param int $Limit
     */
    function setLimit(int $Limit)
    {
        $this->_limit = $Limit;
    }
   
    /**
     *
     * @return int
     */
    function getLimit()
    {
        return $this->_limit;
    }
   
    /**
     * Returns items from current page
     * @return array
     */
    function getItems()
    {
        $count_items = count($this->_items);
       
        $items = array_chunk($this->_items, $this->_limit);
       
        return count($items) ? $items[$this->_current_page - 1] : array();
    }
   
    /**
     * Returns true if pagination should be shown, otherwise returns false
     * @return boolean
     */
    function hasPagination()
    {
        return count($this->_items) > $this->_limit ? true : false;
    }
   
    /**
     * Counts all pages in pagination
     * @return int
     */
    function countPages()
    {
        return ceil(count($this->_items) / $this->_limit);
    }
   
    /**
     *
     * @param string $key
     * @param string $value
     */
    function addArgument($key, $value)
    {
        $this->_routing_arguments[(string)$key] = (string)$value;
    }
   
    /**
     *
     * @param array $arguments
     */
    function addArguments(array $arguments)
    {
        $this->_routing_arguments = array_merge($arguments, $this->_routing_arguments);
    }
   
    /**
     *
     * @return array
     */
    function getArguments()
    {
        return $this->_routing_arguments;
    }
   
    function hasArgument($name)
    {
       return isset($this->_routing_arguments[$name]) ? true : false;
    }
   
    /**
     *
     * @return array
     */
    function getFirstPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = 1;

        return $args;
    }
   
    /**
     *
     * @return array
     */
    function getSecondPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = 2;
        return $args;
    }
   
    /**
     *
     * @return array
     */
    function getPrevPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = $args['page'] - 1;
        return $args;
    }
   
    /**
     *
     * @return array
     */
    function getLastPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = $this->countPages();
        return $args;
    }
   
    /**
     *
     * @return array
     */
    function getNextPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = $args['page'] + 1;
        return $args;
    }
   
    /**
     *
     * @return array
     */
    function getBeforeLastPageArguments()
    {
        $args = $this->_routing_arguments;
        $args['page']   = $this->countPages() - 1;
        return $args;
    }
   
    /**
     *
     * @param string $routing
     */
    function setRoutingName($routing)
    {
        $this->_routing_name = $routing;
    }
   
    function getRoutingName()
    {
        return $this->_routing_name;
    }
}


the array I want to put to routing is:

Code: Select all
array(4) {
  ["name"]=>
  string(1) "a"
  ["page"]=>
  float(2)
  ["sort"]=>
  string(4) "name"
  ["sortType"]=>
  string(4) "DESC"
}


what's wrong? Regexp is incorrect?
kabanek
Member
 
Posts: 79
Joined: Sun Mar 06, 2011 1:18 pm

Re: Empty parameter in routing

Postby blogsh » Wed Apr 11, 2012 12:00 am

Yes, the regex is wrong.

Your attempt
Code: Select all
(a-zA-Z0-9)*

would match one of these lines:
Code: Select all
a-zA-Z0-9
a-zA-Z0-9a-zA-Z0-9
a-zA-Z0-9a-zA-Z0-9a-zA-Z0-9

or an empty string ;)

The right one is
Code: Select all
[a-zA-Z0-9]*
blogsh
Faithful Member
 
Posts: 501
Joined: Thu Mar 03, 2011 9:35 pm
Location: Germany

Re: Empty parameter in routing

Postby kabanek » Wed Apr 11, 2012 9:36 am

thanks
kabanek
Member
 
Posts: 79
Joined: Sun Mar 06, 2011 1:18 pm

Re: Empty parameter in routing

Postby zayenzeki » Fri Mar 29, 2013 4:06 pm

bjr je la meme problème avec cet url http://127.0.0.1:9030/heures-prieres/pr ... s/2012//fr
Code: Select all
heuresprieres2:
  url: /heures-prieres/print/:ville/:month/:year/:refM/:sf_culture
  requirements: { sf_culture: (?:fr|en) }
  param: { module: heuresprieres, action: printSalat }


aidez moi svp
zayenzeki
Junior Member
 
Posts: 2
Joined: Fri Mar 29, 2013 4:00 pm

Re: Empty parameter in routing

Postby Ast Derek » Wed Apr 03, 2013 9:24 pm

Try separating your route into two different routes. This way the parameters won't get mixed:

Code: Select all
heuresprieres_1:
  url: /heures-prieres/print/:ville/:month/:year/:sf_culture
  requirements: { sf_culture: (?:fr|en) }
  param: { module: heuresprieres, action: printSalat }

heuresprieres_2:
  url: /heures-prieres/print/:ville/:month/:year/:refM/:sf_culture
  requirements: { sf_culture: (?:fr|en) }
  param: { module: heuresprieres, action: printSalat }
Ast Derek
Junior Member
 
Posts: 1
Joined: Wed Apr 03, 2013 9:14 pm


Return to General Symfony 2 discussion

Who is online

Users browsing this forum: zaki213 and 12 guests