ฉันจะเปลี่ยนพฤติกรรมการโหลด ajax ใน Views ได้อย่างไร


34

ฉันมีมุมมองที่มีตัวกรองที่เปิดเผยบางส่วนในบล็อก มันใช้ AJAX และคุณสมบัติส่งอัตโนมัติเพื่อให้มีการโหลดมุมมองใหม่ทันทีที่มีการเปลี่ยนตัวเลือกตัวกรอง

ในช่วงเวลาสั้น ๆ ระหว่างการเลือกตัวเลือกและมุมมองที่ถูกโหลดใหม่เครื่องสั่น AJAX สีน้ำเงินที่คุ้นเคยจะปรากฏขึ้นที่ด้านล่างของแบบฟอร์ม (ฉันคิดว่าที่ปุ่มส่งซ่อนอยู่ในขณะนี้)

ฉันรู้ว่าฉันสามารถปรับแต่งภาพนี้ได้โดยการแทนที่ CSS สำหรับองค์ประกอบการสั่น แต่ฉันไม่ต้องการใช้เลย

สิ่งที่ฉันทำค่อนข้างดีคือจางหายไปในแบบฟอร์มตัวกรองที่เปิดเผยชั่วคราว (และมุมมองหลักเช่นกัน) โดยใช้ภาพเคลื่อนไหว jQuery จากนั้นพวกเขาจะจางหายไปเมื่อการโทร AJAX เสร็จสมบูรณ์

หากไม่เป็นเช่นนั้นฉันต้องการใช้วิธีการเดียวกับที่โมดูลวิว UI ใช้เมื่ออัปเดตนั่นคือการวางไอคอนนี้ไว้ที่กลางหน้า:

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากว่ามีอยู่แล้วภายในฉันจึงสันนิษฐานว่าจะมีการตั้งค่าบางแห่งเพื่อเปลี่ยนสไตล์ / ตำแหน่งของพฤติกรรมการโหลดนี้ ไม่มีโชคเช่นนั้น

ฉันจะใช้วิธีเหล่านี้ได้อย่างไร

ฉันใช้ Drupal 7 กับ Views 7.x-3.3


Mmmm ... โครงการในตอนเช้า :)
Lester Peabody

ระยะเวลาที่คุณต้องการทำสิ่งนี้ภายในคืออะไร?
Lester Peabody

@ เลสเตอร์ฉันไม่ได้เร่งรีบขนาดใหญ่เพราะมันไม่ใช่ตัวบล็อกการเปิดตัวสำหรับโปรเจ็กต์ใด ๆ ที่ฉันกำลังทำงานอยู่ ... แต่ฉันต้องยอมรับว่ามันกำลังดักฉัน! ฉันไม่ค่อยได้ใช้ Views และฉันไม่มีเวลา (หรือพลังงานตรงไปตรงมา) เพื่อให้ 'มีส่วนร่วม' ในระดับที่ต่ำกว่า แต่เมื่อตอนนี้ฉันเริ่มที่จะพูดถึงความพยายามทางอีคอมเมิร์ซของฉันกับ Drupal Commerce ฉันต้องสามารถทำสิ่งนี้ได้ ถ้าฉันได้รับคำตอบที่ดีในช่วงระยะเวลาการให้รางวัล 7 วันฉันจะอยู่กับพระจันทร์ :)
Clive

สวัสดีฉันเพิ่งเสร็จสิ้นการสร้างโมดูลที่กำหนดเองของฉัน (พร้อมหน้าการตั้งค่าผู้ดูแลระบบ) เพื่อจัดแต่งทรงผมสั่นมุมมอง คุณยังสนใจอยู่ไหม? ฉันสามารถอัปโหลดได้ภายในไม่กี่วันใน drupal.org
ANDiTKO

1
#random -: - ฉันคิดว่า @Clive เป็นเรื่องเกี่ยวกับคำตอบคุณยังถามคำถาม): D
SGhosh

คำตอบ:


42

หากคุณไม่รังเกียจการใช้ jQuery เล็กน้อยคุณสามารถทำสิ่งที่ชอบได้เสมอ:

