Score:0

How would one make a variable in a module's JS editable via admin menu?

ธง cn

Say I have a library that is attached to a page that brings along with it some JavaScript. For this example, let's say the JavaScript has a variable which is the path to an image that the JS displays. This would look something like:

variable.setAttribute('src', drupalSettings.path.baseUrl + pathToPicture)

Now let's say I want to have pathToPicture configurable via Admin Menu so that one may add their own path to their own picture, instead of using the one that is defaulted to.

How might one go about accomplishing this task? I know the basics of setting up a form and adding it to the admin menu, but I don't know enough to complete something like this on my own. If there is existing documentation on this sort of procedure, I'd appreciate being directed towards it. Otherwise any ideas are welcome. Thanks!

leymannx avatar
ne flag
คุณสามารถส่งตัวแปรจาก PHP ไปยัง JS (drupalSettings) จาก hook ของการประมวลผลล่วงหน้าได้ ดังนั้นให้เก็บรูปภาพของคุณไว้ที่ใดที่หนึ่ง อาจจะเป็นโปรไฟล์ผู้ใช้ จากนั้นประมวลผลล่วงหน้าในอาร์เรย์การเรนเดอร์ที่คุณต้องการ JS รับผู้ใช้ปัจจุบัน รับรูปภาพ รับ URL รูปภาพ และส่งต่อไปยัง drupalSettings
No Sssweat avatar
ua flag
นี่คือแนวคิด: โปรดระบุรหัสของแบบฟอร์มและรหัส hook ของกระบวนการหากคุณมีอยู่แล้ว
apaderno avatar
us flag
เนื่องจากคำถามระบุว่า *เพื่อให้ใครเพิ่มเส้นทางของตนเองไปยังส่วนรูปภาพของตนเอง* คุณจะบรรลุได้อย่างไร และการใช้โค้ด JavaScript จะทำให้เป็นไปได้อย่างไร ด้วยรหัสที่แสดงในคำตอบ คุณจะได้รับค่าที่ส่งผ่านจาก PHP ไปยัง JavaScript แต่ผู้ใช้จะเปลี่ยนค่านั้นได้อย่างไรโดยไม่ต้องเข้าถึงแบบฟอร์มการตั้งค่า หากเข้าถึงแบบฟอร์มได้ ก็เพียงแค่ส่งแบบฟอร์ม
apaderno avatar
us flag
ถ้าฉันต้องการให้ผู้ใช้ตั้งค่าที่จะใช้จากโมดูลของฉัน ฉันจะสร้างแบบฟอร์มที่พวกเขาสามารถเข้าถึงได้เพื่อตั้งค่านั้น รหัสของฉันจะใช้ค่านั้นเมื่อจำเป็น ฉันไม่จำเป็นต้องเขียนโค้ด JavaScript เพื่อบรรลุสิ่งนั้น
Score:2
ธง de

ลองนึกภาพโมดูลที่เรียกว่า Configurable Picture คุณต้องการให้กำหนดเส้นทางไปยังรูปภาพผ่าน UI ของผู้ดูแลระบบ เส้นทางคือสตริง ดังนั้นสิ่งแรกที่ต้องทำคือกำหนดค่าสำหรับเส้นทาง ในกรณีนี้วัตถุการกำหนดค่าจะเป็น configuration_picture.settings เส้นทาง_to_ภาพ.

configuration_picture/config/schema/configurable_picture.schema.yml:

configuration_picture.settings:
  ประเภท: config_object
  ป้ายกำกับ: 'การตั้งค่ารูปภาพที่กำหนดค่าได้'
  การทำแผนที่:
    เส้นทาง_to_ภาพ:
      ประเภท: สตริง
      ป้ายกำกับ: 'เส้นทางสู่รูปภาพ'

ขั้นตอนต่อไปคือการสร้างฟอร์มการกำหนดค่าที่อนุญาตให้คุณแก้ไขรายการการกำหนดค่าที่กำหนดไว้ในสคีมาด้านบน นี่คือเอกสารเกี่ยวกับการสร้างฟอร์มการกำหนดค่า: https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms

ด้วยขั้นตอนข้างต้น คุณจะสามารถบันทึกเส้นทางไปยังรูปภาพในหน้าการกำหนดค่าที่คุณสร้างขึ้น

มีสองขั้นตอนที่จำเป็นในการจัดเตรียมการตั้งค่านั้นให้กับไฟล์ JavaScript ประการแรกคือการเพิ่มการพึ่งพา การตั้งค่าหลัก / drupal ไปยังไลบรารี JS ของคุณ

configuration_picture/configurable_picture.libraries.yml:

picture_form:
  จส:
    เส้นทาง/to/file.js: {}
  การพึ่งพา:
    - การตั้งค่าหลัก / drupal

