Есть ли помощник Symfony для получения текущего URL-адреса действия и изменения одного или нескольких параметров запроса? - PullRequest
6 голосов
/ 05 января 2010

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

Спасибо!

[edit:] Чувак, мне было неясно, что я на самом деле хочу делать. Я хочу создать URL для "этой страницы", но изменить одну из переменных. Представьте, что страница, на которой я нахожусь, является страницей с результатами поиска, на которой написано «нет результатов, но попробуйте один из них», за которой следует множество ссылок. Ссылки будут содержать все параметры поиска, кроме одного, который я бы изменил для каждой ссылки.

Ответы [ 5 ]

5 голосов
/ 05 января 2010

Изменить:

Хорошо, теперь я понял, что вы хотите. Я не знаю, является ли это лучшим способом, но вы могли бы попробовать это (в представлении):

url_for('foo', 
        array_merge($sf_request->getParameterHolder()->getAll(), 
                    array('bar' => 'barz'))
)

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

Или, если вы хотите только подмножество параметров запроса, сделайте следующее:

url_for('foo', 
         array_merge($sf_request->extractParameters(array('parameter1', 'parameter3')),
                     array('bar' => 'barz'))
)

(я форматировал код таким образом для лучшей читаемости)


Оригинальный ответ:

Я не знаю, где вы хотите изменить параметр (в контроллере?), Но если у вас есть доступ к текущему объекту sfRequest, это должно сделать это:

$request->setParameter('key', 'value')

Вы можете получить объект запроса, либо определив свое действие следующим образом:

public function executeIndex($request) {
     // ...
}

или это

public function executeIndex() {
     $request = $this->getRequest();
}
2 голосов
/ 10 августа 2011

Для Symfony 1.4 я использовал:

$current_uri = sfContext::getInstance()->getRouting()->getCurrentInternalUri();
$uri_params = $sf_request->getParameterHolder()->getAll();
$url = url_for($current_uri.'?'.http_build_query(array_merge($uri_params, array('page' => $page))));
echo link_to($page, $url);
1 голос
/ 07 января 2010

Предложение Феликса хорошо, однако, оно потребовало бы, чтобы вы жестко осилили «текущий маршрут» ..

Вы можете получить название текущего маршрута, используя:

sfRouting::getInstance()->getCurrentRouteName()

, и вы можете подключить его непосредственно к url_for, вот так:

url_for(sfRouting::getInstance()->getCurrentRouteName(), 
         array_merge($sf_request->extractParameters(array('parameter1', 'parameter3')),
                     array('bar' => 'barz'))
)

Надеюсь, это поможет.

0 голосов
/ 20 ноября 2015

echo $ sf_context-> getRequest () -> getUri ();

0 голосов
/ 03 ноября 2011

С той же концепцией, что и у Erq, и благодаря его коду я сделал то же самое с некоторыми небольшими изменениями, поскольку мой URL должен преобразовывать некоторые символы. Хотя он является общим и должен работать с большинством форм, чтобы сохранить параметры, которые пользователь выбрал для поиска.

public function executeSaveFormQuery(sfWebRequest $request)
{
$sURLServer = "http://";
$sURLInternalUri = "";
$page = "";
$sURLInternalUri = sfContext::getInstance()->getRouting()->getCurrentInternalUri();
$suri_params = $request->getParameterHolder()->getAll();
$sParams = http_build_query(array_merge($suri_params));

$dpos = strpos($sURLInternalUri, "?");
$sURLConsulta[$dpos] = '/';
$sURL = substr($sURLInternalUri, $dpos);
$dpos = strpos($sURL, "=");
$sURL[$dpos] = '/';

$sURLFinal = $sURLServer . $sURL . '?' . $sParams;

//$this->redirect($this->module_name . '/new');
self::executeNew($request, $sURLFinal);
//echo "var_dump(sURLFinal): "; 
//var_dump($sURLFinal);
//echo "<br></br>";
//return sfView::NONE;
}

В executeNew, так же просто, как:

public function executeNew(sfWebRequest $request, $sURLQuery)
{
//$sURLQuery= "http://";
if ($sURLQuery!= "")
{
    $this->form = new sfGuardQueryForm();
    //echo "var_dump(sURLQuery)";
    //var_dump($sURLQuery);
    //echo "<br></br>";

    $this->form->setDefault('surl', $sURLQuery);
}
else
{
            $this->form = new sfGuardQueryForm();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...