การเปลี่ยน URL ของตัวกรองที่เปิดเผย


15

เมื่อฉันใช้ตัวกรองแบบเปิดเผยตัวเลือกตัวกรองจะถูกส่งผ่านเป็นคู่ชื่อ / ค่าใน URL ตัวอย่างเช่น:

members?field_a=valuea&field_b=valueb

ฉันจะตั้งค่าให้ใช้ URL สไตล์ "pathauto" ได้มากขึ้น:

members/valuea/valueb

คำถามที่ยอดเยี่ยม AFAIK ไม่สามารถทำได้ในตอนนี้ยกเว้นด้วยรหัส พบสิ่งนี้ซึ่งดูเหมือนว่าจะแก้ปัญหาได้ แต่ยังไม่ได้ทดสอบ
Countzero

คุณกำลังมีปัญหากับ URL ที่สะอาดอ่านโพสต์นี้drupal.org/getting-started/clean-urls
subhojit777

1
ฉันเปิดใช้งาน url ที่สะอาดแล้วสำหรับหน้าอื่น ๆ มันอยู่ในสัญกรณ์ที่เป็นมิตรกับ seo แต่สำหรับตัวกรองที่เปิดเผยเท่านั้นมันเป็นสตริงข้อความค้นหาเช่นเมื่อฉันไปที่บทความใด ๆ url นั้นเป็นมิตรกับ SEO โปรดแจ้งให้เราทราบหากฉันพลาดบางสิ่ง
Kalpesh Patel

ฉันสามารถเห็นอาจมีบางจุดนี้ แต่ก่อนที่จะไปสู่ปัญหาฉันจริง ๆ ค้นหาหลักฐาน มีความสำคัญมากกว่าอะไร: "URL ที่เป็นมิตรกับ SEO" หรือเนื้อหาที่สอดคล้องกับการค้นหาทั่วไป หากหน้าผลลัพธ์มีชื่อที่รัดกุมฉันสงสัยว่าจะมีค่ามากกว่า URL ของหน้านั้นมาก แน่นอนฉันจะมุ่งเน้นเนื้อหาก่อนไม่ว่าในกรณีใด
Alfred Armstrong

คำตอบ:


9

เพื่อนร่วมงานของฉันสร้างโมดูลที่เรียกว่าข้อมูลเส้นทางในขณะที่กลับมา ความตั้งใจของเขาคือการแก้ปัญหาอย่างนี้ น่าเสียดายที่มันกลับกลายเป็นว่ามันขัดแย้งกับนามแฝงเส้นทางปกติดังนั้นจึงสามารถใช้งานได้บนไซต์เช่น 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


ขอบคุณ มันดูไม่สำคัญเลย ฉันต้องการเพื่อวัตถุประสงค์ SEO เป็นหลักเพราะสไปเดอร์ของเครื่องมือค้นหาจะไม่รวบรวมข้อมูลในแบบฟอร์ม ฉันอาจใช้มุมมองที่สองกับตัวกรองเชิงบริบทและฝังบล็อกตัวกรองที่เปิดเผยของฉัน จากนั้นฉันก็ต้องใช้จาวาสคริปต์เพื่อให้ตัวกรองที่เปิดเผยส่งไปยังมุมมองดั้งเดิมของฉัน
Uwe

อืมถ้าผมทำอย่างนั้นฉันสามารถใช้จาวาสคริปต์ในการปรับเปลี่ยนรูปแบบ URL ที่ได้รับจากหน้า? name1 = value1 & name2 = value2 ไปยังหน้า / ค่า 1 / value2 stackoverflow.com/questions/5815995/... หากปิดการใช้งานจาวาสคริปต์ฉันมีมุมมองดั้งเดิมของฉันเป็นทางเลือก
Uwe

@letharion: ไม่เห็นการสนับสนุนใด ๆ สำหรับ Drupal 7
ปฏิกิริยากับนักพัฒนา

4

มีโมดูลคือพารามิเตอร์ 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

เข้าสู่ http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_surname/0__Doe

ภายใต้จะใช้ hook_url_inbound_alter, hook_url_outbound_alter และ hook_init พร้อมการเปลี่ยนเส้นทางในกรณีที่จำเป็น


แล้ว Drupal 8 ล่ะ
InspiredCoder

1

ตัวกรองแบบเปิดเผยเป็นรูปแบบซึ่งหมายความว่าสถานที่ที่พวกเขาจะเปลี่ยนเส้นทาง (แอตทริบิวต์ "การกระทำ") จะต้องรู้ก่อนที่ผู้ใช้จะเลือกตัวเลือกใด ๆ ดังนั้นเราจึงไม่สามารถเปลี่ยนเส้นทางเขาไปยัง URL ที่น่าสนใจซึ่งมีข้อมูลเกี่ยวกับตัวเลือกของเขา วิธีแก้ปัญหา:

  1. JavaScript ใช้ JavaScript เพื่อแก้ไขแอตทริบิวต์ "การกระทำ" แบบลอยตัวของตัวกรองแบบเปิดเผยตามตัวเลือกที่ผู้ใช้เลือกและตั้งค่า "การกระทำ" เป็น URL ของมุมมองที่เหมาะสมด้วยการกำหนดค่าตัวกรองตามบริบทที่เหมาะสม แต่ฉันสงสัยว่ามันจะเป็น "SEO ที่เป็นมิตร" จากนั้น (โปรดคนที่ถูกต้องฉันถ้าฉันผิด)

  2. ทำการเปลี่ยนเส้นทางสองครั้ง โดยใช้ hook_form_alter หลังจากได้รับแบบฟอร์มให้เปลี่ยนเส้นทางผู้ใช้ไปยัง url ของมุมมองที่เหมาะสมพร้อมกำหนดค่าตัวกรองตามบริบทที่เหมาะสมตามอินพุตของเขา นี่อาจจำเป็นต้องมีการยืนยันผู้ใช้ในบางเบราว์เซอร์ดังนั้นมันอาจจะน่ารำคาญอย่างยิ่ง

ในทั้งสองวิธีข้างต้นคุณจะต้องใช้https://drupal.org/project/views_expostเพื่อเปลี่ยนวิธีของแบบฟอร์มเหล่านั้นเป็น POST ดังนั้นตัวแปรจะไม่ทำให้ผู้ใช้เกิดมลพิษ

บรรทัดล่างคือถ้าคุณต้องมี URL สวยด้วยตัวกรองสัมผัส - คุณอาจทำอะไรผิด เพราะฉันคิดว่ามันเป็นเพียงการกรองข้อมูลและไม่ควรใช้เพื่อกำหนดหน้าใหม่บนเว็บไซต์ หากคุณต้องการ - คุณสามารถสร้างมุมมองที่กำหนดค่าให้เป็นเมนูและ URL ในเมนูนั้นจะเปลี่ยนเส้นทางผู้ใช้ไปยังมุมมองเดียวกันตอนนี้ แต่ด้วยตัวกรองเชิงบริบทที่แตกต่างกัน


1

จากเปอร์สเปคทีฟเชิงโปรแกรมคุณสามารถใช้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 เมนูที่กำหนดเองของคุณและโหลดมุมมองของคุณโดยทางโปรแกรม


-1

คุณสามารถใช้รหัสต่อไปนี้

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

มุมมองไม่ทราบ URL ใหม่พร้อมโซลูชันของคุณ !!
prabeen giri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.