เมื่อฉันใช้ตัวกรองแบบเปิดเผยตัวเลือกตัวกรองจะถูกส่งผ่านเป็นคู่ชื่อ / ค่าใน URL ตัวอย่างเช่น:
members?field_a=valuea&field_b=valueb
ฉันจะตั้งค่าให้ใช้ URL สไตล์ "pathauto" ได้มากขึ้น:
members/valuea/valueb
เมื่อฉันใช้ตัวกรองแบบเปิดเผยตัวเลือกตัวกรองจะถูกส่งผ่านเป็นคู่ชื่อ / ค่าใน URL ตัวอย่างเช่น:
members?field_a=valuea&field_b=valueb
ฉันจะตั้งค่าให้ใช้ URL สไตล์ "pathauto" ได้มากขึ้น:
members/valuea/valueb
คำตอบ:
เพื่อนร่วมงานของฉันสร้างโมดูลที่เรียกว่าข้อมูลเส้นทางในขณะที่กลับมา ความตั้งใจของเขาคือการแก้ปัญหาอย่างนี้ น่าเสียดายที่มันกลับกลายเป็นว่ามันขัดแย้งกับนามแฝงเส้นทางปกติดังนั้นจึงสามารถใช้งานได้บนไซต์เช่น drupal.org ที่ไม่ได้ใช้นามแฝง แต่จะแบ่งลิงก์ในนามแฝงเส้นทางโดยใช้ไซต์
ปัจจุบันก็เชื่อได้ว่าวิธีเดียวที่ทั่วไปในการแก้ปัญหานี้เป็นทั้งการจัดการ URL ที่ที่ชั้น httpd หรือใช้hook_url_inbound_alterและhook_url_outbound_alter คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ hooks ที่กล่าวถึงในคำถามนี้
อย่างไรก็ตามถ้าฉันจะให้การถ่ายภาพนี้ด้วยตัวเองฉันจะลองใช้วิธีแก้ปัญหาเฉพาะของ Views แทนเนื่องจากปัญหานี้เป็นเรื่องธรรมดามากพอที่จะให้เหตุผลในการมีโมดูลสำหรับสิ่งนี้
ในhook_views_pre_buildเราสามารถนำข้อมูลจาก url เช่น "members / valuea / valueb" ส่งค่าเหล่านี้ไปที่ $ _GET ['q'] ให้มุมมองสร้างเป็นคิวรีที่เห็นอาร์กิวเมนต์ใน "url" อีกครั้งในhook_views_post_build
มีโมดูลคือพารามิเตอร์ Query To URLที่ฉันเพิ่งเปิดตัวซึ่งแก้ไขปัญหาที่คุณกำลังอธิบาย:
โมดูลนี้จัดเตรียมความสามารถในการเขียนพารามิเตอร์การสืบค้น URL ไปยังคอมโพเนนต์ Clean URL บนพา ธ ที่ระบุ
คุณสามารถกำหนดค่าพา ธ ที่ควรมีการเขียนอาร์กิวเมนต์การสืบค้นเป็นองค์ประกอบคลีน URL โดยใช้นิพจน์ทั่วไปอย่างง่ายหรือโดยการใช้เบ็ดโมดูล
ด้วยวิธีนี้คุณสามารถเปลี่ยน URL ตัวกรองที่เปิดเผยของ Views ได้เช่น
http://example-site.com/events?field_category_idurl0 เหมือน =100&field_category_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe
ภายใต้จะใช้ hook_url_inbound_alter, hook_url_outbound_alter และ hook_init พร้อมการเปลี่ยนเส้นทางในกรณีที่จำเป็น
ตัวกรองแบบเปิดเผยเป็นรูปแบบซึ่งหมายความว่าสถานที่ที่พวกเขาจะเปลี่ยนเส้นทาง (แอตทริบิวต์ "การกระทำ") จะต้องรู้ก่อนที่ผู้ใช้จะเลือกตัวเลือกใด ๆ ดังนั้นเราจึงไม่สามารถเปลี่ยนเส้นทางเขาไปยัง URL ที่น่าสนใจซึ่งมีข้อมูลเกี่ยวกับตัวเลือกของเขา วิธีแก้ปัญหา:
JavaScript ใช้ JavaScript เพื่อแก้ไขแอตทริบิวต์ "การกระทำ" แบบลอยตัวของตัวกรองแบบเปิดเผยตามตัวเลือกที่ผู้ใช้เลือกและตั้งค่า "การกระทำ" เป็น URL ของมุมมองที่เหมาะสมด้วยการกำหนดค่าตัวกรองตามบริบทที่เหมาะสม แต่ฉันสงสัยว่ามันจะเป็น "SEO ที่เป็นมิตร" จากนั้น (โปรดคนที่ถูกต้องฉันถ้าฉันผิด)
ทำการเปลี่ยนเส้นทางสองครั้ง โดยใช้ hook_form_alter หลังจากได้รับแบบฟอร์มให้เปลี่ยนเส้นทางผู้ใช้ไปยัง url ของมุมมองที่เหมาะสมพร้อมกำหนดค่าตัวกรองตามบริบทที่เหมาะสมตามอินพุตของเขา นี่อาจจำเป็นต้องมีการยืนยันผู้ใช้ในบางเบราว์เซอร์ดังนั้นมันอาจจะน่ารำคาญอย่างยิ่ง
ในทั้งสองวิธีข้างต้นคุณจะต้องใช้https://drupal.org/project/views_expostเพื่อเปลี่ยนวิธีของแบบฟอร์มเหล่านั้นเป็น POST ดังนั้นตัวแปรจะไม่ทำให้ผู้ใช้เกิดมลพิษ
บรรทัดล่างคือถ้าคุณต้องมี URL สวยด้วยตัวกรองสัมผัส - คุณอาจทำอะไรผิด เพราะฉันคิดว่ามันเป็นเพียงการกรองข้อมูลและไม่ควรใช้เพื่อกำหนดหน้าใหม่บนเว็บไซต์ หากคุณต้องการ - คุณสามารถสร้างมุมมองที่กำหนดค่าให้เป็นเมนูและ URL ในเมนูนั้นจะเปลี่ยนเส้นทางผู้ใช้ไปยังมุมมองเดียวกันตอนนี้ แต่ด้วยตัวกรองเชิงบริบทที่แตกต่างกัน
จากเปอร์สเปคทีฟเชิงโปรแกรมคุณสามารถใช้hook_url_inbound_alter ()และhook_url_outbound_alter () hooks ได้ตลอดเวลา
คุณสามารถให้ลองไปแบบสอบถามพารามิเตอร์เพื่อ URLโมดูลหรือถ้าคุณกำลังใช้API การค้นหาและแง่มุมที่คุณอาจจะใช้Facet API สวยเส้นทาง
คุณยังสามารถแปลงมุมมองของคุณเพื่อใช้อาร์กิวเมนต์ในพา ธ ของคุณและใช้โมดูลRedirect
นอกเหนือจากข้างต้นไม่มีวิธีที่ง่ายในการบรรลุเป้าหมายดังกล่าวเนื่องจากยังมีฟีเจอร์ที่ค้างอยู่สำหรับ Drupal 8; ดูอนุญาตให้สตริงแบบสอบถามในนามแฝง URL
เมื่อคุณใช้แผงควบคุมที่ใช้มุมมองและในตัวอย่างตัวกรองที่เปิดเผยที่ดีขึ้นคุณสามารถทำแฮ็กบางอย่างเช่น (URL ตัวอย่าง: / panel_url? category = 123):
/**
* Implements hook_url_inbound_alter().
*/
function foo_url_outbound_alter(&$path, &$options, $original_path) {
if (arg(0) == 'panel_url') {
// Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
$path_info = parse_url($path);
switch (@$path_info['path']) {
case 'panel_url/term_name':
case 'panel_url/term_name2':
$path = 'panel_url/all'; // Convert loopy urls into base url
}
if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
$term_name = strtolower(taxonomy_term_load((int)$tid)->name);
$path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
}
}
}
สำหรับข้อมูลเพิ่มเติมโปรดดูที่ผ่านอาร์กิวเมนต์จาก URL ใน 'แผงดูบานหน้าต่างหรือบล็อก
สุดท้ายคุณสามารถใช้hook_menu ()เพื่อกำหนด callback เมนูที่กำหนดเองของคุณและโหลดมุมมองของคุณโดยทางโปรแกรม
คุณสามารถใช้รหัสต่อไปนี้
function hook_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "abcd") {
$form['#submit'] = array('custom_search_redirect');
}
}
function custom_search_redirect($form, &$form_state) {
$form_state['redirect'] = "members/valuea/valueb;
}