ฉันกำลังพัฒนาเว็บไซต์โดยใช้กรอบงาน zend
ฉันมีแบบฟอร์มการค้นหาพร้อมวิธีรับ เมื่อผู้ใช้คลิกปุ่มส่ง สตริงข้อความค้นหาจะปรากฏใน url หลัง ? เครื่องหมาย. แต่ฉันต้องการให้มันเป็น zend เหมือน url
เป็นไปได้ไหม?
ฉันกำลังพัฒนาเว็บไซต์โดยใช้กรอบงาน zend
ฉันมีแบบฟอร์มการค้นหาพร้อมวิธีรับ เมื่อผู้ใช้คลิกปุ่มส่ง สตริงข้อความค้นหาจะปรากฏใน url หลัง ? เครื่องหมาย. แต่ฉันต้องการให้มันเป็น zend เหมือน url
เป็นไปได้ไหม?
เช่นเดียวกับแนวทาง JS คุณสามารถเปลี่ยนเส้นทางกลับไปยัง URL ที่คุณต้องการได้ เช่น. ปล่อยให้แบบฟอร์มส่งผ่าน GET จากนั้นเปลี่ยนเส้นทางไปยังรูปแบบการกำหนดเส้นทาง ZF
อย่างไรก็ตาม นี่เป็นการกระทำที่มากเกินไป เว้นแต่คุณจะมีเหตุผลที่ดีจริงๆ ที่ต้องการสร้าง URL ที่เรียบร้อยสำหรับคำค้นหาของคุณ โดยทั่วไปแล้ว แบบฟอร์มการค้นหาควรส่งข้อความค้นหา GET ที่สามารถบุ๊กมาร์กไว้ได้ และไม่มีอะไรผิดปกติกับ ?param=val style พารามิเตอร์ใน URL :-)
ZF URL ค่อนข้างแปลกเล็กน้อยเนื่องจากบังคับให้พารามิเตอร์ URL เป็นส่วนหนึ่งของ URL หลัก เช่น. domain.com/controller/action/param/val/param2/val แทนที่จะเป็น domain.com/controller/action?param=val¶m2=val
นี่ไม่ใช่สิ่งที่คุณต้องการเสมอไป แต่ดูเหมือนว่าจะเป็นวิธีที่เฟรมเวิร์กดำเนินไปพร้อมกับพารามิเตอร์ URL
ไม่มีวิธีแก้ปัญหาที่ชัดเจน แบบฟอร์มที่สร้างโดย zf จะเป็นแบบฟอร์ม html มาตรฐาน เมื่อส่งจากเบราว์เซอร์โดยใช้ GET จะส่งผลให้มีการร้องขอดังนี้
/action/specified/in/form?var1=val1&var2=var2
วิธีแก้ปัญหาเดียวที่จะได้รับ "zendlike url" (อันที่มี / แทน ? หรือ &) ก็คือแฮ็กการส่งแบบฟอร์มโดยใช้จาวาสคริปต์ ตัวอย่างเช่น คุณสามารถฟัง onSubmit ยกเลิกการส่ง และเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL ที่แปลแทน โดยส่วนตัวแล้วฉันไม่เชื่อว่าโซลูชันนี้คุ้มค่ากับความซับซ้อนที่เพิ่มเข้ามา แต่ควรทำงานได้ตามที่คุณต้องการ
หลังจากโกรธแค้นกับสิ่งนี้มาเป็นเวลาครึ่งวัน และพยายามอย่างเต็มที่เพื่อหาวิธีที่ถูกต้องในการทำเช่นนี้ ฉันก็ยอมแพ้และทำสิ่งต่อไปนี้ ฉันยังไม่อยากจะเชื่อเลยว่าไม่มีวิธีที่ดีกว่า
กรณีการใช้งานที่จำเป็นต้องมีนี้คือรายการบันทึกง่ายๆ โดยมีแบบฟอร์มด้านบนสำหรับเพิ่มตัวกรองบางตัว (ผ่าน GET) อาจจะเป็นการเรียงลำดับคอลัมน์บางส่วน และ Zend_Paginate ถูกส่งเข้ามาเพื่อการวัดผลที่ดี ฉันพบปัญหาในการใช้ตัวช่วยมุมมอง Url ในการแบ่งหน้าของฉันบางส่วน แต่ฉันสงสัยว่าแม้เพียงการเรียงลำดับและรูปแบบตัวกรอง Zend_View_Helper_Url จะยังคงล้มลง
แต่ฉันพูดนอกเรื่อง โซลูชันของฉันคือการเพิ่มวิธีการให้กับคลาสคอนโทรลเลอร์พื้นฐานของฉันที่รวมพารามิเตอร์สตริงการสืบค้นดิบใด ๆ เข้ากับ slashy-params สไตล์ zend ที่มีอยู่และการเปลี่ยนเส้นทาง (แต่หากจำเป็นเท่านั้น) สามารถเรียกใช้เมธอดนี้ได้ในการดำเนินการใดๆ ที่ไม่จำเป็นต้องจัดการกับ POST
หวังว่าบางคนจะพบว่ามีประโยชน์นี้ หรือดีกว่านั้น หาวิธีที่ดีกว่า:
/**
* Translate standard URL parameters (?foo=bar&baz=bork) to zend-style
* param (foo/bar/baz/bork). Query-string style
* values override existing route-params.
*/
public function mergeQueryString(){
if ($this->getRequest()->isPost()){
throw new Exception("mergeQueryString only works on GET requests.");
}
$q = $this->getRequest()->getQuery();
$p = $this->getRequest()->getParams();
if (empty($q)) {
//there's nothing to do.
return;
}
$action = $p['action'];
$controller = $p['controller'];
$module = $p['module'];
unset($p['action'],$p['controller'],$p['module']);
$params = array_merge($p,$q);
$this->_helper->getHelper('Redirector')
->setCode(301)
->gotoSimple(
$action,
$controller,
$module,
$params);
}