أحاول تحديث قيمة أثناء مرحلة التحقق من نموذج العقدة ، أي إذا تم تشغيل خطأ التحقق المخصص ، فقط قم بإفراغ أحد الحقول.
خلال الثلاثين ساعة الماضية أحاول فهم معنى drupal api ، لكنني أستسلم. لا يبدو لي أن أحصل على فكرة ما تعنيه القيم المختلفة.
الوظيفة هي: form_set_value ($ element و $ value و & $ form_state)
الآن أفهم أن القيمة الأخيرة هي ببساطة $ form_state ، التي أواجهها من خلال وظيفة التحقق. ولكن ماذا عن عنصر $ وقيمة $؟
كنت أحاول كثيرًا ويبدو أن القيمة المطلوبة موجودة في شكل $ ['field_name'] ['und'] [0] ['value'] ['# value'] وهناك فقط.
ولكن عندما أحاول form_set_value ($ form ['field_name'] ['und'] [0] ['value'] ['# value']، 'foo'، $ form_state)
Recoverable fatal error: Argument 2 passed to drupal_array_set_nested_value() must be an array, string given, called in /includes/form.inc on line 2436 and defined in drupal_array_set_nested_value()
وعندما أحاول:
$newvalue = $form['field_name']['und'][0]['value'];
$newvalue['#value']='foo';
form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state);
فإنه يثير:
Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen()
شكرا على اي مساعدة!
[تعديل]
وظيفتي الكاملة هي:
function hook_node_validate($node,$form,&$form_state) {
if(fancy_stuff){
form_set_value();
form_set_error();
}
}
[EDIT2]
//calls when node is being created
function eventcheck_node_validate($node,$form,&$form_state) {
//checks if the node type is applicable
if($node -> type=='article') {
//checks if field 'field_event_choose' AND either 'field_event_title'
//or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()
if ((array_key_exists('endpoints',$node -> field_event_choose['und'][0])) &&
(($node -> field_event_title['und'][0]['value']<>'') || (isset($node ->
field_event['und'][0]['value'])))) {
//fire away
$form_set_value(???);
$form_set_error('event_checker_group',t('sorry blabla'));
}
}
}
أتمنى أن يساعد ذلك.
بعد الكثير من التصحيح ، تمكنت أخيرًا من جعل هذا العمل. الحيلة تكمن داخل $form['complete form']
. ولكن أولاً ، كيف يعمل form_set_value()
وماذا يعمل؟
form_set_value()
كما تقترح الوثائق:
إذا كنت تريد تحديث قيمة
$form['elem1']['elem2']
، التي يجب تخزينها في$form_state['values']['elem1']['elem2']
، يجب عليك تعيين$element['#parents'] = array('elem1','elem2')
.
الآن ماذا يعني ذلك؟ في حالتي ، كان لدي حقل نص يسمى "field_event_title" ، وهو الاسم الذي أعطيته عند الإنشاء. في $form
، تحتوي جميع الحقول على مصفوفة فرعية في $form['field_name']
، وهي في حالتي $form['field_event_title']
. هذا هو المكان الذي يتم فيه تخزين القيمة المقدمة أيضًا. نظرًا لأنه حقل نص ، Drupal يحافظ على كل من اللغة والدلتا [سؤال للمحررين: هل هذا صحيح؟] من بيانات الإدخال. لذا في الواقع ، لا يتم تخزين القيمة في $form['field_name']['value']
، ولكن في $form['field_name']['und'][0]['value']
(['und']=language; [0]=delta
). لاحظ أن "und" هو مفتاح Drupal للغة الافتراضية للموقع ؛ إذا كان باللغة الألمانية ، عندئذٍ ستكون "de" ؛ ومع ذلك ، في معظم الحالات يجب أن تكون "und".
لتغيير القيمة فعليًا باستخدام form_set_value()
، يجب على المرء استدعاء الوظيفة عن طريق الكتابة:
form_set_value($form['field_name'], array('und' => array(0 => array('value' => 'foo'))), $form_state);
حتى الآن ، كان هذا ما اقترحه كريستر أندرسون ، لكن هذا لم ينجح في حالتي ، حيث أردت مسح الحقول بمجرد استدعاء خطأ تحقق مخصص. يمكن للمرء أن يشك في أن النموذج يعيد ملء نفسه باستخدام القيم داخل $form_state['values']
(وهو في الواقع المكان الذي يتم فيه تخزين القيم ، والمكان الفعلي الذي يتم تحديثه عند استخدام form_set_value()
والمكان الذي يولد $form
لاحقًا) ، لكن الأمر ليس كذلك: يستخدم القيم الموجودة داخل $form_state['complete form']
، وهي عبارة عن "نسخة" من $form
(لاحظ أنه مكتوب "النموذج الكامل" '، بمسافة ، وليس بشرطة سفلية).
استخدام $form_state['complete form']['field_name']['und'][0]['value']['#value'] = 'foo';
هو ما يحدِّث القيم التي تعيد ملء النموذج بالفعل على خطأ التحقق من الصحة. (ملاحظة: يمكنك ، كما أفعل في حالة الاستخدام الخاصة بي ، تعيينه على =NULL
لتفريغ الحقل ببساطة.)
أين الفرق بين $form['field_name']
(على سبيل المثال ، التحديث من خلال form_set_value()
) و $form['complete form']
؟ حسنًا ، يقوم الأول بتحديث القيمة الفعلية ، والتي يتم تخزينها بعد ذلك داخل قاعدة البيانات ؛ يتم استخدام هذا الأخير لإعادة ملء نموذج عندما فشل التحقق من الصحة.
تمكنت من جعلها تعمل من خلال القيام بذلك:
// hook_form_alter, check so it's the correct form and attach a validate function
function sample_form_alter(&$form,&$form_state,$form_id) {
if ($form_id == "sample_dummy_node_form") {
$form['#submit']['#validate'] = 'sample_dummy_node_form_validate';
}
}
// validate function, wich just sets the `title` field to `tjoohooo` using `form_set_value`
function sample_dummy_node_form_validate($form, &$form_state) {
$form['title']['#parents'] = array('title');
form_set_value($form['title'],t('tjoohooo'), $form_state);
}
إذا لم تكن قد فعلت ذلك بالفعل ، فيجب أن تلقي نظرة على الوثائق form_set_value
* تحرير *
في مثالك ، أعتقد أن الرمز في أسلوب التحقق الخاص بك يجب أن يكون:
function hook_node_validate($node,$form,&$form_state) {
if (fancy_stuff){
$form['field_name']['#parents'] = array('field_name');
form_set_value($form['field_name'],t('foo'),$form_state);
}
}
من وثائق المعلمات:
عنصر $: عنصر النموذج الذي يجب تحديث قيمته ؛ في معظم الحالات ، يمكنك فقط تمرير العنصر من مصفوفة النموذج $ ، على الرغم من أن المكون الوحيد المستخدم بالفعل هو "#parents". إذا قمت ببناء نفسك ، قم بتعيين $ element ['# الآباء'] ليكون مصفوفة تعطي المسار من خلال مفاتيح مصفوفة النموذج إلى العنصر الذي تريد تحديث قيمته. على سبيل المثال ، إذا كنت ترغب في تحديث قيمة $ form ['elem1'] ['elem2'] ، والتي يجب تخزينها في $ form_state ['القيم'] ['elem1'] ['elem2'] ، يمكنك تعيين $ element ['# الآباء'] = المصفوفة ('elem1'، 'elem2').