จากนั้น คุณแนบไลบรารีและการตั้งค่าไปยังแบบฟอร์ม:

$form['#attached']['library'][] = 'configurable_picture/picture_form';
// คีย์การตั้งค่าคอนฟิกจะกลายเป็นเนมสเปซภายใน 
// วัตถุ drupalSettings ในไฟล์ JS
$form['#attached']['drupalSettings']['configurablePicture'] = [
  // กำหนดเส้นทางตามค่าที่บันทึกไว้ในการกำหนดค่า:
  'pathToPicture' => \Drupal::config('configurable_picture')->get('path_to_picture'),
];

จากนั้น path/to/file.js สามารถเข้าถึงวัตถุการตั้งค่าดังนี้:

(ฟังก์ชัน ($, Drupal, drupalSettings) {

  ฟังก์ชัน getPathToPicture() {
    กลับ drupalSettings.configurablePicture.pathToPicture;
  }

  // หรือจากวัตถุการตั้งค่าใน Drupal.behaviors:
  Drupal.behaviors.configurablePicture = {
    แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
      console.log(settings.configurablePicture.pathToPicture);
    }
  };
}(jQuery, Drupal, drupalSettings));
Joseph avatar
cn flag
ขอบคุณสำหรับสิ่งนี้. ฉันเคยใช้ drupalSettings มาก่อนเพื่อสื่อสารแบบนี้ ดังนั้นฉันคิดว่าส่วนนั้นน่าจะง่าย ฉันอัปเดตโพสต์ต้นฉบับของฉันเพื่อแสดงโครงสร้างไฟล์ปัจจุบันของฉัน (ลบไฟล์ JS) เพราะแม้ว่าฉันเชื่อว่าฉันทำตามคำแนะนำอย่างถูกต้อง แต่ไม่มีรูปแบบใดปรากฏในหน้าการกำหนดค่า คุณเห็นอะไรผิดปกติอย่างชัดเจนกับรหัสของฉันหรือไม่?
Jaypan avatar
de flag
ฉันได้ตอบคำถามเดิมของคุณเกี่ยวกับวิธีหมุนตัวแปรการกำหนดค่าเป็น JS ปัญหาเกี่ยวกับแบบฟอร์มการกำหนดค่าของคุณไม่ทำงานเป็นหัวข้อใหม่ และคุณควรเปิดหัวข้อใหม่สำหรับเรื่องนั้น Drupal Answers เป็นฟอรัมแบบหนึ่งคำถามหนึ่งคำตอบ คำถามใหม่จะได้รับชุดข้อความใหม่
Jaypan avatar
de flag
นอกจากนี้ คุณควรโพสต์โค้ดจริงของคุณ แทนที่จะแทนที่ทุกอย่างด้วย mymodule พิมพ์ผิดง่ายเกินไปเมื่อคุณไม่แสดงรหัสจริง
Joseph avatar
cn flag
โอเค ขออภัย ฉันยังใหม่กับเรื่องนี้มาก และกังวลเกี่ยวกับการถามคำถามหลายข้อในฟอรัม โดยเฉพาะอย่างยิ่งหากพวกเขามีวิธีง่ายๆ
Jaypan avatar
de flag
เป็นเรื่องดี - เราทุกคนต่างผ่านสิ่งเดียวกันกับที่คุณทำเมื่อเรามาที่นี่! ยินดีต้อนรับสู่ Drupal Answers และเราอยู่ที่นี่เพื่อตอบคำถามเกี่ยวกับ Drupal ดังนั้นอย่าลังเลที่จะเปิดหัวข้อเพื่อถามคำถาม
Joseph avatar
cn flag
สวัสดี @Jaypan ฉันมีคำถามเกี่ยวกับคำตอบของคุณ .pathToFile คืออะไร ฉันไม่พบเอกสารประกอบหรือใช้งานไม่ได้ ฉันได้รับข้อผิดพลาดนี้ในคอนโซล: ไม่สามารถอ่านคุณสมบัติของไม่ได้กำหนด (อ่าน 'pathToFile') ฉันเข้าใจสิ่งที่คุณกำลังทำอยู่หรือเปล่า?
Jaypan avatar
de flag
คุณต้องแทนที่ด้วยเส้นทางจริงไปยังไฟล์ JS ของคุณ ดังนั้น หากคุณมี `file.js` ในโฟลเดอร์ `js` ของโมดูลของคุณ คุณจะต้องใส่ `js/file.js: {}`
Joseph avatar
cn flag
ใช่ ขอโทษ ฉันเข้าใจ ฉันหมายถึงเมื่อคุณใช้ที่นี่ ตัวอย่างเช่น: `console.log(settings.configurablePicture.pathToFile);` .pathToFile ควรจะแทนที่ด้วยเส้นทางไปยังไฟล์ JS หรือไม่ มันดูแปลกๆ?
Jaypan avatar
de flag
ถูกต้อง. `settings` ประกอบด้วยการตั้งค่าสำหรับ `context` ปัจจุบัน นี่คือตัวแปรสองตัวที่ส่งผ่านไปยังเมธอด Drupal Behaviors `.attach` ในการโหลดเอกสารครั้งแรก `บริบท` คือเอกสารทั้งหมด และ `การตั้งค่า` คือวัตถุ `drupalSettings` ทั้งหมด แต่พฤติกรรมของ Drupal ก็เรียกได้เช่นกันเมื่อองค์ประกอบใหม่ถูกแทรกลงใน DOM ด้วย Ajax และ `settings` มีการตั้งค่าสำหรับ `context` ใหม่ คุณสามารถอ้างอิงถึง `drupalSettings` ได้ อย่างไรก็ตาม การตั้งค่าดังกล่าวมีทั้งการตั้งค่าจากการโหลดหน้าเว็บเริ่มต้น เช่นเดียวกับการโหลด ajax ทำให้คล่องตัวน้อยลง
Jaypan avatar
de flag
ฉันควรเพิ่ม `settings.configurablePath.pathToFile` คือสิ่งที่ถูกแทนที่ด้วยเส้นทางไฟล์ สมมติว่าเป็นเส้นทางตามที่คุณอธิบายไว้ คุณจะต้องมีรูท Drupal ที่ต่อท้าย: `settings.path.baseUrl + settings.configurablePath.pathToFile`
Joseph avatar
cn flag
ดังนั้นนี่คือสิ่งที่ควรมีลักษณะ? `console.log(drupalSettings.path.baseUrl + settings.pathToSound.js/configurablePicture.js);`? นั่นยังไม่สมเหตุสมผลสำหรับฉัน ทำไมฉันถึงเชื่อมโยงไฟล์ JS เมื่อฉันอยู่ในไฟล์ JS แล้ว
Jaypan avatar
de flag
ไม่ ซึ่งจะถูกแทนที่ด้วยพาธไปยังรูปภาพ ไม่ใช่ไฟล์ JS คุณถูกต้องที่รหัสนี้อยู่ในไฟล์ JS ค่าใดก็ตามที่คุณป้อนลงในแบบฟอร์มในหน้าการกำหนดค่าจะอยู่ใน `ssettings.configurablePath.pathToPicture`
Jaypan avatar
de flag
นอกจากนี้ การเรียกใช้ console.log เป็นเพียงเพื่อให้คุณสามารถดูค่าในคอนโซล JS ของคุณ คุณไม่จำเป็นต้องเรียกใช้โค้ดของคุณ เป็นเครื่องมือแก้ไขข้อบกพร่อง ส่วนเดียวที่เกี่ยวข้องคือ `settings.configurablePath.pathToFile`
Joseph avatar
cn flag
โอเค ฉันเข้าใจแล้วว่าสับสนตรงไหน ฉันคิดว่าฉันต้องแทนที่ส่วน `.pathToFile` ของ `settings.configurablePath.pathToFile` เป็นอย่างอื่น ฉันเห็นสิ่งที่คุณพูดตอนนี้ ถึงกระนั้น การใช้ `settings.configurablePath.pathToFile` ทำให้ฉันเกิดข้อผิดพลาดนี้: `drupal.js?v=9.3.9:16 Uncaught TypeError: Cannot read Properties of undefined (reading 'pathToFile')` เพราะฉันไม่คิดว่าในของคุณ ตัวอย่าง pathToFile เคยส่งผ่านไปยังไฟล์ JS ผ่านไฟล์แนบหรือไม่ นั่นเป็นเหตุผลว่าทำไมมันถึงไม่ทำงาน?
Jaypan avatar
de flag
ขออภัย `pathToFile` พิมพ์ผิด มันควรจะเป็น `pathToPicture` ฉันจะปรับปรุงโพสต์
Joseph avatar
cn flag
ฉันคิดว่า ขอบคุณสำหรับความช่วยเหลือของคุณ ฉันคิดว่าฉันอาจผสมระหว่าง conconfigable_picture และ configurablePicture ในไฟล์แนบของแบบฟอร์มด้วย แต่ฉันไม่แน่ใจ คำถามสุดท้ายเกี่ยวกับรหัสของคุณ ไลบรารีและการตั้งค่าที่คุณแนบกับแบบฟอร์มจะเข้าสู่ buildForm แต่ sendForm จะมีลักษณะอย่างไร pathToPicture ของฉันไม่ได้รับการสื่อสารอย่างถูกต้องระหว่างแบบฟอร์มและไฟล์ JS
Jaypan avatar
de flag
ฉันไม่เข้าใจคำถาม มีการแนบไลบรารี - สิ่งนี้เกี่ยวข้องกับตัวจัดการการส่งหรือไม่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา