أقوم بتعديل في نموذج في الوحدة النمطية المخصصة الخاصة بي. يبدو الرمز:
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
أمر سيء. ما هي الطريقة المناسبة لتعديل حقول النموذج بشكل صحيح في هذه الحالة؟
لسوء الحظ ، فإن إجابتك الذاتية ليست عالمية جدًا. لغة الحقل ولغة العقدة ليستا نفس الأشياء.
لغة الحقل مطلوبة فقط إذا كنت تستخدم Field Translation API (على سبيل المثال ترجمة الكيان ). عند البدء في استخدامه ، يتم تحويل بعض الحقول إلى ترجمة.
تحتوي الحقول القابلة للترجمة على رمز لغة ، وهو أمر منطقي حقًا. ولكن إذا كان الحقل غير قابل للترجمة ، فسيكون رمز اللغة دائمًا (ولجميع أنواع المحتوى والكيانات وما إلى ذلك) - LANGUAGE_NONE
(الأفضل استخدام الثابت LANGUAGE_NONE
وليس السلسلة 'und'
).
لذا مع الحل الخاص بك ، يمكنك الحصول على موقف عندما تكون العقدة روسية ، ولكن حقل العقدة يستخدم LANGUAGE_NONE
.
لحسن الحظ ، الحقول مرفقة بالنموذج مع '#language'
المفتاح الذي يحتوي دائمًا على رمز اللغة الصحيح.
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;
إذا لم يكن لديك حق الوصول إلى النموذج المرفق ، فيمكن أن تكون وظائف واجهة برمجة تطبيقات لغة الحقل مفيدة.
إذا كنت تعرف نوع وحزمة الكيان ، فاستخدم شيئًا مثل الرمز التالي ، والذي يستدعي 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 () .
إن صفقة 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);
}
}
هذا يجب أن يعمل طوال الوقت.
رد: إجابة كالابرو
لم يعمل الكود الخاص بي - الكود الخاص بي مختلف قليلاً
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;
[$ lang] [0] قامت بإرجاع "u" ولكن القيمة الكاملة لـ [$ lang] هي "und" ولم أكن أحتاج إلى ['value'] أيضًا ، لأن $ form ['FIELDNAME'] ['# language' ] لم يكن مصفوفة ، كانت سلسلة.
(الإجابة على سؤالي الخاص في حال كان ذلك يساعد شخصًا. كانت الإجابة مفيدة بالنسبة لي.)
يمكنني كتابة السطر التالي للحصول على اللغة:
$lang = $form['language']['#value']; // Instead of "und"