2010-01-04 5 views
6

Điều tôi muốn làm là lấy tuyến đường cho hành động hiện tại cùng với bất kỳ và tất cả các thông số tuyến đường và chuỗi truy vấn, và thay đổi một tham số chuỗi truy vấn đơn lẻ thành một thứ khác. Nếu tham số được đặt trong yêu cầu hiện tại, tôi muốn nó được thay thế. Nếu không, tôi muốn nó được thêm vào. Có một người trợ giúp cho một cái gì đó như thế này, hay tôi cần phải viết của riêng tôi?Có trình trợ giúp Symfony để nhận URL hành động hiện tại và thay đổi một hoặc nhiều tham số truy vấn không?

Cảm ơn!

[sửa] Man, tôi không rõ những gì tôi thực sự muốn làm. Tôi muốn tạo URL cho "trang này", nhưng thay đổi một trong các biến. Hãy tưởng tượng trang tôi đang truy cập là trang kết quả tìm kiếm có nội dung "không có kết quả, nhưng hãy thử một trong các kết quả này", theo sau là một loạt các liên kết. Các liên kết sẽ chứa tất cả các tham số tìm kiếm, ngoại trừ một tham số tôi sẽ thay đổi cho mỗi liên kết.

Trả lời

5

Edit:

Ok Tôi có một ý tưởng tốt hơn bây giờ những gì bạn muốn. Tôi không biết liệu nó là cách tốt nhất nhưng bạn có thể thử loại này (trong giao diện):

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

Nếu bạn sử dụng này rất thường xuyên Tôi đề nghị để tạo helper của riêng bạn mà hoạt động như một wrapper cho url_for.

Hoặc nếu bạn chỉ muốn có một tập hợp con của các thông số yêu cầu, thực hiện điều này:

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

(Tôi formated mã theo cách này để có thể đọc tốt hơn)


gốc trả lời:

Tôi không biết nơi bạn muốn thay đổi một tham số (trong bộ điều khiển?), Nhưng nếu bạn có quyền truy cập đối tượng sfRequest hiện tại, điều này sẽ làm điều đó:

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

Bạn có thể lấy các đối tượng yêu cầu bởi một trong hai xác định hành động của bạn theo cách này:

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

hay này

public function executeIndex() { 
    $request = $this->getRequest(); 
} 
+0

Tốt hơn là, tôi muốn thực hiện theo quan điểm, sử dụng url_for ('foo', mảng ('bar' => 'baz')), nhưng để biến hiện tại được duy trì và tôi không ' t phải đặt chúng một cách rõ ràng. – Rytmis

+1

Nếu tôi nhớ lại, tôi tin rằng yêu cầu được hiển thị dưới dạng '$ sf_request' trong chế độ xem. – prodigitalson

1

gợi ý Felix là tốt, tuy nhiên, nó sẽ yêu cầu bạn phải lõi cứng là "tuyến đường hiện tại" ..

Bạn có thể lấy tên của tuyến đường hiện tại bằng cách sử dụng:

sfRouting::getInstance()->getCurrentRouteName() 

và bạn có thể cắm trực tiếp vào url_for, như vậy:

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

Hy vọng rằng sẽ giúp.

+0

Tôi đã rất tập trung vào việc kết hợp thông số mà tôi hoàn toàn quên về trang hiện tại. Điểm tốt. Bạn nên định dạng lại mã của mình. –

+0

Trên thực tế, tôi chỉ cần điều này ở một nơi ngay bây giờ, vì vậy mã hóa cứng tên tuyến đường không phải là vấn đề. Tôi đã đưa ra giải pháp cơ bản giống nhau, mặc dù tôi không biết về trình giữ tham số. Cảm ơn cả hai bạn vì những đề xuất tuyệt vời của bạn. :) – Rytmis

2

Đối với symfony 1.4 tôi đã sử dụng:

$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); 
0

Với khái niệm tương tự hơn Erq, và nhờ vào mã của mình, tôi đã thực hiện tương tự với một số thay đổi nhỏ, kể từ URL của tôi cần phải chuyển đổi một số ký tự.Mặc dù chung của nó và nên làm việc với hầu hết các biểu mẫu, để lưu các tham số mà người dùng đã chọn để tìm kiếm.

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; 
} 

Trong executeNew, dễ dàng như:

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(); 
} 
} 
-1

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