2012-03-12 2 views
1

Использование Zend Framework и метод URL-адрес для просмотра:Изменение разделения символов в Zend URL-

$this->url(array('field1' => this, 'field2' => 'is', 'field3' => 'my example'), 'route_name'); 

Где ROUTE_NAME это название маршрута URL-адрес, а каждое поле # извлекается из базы данных.

Я заметил, что по умолчанию он изменяет пробелы в именах/Action Controller в знак плюс, так что то, что выглядело как:

www.example.com/this is my example 

в

www.example.com/this+is+my+example 

Я хотел бы изменить separatoer от + к - иметь что-то вроде

www.example.com/this-is-my-example 

Я знаю, что другой теме: How to change the separation character of Zend Url? как задокументирован способ сделать это, который я пробовал без успеха.

Подробное объяснение о том, как это сделать, было бы очень признательно.

EDIT2: Я знаю, где проблема, если кто-то заинтересован, он исходит из того, как собирается url, он использует urlencode, который преобразует все символы, отличные от алфавитно-цифровых символов, и _ и пробелы как +, нет способ переопределить это, чем заменить символ, создать URL-адрес вручную (как предлагалось Maxime) или создать пользовательскую функцию url, заменяющую символы (в качестве предложения по aporat) ...

Спасибо!

+0

Можете ли вы привести пример кода, который делает это? Я пробовал с перенаправителем вроде '$ this-> getHelper ('redirector') -> gotoUrl ('/ this is my example');' и я в итоге получаю '% 20' и не' + 'в URL. – Maxime

+0

Просто обновил мое сообщение, надеюсь, что теперь это имеет больше смысла! – AKFourSeven

ответ

1

Если вы действительно этого хотите, вы можете продлить запас Zend_View_Helper_Url, чтобы просмотреть помощник и добавить свою логику URL в ваш помощник.

<?php 
namespace Application\View\Helper; 

class MyUrl extends \Zend_View_Helper_Url 
{ 
    /** 
    * Generates an url given the name of a route. 
    * 
    * @access public 
    * 
    * @param array $urlOptions Options passed to the assemble method of the Route object. 
    * @param mixed $name The name of a Route to use. If null it will use the current Route 
    * @param bool $reset Whether or not to reset the route defaults with those provided 
    * @return string Url for the link href attribute. 
    */ 
    public function myUrl(array $urlOptions = array(), $name = null, $reset = false, $encode = true) 
    { 

    return str_replace('+', '-', parent::url($urlOptions, $name, $reset, $encode)); 
    } 
} 

, а затем просто загрузить новый помощник вида, и вы хорошо идти:

 $helper = new \Application\View\Helper\MyUrl; 
     $this->view->registerHelper($helper, 'myUrl'); 
+0

Сначала было бы неплохо, но не нужно ли это также заботиться о завершающих символах, или что, если некоторые из динамических значений содержат +, включенные в них? – AKFourSeven

+0

После второй мысли я решил использовать написанный вами сценарий. Способ убедиться, что только пробелы или другие буквенно-цифровые (а не «.» И «_» и «-») будут сначала urldecode URL, а затем конвертировать их, чтобы убедиться в пользовательской коррекции. Alos parent: url не работает, потому что URL-адрес сам по себе является помощником, поэтому ему необходимо создать экземпляр Zend_View_Helper_Url, а затем вызвать URL-адрес функции. Тогда пользовательская функция может быть непосредственно вызвана внутри представления, например $ this-> myUrl (...); спасибо большое! – AKFourSeven

1

К сожалению, вы не можете установить ничего перед вызовом функции url(...), чтобы достичь того, что вы хотите сделать. Причина в том, что когда URL-адрес собран, он использует функцию php urlencode(...).

Тем не менее, вы все еще есть много вариантов:

1) Вы просто не использовать функцию url(...) и создать ваши URL-адреса вручную. (Лучший вариант)

2) Вы создаете новый помощник, который действует как url(...), но добавляйте дополнительные изменения в функцию для достижения того, что вы хотите сделать.

3) Вы берете выходные данные функции url (...) и делаете str_replace для изменения + с -. (Я НЕ рекомендую этот вариант)

Лично я создаю все свои URL вручную, чтобы избежать такой проблемы.

+0

Вы совершенно правы, говоря, что вариант 3 - не самый лучший вариант (например, проблемы с символом конца). Я попробую маршрут 1 и 2 и документирую, что сработало для меня, спасибо большое. [EDIT] Я не уверен, что вы имеете в виду, создавая вручную свои URL-адреса. Я думаю, что в конце концов я пошел на смесь решений 2 и 3. – AKFourSeven

+0

Создавая URL-адреса вручную, я имею в виду что-то вроде: '$ url ="/page/{$ var1}/{$ var2} .html ";', а затем делает 'Text'. Таким образом, вы не полагаетесь на функцию, которая строит ваш URL-адрес так, как вы хотите изменить, и вы уменьшаете накладные расходы, сохраняя его простым. – Maxime

+0

Я вижу благодарность за объяснения, это было действительно полезно. – AKFourSeven