вторник, 2 марта 2010 г.

Как заменить в URL search[name] на search_name?

Когда отправляется форма поиска (разумеется, методом GET), то в адресной строке появляется длинная строчка, где параметры представлены в виде PHP-массива: search[name]=a&search[age]=27&... На мой взгляд это не очень красиво, и хотелось бы заменить это на s_name=a&s_age=27&... Как это сделать?
Шаг номер один - заменяем в классе формы Name Format:
$this->setNameFormat('s_%s');
Затем - самое сложное. Когда Name Format представлен в виде PHP-массива (с квадратными скобками), то получается легко и просто сделать bind параметров для этой формы. Нам же придется предварительно разобрать $request и вытащить оттуда все поля формы, и собрать их в массив, чтобы передать в $form->bind(). Для этого напишем метод, который поместим в класс экшенов:
  static private function getParametersForForm(sfWebRequest $request,$pattern)
  {
    $pattern='@^'.str_replace('%s','(.*?)',$pattern).'$@';
    
    $result=array();
    
    $parameters=$request->getGetParameters();

    foreach ($parameters as $name=>$value)
    {
      if (preg_match($pattern,$name,$match))
      {
        $result[$match[1]]=$request->getParameter($name);
      }
    }
    
    return $result;
  }

$pattern в списке аргументов - это не что иное, как Name Format формы.

Остается немного подправить bind:
$params=self::getParametersForForm($request,$form->getWidgetSchema()->getNameFormat());
$form->bind($params);

И готово!

Комментариев нет:

Отправить комментарий