$('#view-id').ajaxStart(function(){
   $('#view-filters-id').fadeTo(300, 0.5);
});
$('#view-id').ajaxSuccess(function(){
   $('#view-filters-id').fadeTo(300, 1.0);
});

4
ใช่ฉันเห็นด้วยกับวิธีนี้ เพิ่งทราบว่า jQuery ajaxSendและajaxCompleteสามารถใช้กับเงื่อนไขif (settings.url == '/views/ajax') {//... }สำหรับการควบคุมเพิ่มเติม
kalabro

ว้าวฉันเข้าใจสิ่งที่ซับซ้อนเกินกว่าจะเป็นจริงในตอนนี้! ฉันต้องแนบเหตุการณ์ไปยังแบบฟอร์มตัวกรองมากกว่ามุมมอง (มิฉะนั้นajaxSuccessจะถูกไล่ออกเพียงครั้งเดียวฉันเดาว่าเพราะเหตุการณ์ไม่ได้ถูกผูกไว้กับสิ่งที่ถูกแทนที่โดยอัตโนมัติอีกครั้ง<div>) แต่นอกเหนือจากนี้แล้วมันสมบูรณ์แบบ . ขอบคุณมาก
ไคลฟ์

@kalabro ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณหากฉันสามารถแบ่งเงินระหว่างนี้และคำตอบของคุณฉันจะ; แต่ผมต้องไปหนึ่งนี้จริงๆเป็นมันเกือบตัวอย่างการทำงานอย่างเต็มที่ :)
ไคลฟ์

@Clive ฉันมีความสุขมากโซลูชั่นที่พบ :)
kalabro

1
ตั้งแต่ jQuery 1.8 ควรแนบเมธอด. jaxSuccess ()เข้ากับเอกสารเท่านั้น การเปรียบเทียบค่าการตั้งค่าตามที่ kalabro แนะนำข้างต้นเป็นวิธีที่จะไป แหล่งที่มา: api.jquery.com/ajaxSuccess
cjoy

29

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

(function($) {
  Drupal.behaviors.events = {
    attach: function(context, settings) {
      $('#views-exposed-form-events-page', context).ajaxStart(function(){
        $('#views-exposed-form-events-page,div.view-id-events', context).fadeTo(300, 0.5);
      });
      $('#views-exposed-form-events-page', context).ajaxSuccess(function(){
         $('#views-exposed-form-events-page', context).fadeTo(300, 1.0);
         $('div.view-id-events', context).css('opacity', 0.5).fadeTo(300, 1.0);
      });
    }
  };
})(jQuery);

! น่ากลัว ฉันดีใจที่ได้ผลสำหรับคุณ
โอกาส G

สิ่งนี้ทำกับ Drupal 6 ได้อย่างไร
Ryan G

ดีจริงๆ แต่ใช้เพียงครั้งเดียว :)
Kojo

10

สวัสดีฉันได้สร้างโมดูลง่าย ๆ ที่ให้ปริมาณสิ่งที่คุณต้องการจะทำ โมดูลมีหน้าการกำหนดค่าที่คุณสามารถควบคุมรูปแบบของการสั่นและอัพโหลดภาพของคุณเองโดยไม่ต้องแฮ็ค

นี่คือลิงค์แซนด์บ็อกซ์: http://drupal.org/sandbox/ANDiTKO/1556808

หากคุณพบว่ามีประโยชน์โปรดเปิดเผยที่นี่เพื่อให้สามารถอนุมัติเป็นโครงการอย่างเป็นทางการ: http://drupal.org/node/1556114


ที่ดูดีมากขอบคุณ :) ฉันจะได้รับมันติดตั้งและโพสต์ความคิดเห็นในการตรวจสอบเมื่อฉันได้รับโอกาส
ไคลฟ์

6

ฉันเพิ่งทำวิจัย เป็น hardcoded ที่นี่ในตัวสร้างของ อินสแตนซ์ของไม่ได้ถูกจัดเก็บและมีเกี่ยวกับ หมายความว่าเราไม่สามารถเข้าไปในวัตถุและตั้งพารามิเตอร์ของเราเอง
throbberDrupal.views.ajaxView
Drupal.views.ajaxViewDrupal.ajax @todo

