URL ของเฟรมเวิร์ก zend และรับวิธีการ

ฉันกำลังพัฒนาเว็บไซต์โดยใช้กรอบงาน zend

ฉันมีแบบฟอร์มการค้นหาพร้อมวิธีรับ เมื่อผู้ใช้คลิกปุ่มส่ง สตริงข้อความค้นหาจะปรากฏใน url หลัง ? เครื่องหมาย. แต่ฉันต้องการให้มันเป็น zend เหมือน url

เป็นไปได้ไหม?


person rahim asgari    schedule 01.10.2010    source แหล่งที่มา


คำตอบ (3)


เช่นเดียวกับแนวทาง 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

person simonrjones    schedule 01.10.2010
comment
+1 แม้ว่าการเปลี่ยนเส้นทางดูเหมือนจะไม่จำเป็น แต่นี่ดูเหมือนจะเป็นหนทางไป ดูคำตอบของฉันด้วยวิธีควบคุมที่ใช้ซ้ำได้เพื่อให้ได้พฤติกรรมนั้น - person timdev; 24.02.2011

ไม่มีวิธีแก้ปัญหาที่ชัดเจน แบบฟอร์มที่สร้างโดย zf จะเป็นแบบฟอร์ม html มาตรฐาน เมื่อส่งจากเบราว์เซอร์โดยใช้ GET จะส่งผลให้มีการร้องขอดังนี้

/action/specified/in/form?var1=val1&var2=var2

วิธีแก้ปัญหาเดียวที่จะได้รับ "zendlike url" (อันที่มี / แทน ? หรือ &) ก็คือแฮ็กการส่งแบบฟอร์มโดยใช้จาวาสคริปต์ ตัวอย่างเช่น คุณสามารถฟัง onSubmit ยกเลิกการส่ง และเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL ที่แปลแทน โดยส่วนตัวแล้วฉันไม่เชื่อว่าโซลูชันนี้คุ้มค่ากับความซับซ้อนที่เพิ่มเข้ามา แต่ควรทำงานได้ตามที่คุณต้องการ

person Fredrik    schedule 01.10.2010

หลังจากโกรธแค้นกับสิ่งนี้มาเป็นเวลาครึ่งวัน และพยายามอย่างเต็มที่เพื่อหาวิธีที่ถูกต้องในการทำเช่นนี้ ฉันก็ยอมแพ้และทำสิ่งต่อไปนี้ ฉันยังไม่อยากจะเชื่อเลยว่าไม่มีวิธีที่ดีกว่า

กรณีการใช้งานที่จำเป็นต้องมีนี้คือรายการบันทึกง่ายๆ โดยมีแบบฟอร์มด้านบนสำหรับเพิ่มตัวกรองบางตัว (ผ่าน 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);

  }
person timdev    schedule 23.02.2011