วิธีปฏิบัติที่ดีที่สุดสำหรับคีย์ภาษาสำหรับ“ und” ใน hook_form_alter


30

ฉันกำลังแก้ไขในฟอร์มในโมดูลที่กำหนดเองของฉัน รหัสดูเหมือนว่า:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

อย่างไรก็ตามฉันคิดว่าการเข้ารหัสยากundนั้นไม่ดี สิ่งที่ควรเป็นวิธีที่เหมาะสมในการปรับเปลี่ยนเขตข้อมูลฟอร์มอย่างถูกต้องในกรณีนี้


ความคิดเห็นนี้อาจไม่เกี่ยวข้องเนื่องจากถูกถามมานานแล้ว วิธีหนึ่งง่ายๆที่ฉันใช้โดยใช้foreachลูป หากเป็นเพียง LANGUAGE_NONE นั่นคือการเรียกใช้ครั้งเดียว ในความรู้สึก form_alter มันควรเปลี่ยนแปลงทางเทคนิคในสิ่งที่ภาษามี
AyeshK

คำตอบ:


40

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

เขต Trans Trans จะมีรหัสภาษาซึ่งใช้งานได้จริง แต่ถ้าฟิลด์ไม่สามารถแปลได้รหัสภาษาจะเป็นเสมอ (และสำหรับเนื้อหาทุกประเภทเอนทิตี ฯลฯ ) - LANGUAGE_NONE(ควรใช้ค่าคงที่LANGUAGE_NONEไม่ใช่สตริง'und')
ดังนั้นด้วยวิธีการแก้ปัญหาของคุณคุณจะได้รับสถานการณ์เมื่อโหนดคือรัสเซีย LANGUAGE_NONEแต่ข้อมูลของการใช้โหนด
อย่างมีความสุขเขตข้อมูลที่แนบมากับแบบฟอร์มด้วย'#language'คีย์ซึ่งมักจะมีรหัสภาษาที่ถูกต้อง

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

หากคุณไม่มีสิทธิ์เข้าถึงแบบฟอร์มที่แนบมาฟังก์ชัน Field Language APIจะมีประโยชน์


4
นี่เป็นคำตอบเดียวที่ถูกต้องในชุดข้อความนี้
Bojan Zivanovic

วิธีนี้ยังสามารถใช้ในขณะที่เรียกคืนเส้นทางภาพของโหนด / เนื้อหาชนิด ขอบคุณ
Jayaram R

10

ถ้าคุณรู้ว่าประเภทกิจการและการใช้กำบางอย่างเช่นรหัสต่อไปนี้ซึ่งเรียกfield_language ()

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

มันจะเข้าใจภาษาที่ถูกต้องและทำงานได้ในเว็บไซต์หลายภาษา

ดูที่field_get_items ()ด้วย


วิธีนี้ถูกต้องตามวิธี API
Nikit

เกิดอะไรขึ้นถ้าโหนดไม่ได้ถูกสร้างขึ้น?
AgA

@ Nikit ฉันไม่แน่ใจเพราะภาษาที่แสดงและภาษาของแบบฟอร์มไม่เหมือนกัน ผู้แต่งเปลี่ยนแปลงรูปแบบบางส่วนและสามารถเป็นรูปแบบสำหรับการสร้างโหนดใหม่หรือสำหรับการเพิ่มการแปลใหม่ของโหนดที่มีอยู่
kalabro

@kalabro - ภาษาที่แสดงและภาษาของฟอร์ม - เหมือนกันกับบริบทปัจจุบัน
Nikit

4

undข้อตกลงทั้งหมดเป็นหนึ่งในสิ่งที่น่ารำคาญกว่าใน Drupal 7 ที่ใช้งานไม่ได้ในทางปฏิบัติเหมือนเมื่อมันถูกออกแบบมา

อย่างไรก็ตามคุณสามารถใช้ภาษาแรกเป็นarray_keysแบบนี้ได้:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

ที่ควรทำงานตลอดเวลา


ขอบคุณสำหรับคำตอบ. ฉันกำลังวางสิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้ในคำตอบอื่น :)
Shafiul

ฉันสามารถใช้ $ langs เพื่อเข้าถึงค่าของเขตข้อมูลเดียวกันใน form_state ได้หรือไม่
AgA

ปลอดภัยหรือไม่ คุณแน่ใจหรือไม่ว่า $ langs [0] เป็นรายการอาร์เรย์ที่ถูกต้องเสมอ
rooby

0

(ตอบคำถามของฉันเองในกรณีที่ช่วยใครซักคนคำตอบนั้นเหมาะกับฉัน)

ฉันสามารถเขียนบรรทัดต่อไปนี้เพื่อรับภาษา:

$lang = $form['language']['#value'];    //  Instead of "und"

5
นี่เป็นสิ่งที่ผิด ดูคำตอบของ kalabro
Bojan Zivanovic

0

Re: คำตอบของ kalabro

รหัสของเขาไม่ทำงานสำหรับฉัน - รหัสของฉันแตกต่างกันเล็กน้อย

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0] ส่งคืน "u" แต่ค่าเต็มของ [$ lang] คือ "und" และฉันไม่ต้องการ ['value'] เช่นกันเนื่องจาก $ form ['FIELDNAME'] ['# language' ] ไม่ใช่อาร์เรย์มันเป็นสตริง


1
อักขระที่ 0 ของ 'und' คือ 'u' คุณอยู่ในเขาวงกตของทางเดินเล็ก ๆ ที่คดเคี้ยวทุกแถว
Chris Burgess
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.