Views ใช้งานอย่างไร?

คำตอบสั้น ๆ คือ CSS
ชมผู้ดูแลระบบหน้าเพียงกลอง และเพิ่มสไตล์ให้กับมันของผู้ปกครองthrobber.ajax-progress-throbber

.ajax-progress-throbber {
  background-color: #232323;
  background-image: url("../images/loading-small.gif");
  background-position: center center;
  background-repeat: no-repeat;
  -moz-border-radius: 7px;
  -webkit-border-radius: 7px;
  border-radius: 7px;
  height: 24px;
  opacity: .9;
  padding: 4px;
  width: 24px;
}

ฉันสามารถทำอะไรกับ Drupal.ajax ได้ไหม?

ใช่ฉันพบวิธีการบางอย่างที่คุณสามารถเขียนทับองค์ประกอบ AJAX (ปุ่มลิงก์ ฯลฯ ) ฉันได้แสดงตัวอย่างที่นี่: วิธีการขยายหรือ "เบ็ด" แบบฟอร์ม Drupal AJAX? . แต่ในกรณีนี้มันจะไม่ดี
องค์ประกอบความคืบหน้ากำลังแสดงbeforeSendบนเวทีเพื่อให้คุณสามารถทำอะไรบางอย่างก่อนที่มันจะเกิดขึ้น


ขอบคุณมากสำหรับข้อมูล แต่ฉันไม่แน่ใจว่าฉันจะใช้มันเพื่อแก้ปัญหาของฉันได้อย่างไร คุณกำลังบอกว่ามันเป็นไปไม่ได้ที่จะเพิ่ม / เปลี่ยนค่าเริ่มต้นพฤติกรรมการโหลด ajax ของ Views นอกเหนือจาก CSS อย่างน้อยโดยไม่แฮ็คโมดูล Views?
Clive

ฉันหมายความว่าคุณสามารถใช้ CSS ได้เพราะ Views ก็ใช้เช่นกัน เพียงซ่อน.throbberและเพิ่มสไตล์ให้กับ.ajax-progress-throbber
kalabro

ตกลงดังนั้นทั้งตัวกรองแบบเปิดเผยในบล็อกและมุมมองนั้นจะได้รับคลาส.ajax-progress-throbberเมื่อ AJAX ใดถูกเรียกใช้ ฉันต้องยอมรับว่าฉันไม่ได้สังเกตว่าเกิดขึ้น แต่ฉันจะตรวจสอบ และคุณคิดว่าฉันจะสามารถเรียกใช้ภาพเคลื่อนไหว jQuery ในbeforeSendฟังก์ชั่น (ตามคำตอบของคำถามอื่น ๆ ของคุณ) ได้ไหม? ขอขอบคุณฉันไม่ได้ใช้ Views และฉันไม่ต้องกังวลที่จะขุดลงไปในโค้ดทุกบิตเพื่อค้นหาว่าเกิดอะไรขึ้น! ฉันจะแจ้งให้คุณทราบว่าฉันจะลองทำยังไงต่อไป
Clive

1
สิ่งที่คุณควรคำนึงถึงเพื่อให้ได้เอฟเฟ็กต์จางหายไปตามที่คุณต้องการในองค์ประกอบของฟอร์มคุณยังสามารถใช้ CSS Transitions แทนภาพเคลื่อนไหว jQuery แม้ว่าภาพเคลื่อนไหว jQuery จะใช้ได้กับทุกเบราว์เซอร์และ CSS Transitions ในรุ่นล่าสุดเท่านั้น
Lester Peabody

ขอบคุณ @Lester ฉันควรใช้ jQuery ในขณะนี้ @kalabro น่าเสียดายที่คำแนะนำของคุณใช้งานไม่ได้ ไม่ว่าจะเป็นมุมมองหรือบล็อกตัวกรองแบบเปิดเผยให้.ajax-progress-throbberนำคลาสไปใช้กับพวกเขาในทุกจุดเพื่อให้วิธีการของคุณใช้งานไม่ได้ ขอขอบคุณที่ลอง
Clive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.