it-swarm.asia

أفضل ممارسة لمفتاح اللغة لـ "und" في hook_form_alter

أقوم بتعديل في نموذج في الوحدة النمطية المخصصة الخاصة بي. يبدو الرمز:

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 أمر سيء. ما هي الطريقة المناسبة لتعديل حقول النموذج بشكل صحيح في هذه الحالة؟

30
Shafiul

لسوء الحظ ، فإن إجابتك الذاتية ليست عالمية جدًا. لغة الحقل ولغة العقدة ليستا نفس الأشياء.
لغة الحقل مطلوبة فقط إذا كنت تستخدم Field Translation API (على سبيل المثال ترجمة الكيان ). عند البدء في استخدامه ، يتم تحويل بعض الحقول إلى ترجمة.

تحتوي الحقول القابلة للترجمة على رمز لغة ، وهو أمر منطقي حقًا. ولكن إذا كان الحقل غير قابل للترجمة ، فسيكون رمز اللغة دائمًا (ولجميع أنواع المحتوى والكيانات وما إلى ذلك) - LANGUAGE_NONE (الأفضل استخدام الثابت LANGUAGE_NONE وليس السلسلة 'und').
لذا مع الحل الخاص بك ، يمكنك الحصول على موقف عندما تكون العقدة روسية ، ولكن حقل العقدة يستخدم LANGUAGE_NONE.
لحسن الحظ ، الحقول مرفقة بالنموذج مع '#language' المفتاح الذي يحتوي دائمًا على رمز اللغة الصحيح.

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

إذا لم يكن لديك حق الوصول إلى النموذج المرفق ، فيمكن أن تكون وظائف واجهة برمجة تطبيقات لغة الحقل مفيدة.

40
kalabro

إذا كنت تعرف نوع وحزمة الكيان ، فاستخدم شيئًا مثل الرمز التالي ، والذي يستدعي 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 () .

10
Attiks

إن صفقة 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);
  }
}

هذا يجب أن يعمل طوال الوقت.

4
googletorp

رد: إجابة كالابرو

لم يعمل الكود الخاص بي - الكود الخاص بي مختلف قليلاً

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

[$ lang] [0] قامت بإرجاع "u" ولكن القيمة الكاملة لـ [$ lang] هي "und" ولم أكن أحتاج إلى ['value'] أيضًا ، لأن $ form ['FIELDNAME'] ['# language' ] لم يكن مصفوفة ، كانت سلسلة.

0
decibel.places

(الإجابة على سؤالي الخاص في حال كان ذلك يساعد شخصًا. كانت الإجابة مفيدة بالنسبة لي.)

يمكنني كتابة السطر التالي للحصول على اللغة:

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