it-swarm.asia

كيف أقوم بإنشاء حقل يقبل القيم الفريدة فقط؟

أنا أستخدم وحدة مجموعة الحقل لأن لدي علاقة معقدة بين الحقول ، وحاولت دمجها مع وحدة حقل فريد ، بدون نجاح ، لأن - حقل فريد الوحدة غير مدعومة بواسطة مجموعة الحقل الوحدة.

هل هناك طريقة أبسط للتحقق مما إذا كانت القيمة فريدة ، وعرض خطأ التحقق من الصحة ، إذا كانت القيمة ليست فريدة؟

للأسف ، Drupal 7 ليس لديه هذه الميزة بشكل افتراضي ، لذلك يجب أن تكون هناك طريقة للقيام بذلك.

4
Ek Kosmos

وأخيرًا ، إليك كيفية تكييف نموذج الاقتراحات والتعامل معهtostinni و @ stefgosselin و @ uwe999 إجابات وغيرها:

/**
 * implementation of hook_form_alter().
 */
function CUSTOM_MODULE_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        case 'MY_FORM_ID':
            // add custom validation callback
            $form['#validate'][] = 'CUSTOM_MODULE_MY_FORM_ID_validate';
            break;
            ...
        default:
            break;
    }
}

ثم جميع الوظائف التي نفذتها في:

/**
 * implementation of hook_form_FORM_ID_alter
 */
function CUSTOM_MODULE_MY_FORM_ID_validate(&$form, &$form_state) {

    //retrieve the value for your field
    $value = $form_state['values']['field_MY_FIELD']['und'][0]['value'];

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
            ->fieldCondition('field_MY_FIELD', 'value', $value)
            ->count();
    $count = $query->execute();
    if ($count > 0) {
        form_set_error('field_MY_FIELD', 'Unique field value is already used.');
    }
}

لقد حاولت العمل مع entity_metadata_wrapper لكن لسوء الحظ لم أنجح.

شكرا لإجاباتك.

1
Ek Kosmos

أنت بحاجة إلى تنفيذ ذلك في وحدة مخصصة ، إليك نموذجًا من التعليمات البرمجية لتحقيق ذلك:

function custom_node_validate($node, $form) {
  if ($node->type == 'page') {
    //retrieve the value for your field using Entity API
    $wrapper = entity_metadata_wrapper('node', $node);
    $value = $wrapper->field_collection->field_unique->value();

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
      ->fieldCondition('field_unique', 'value', $value)
      ->count();
    $count = $query->execute();
    if ($count > 1) {
      form_set_error('field_unique', 'Unique field value is already used.');
    }
  }
}

بعض إخلاء المسؤولية:

  • أنا حقا مخزنة بتعقيد حقل واجهة برمجة تطبيقات Field Collection وكان من الصعب جدًا العثور على معلومات جيدة حول كيفية استرداد القيم وإجراء الاستعلامات.
  • أنا أستمتع حقًا بعمل استعلامات SQL (انظر كيفية تغيير إعدادات إعدادات الحقل ) لكنني حاولت استخدام واجهة برمجة التطبيقات (API) فقط بدلاً من إجراء استعلام بسيط على الجدول field_data_field_unique. ومع ذلك ، قد لا يكون مثاليًا بعد ، لذا لا تتردد في التناغم.
  • form_set_error () لا تبرز المجال ، لم أتمكن من العثور على الاسم الصحيح.

فيما يلي الوثائق التي استخدمتها:

تحرير: بعد نصيحة chx ، لتمرير مباشرة field_name إلى fieldCondition().

8
tostinni

لم أبرمج وحدة نمطية بعد ، ولكن يبدو أنه قد يكون من الأسهل كتابة خطاف على form_alter ثم الاستعلام عن حقل "الرقم التسلسلي" الموجود لديك للتأكد من أنه فريد.

4
uwe

في الأساس ، لدى Ek Kosmos الفكرة الأساسية. أسهل طريقة هي إنشاء وحدة صغيرة مخصصة ، وهذه ميزة عزل الميزة التي تريد إنشائها ، وتذكر القاعدة رقم 1 ، حقًا لا تريد اختراق أي شيء في جوهره ، إلا إذا كنت حقًا لا يمكنك تجنبه.

بمجرد أن تقوم بإعداد ملف .info الخاص بك في مجلد وملف .module جاهز للعمل كما هو موضح في العديد من الإرشادات حول هذا الموضوع ، يمكنك الاستفادة من قوة hook_form_alter عن طريق كتابة وظيفة تسمى your-module-name _form_alter في ملف الوحدة النمطية الخاصة بك وتعلم أنه سيتم استدعاء هذه الوظيفة.

ربما ستحتاج إلى عبارة تبديل تعتمد في النموذج) لتغيير إجراءات معينة بناءً على معرف النموذج ،

قد تحتاج إلى محاولة إضافة سمة (#validate) تضيف استدعاء دالة في صفيف النموذج ، كونه اسم دالة لوظيفة التحقق المخصصة الخاصة بك.

شيء مثل:

   // #validate adds callback to custom validator.
   $validators = $form['#validate'][]; // Save existing validation calls. 
   //  Not clear in docs, but this is important!

  // In your case, you may want to add a method callback with this attribute.                                   
  $form['#validate'][] = $validators . ' _custom_validate';

بالطبع ، في وظيفة التحقق من الصحة الخاصة بك ، يمكنك تسجيل الأخطاء أو إعادة التوجيه أو تعيين رسائل الخطأ أو الإخطارات.

قم بقراءة نموذج واجهة برمجة التطبيقات وتنزيل أمثلة النموذج .

إذا كنت بحاجة إلى مساعدة وأمثلة وافرة ، فقم بتنزيل وحدات المساهمة ولاحظ كيف تعامل الآخرون مع الوحش ، أو انشر أسئلة هنا بينما تتقدم.

حظ سعيد ، حظ سعيد.

1
stefgosselin

حاول مع التحقق من صحة الحقل الوحدة النمطية ، استخدم مدقق فريد. أضف قاعدة التحقق من الصحة ، اختر نطاق فريد ، عالمي ، كيان ، حزمة.

1
ghr