سؤال

باستخدام حقل الإكمال التلقائي لعرض NodueFerence CCK يعرض معرف العقدة كملحق من الواضح

Page Title [nid:23]

أفهم أن هذا يضمن أن الاختيارات فريدة من نوعها في حالة تعقد العقد نفس العنوان، ولكن من الواضح أن هذا شيء سيئ لفضحه للمستخدم.

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

هل كانت مفيدة؟

المحلول

في النهاية، تحتاج إلى تغيير إخراج nodereference_autocomplete() في nodueerence.module.

للقيام بذلك بشكل صحيح، تريد وحدة مخصصة لتجاوز الوظيفة نظيفة.

يتم تعريف هذه الوظيفة كواصل اتصال قائمة، وبالتالي،

/**
 * Implementation of hook_menu_alter().
 */
function custom_module_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'custom_module_new_nodereference_autocomplete';
}

بعد ذلك، قم بنسخ وظيفة NoDueReference_AutoCowlete إلى الوحدة النمطية المخصصة الخاصة بك، وتغيير اسمها لتتناسب مع رد الاتصال لديك. ثم قم بتغيير هذا السطر واحد:

$matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';

إسقاط مرجع NID.

$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';

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

أنا أقصد دائما تحديد كيفية القيام بذلك. شكرا لك على تحفيزني بسؤالك.

نصائح أخرى

ما سجله Grays Will World ... طالما لم يكن لديك عقدتين بنفس العنوان. وبعبارة أخرى، إذا كنت ترغب في القيام به حيث اقترح Grayside، فأنت بحاجة إلى أن تكون على علم بأن NID ليس غير مهم تماما. ال nodeReference_AutoCowerEte_Validate () وظيفة يفعل شيئين. يتحقق لمعرفة ما إذا كان هناك عقدة تطابق، وإذا كان الأمر كذلك، فإنه يمرر NID، وإعداده إلى $form_state مجموعة مصفوفة. إذا لم تتمكن من العثور على عقدة، فسيتم تعيين خطأ. إذا كان NID موجودا، فسيتم استخدامه للحصول على العقدة، والذي هو أيضا أسرع، الرمز هنا:

preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value, $matches);
    if (!empty($matches)) {
        // Explicit [nid:n].
        list(, $title, $nid) = $matches;
        if (!empty($title) && ($n = node_load($nid)) && $title != $n->title) {
            form_error($element[$field_key], t('%name: title mismatch. Please check your selection.', array('%name' => t($field['widget']['label']))));
        }
    }

هذا فقط يتحقق لمعرفة ما إذا كان هناك NID وهيكلا إذا تتطابق هذه العقدة مع العنوان، إذا تم تمرير NID.

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

لذلك باختصار، أنت يمكن تخلص من NID في رد الاتصال التلقائي، ولكن لديها عيوب 2:

  1. الأداء (قليلا)
  2. عدم اليقين في اختيار العقدة الصحيحة.

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

حصلت على إجابة Grayside للعمل، لكني اضطررت إلى استخدام القائمة تغيير، بدلا من النموذج يغير نشره. لا تزن!

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}

لقد وجدت حل بديل هو تغيير نوع القطعة الخاص بك إلى قائمة ثم استخدم الوحدة المختارة لتحويل قائمتك إلى حقل الإكمال التلقائي.

هذا يتعامل مع العقد مع نفس العنوان، وفي الواقع أعتقد أن واجهة المستخدم أفضل من تلك المقدمة من أداة الإكمال التلقائي.

لأي شخص يأتي عبر هذا الموضوع (القديم إلى حد ما) عن طريق بحث Google - ل Drupal 7، يرجى مراعاة استخدام الوحدة النمطية EntityReference و "مرجع كيان" نوع الحقل إذا كان ذلك ممكنا.

يمكنك تحقيق الكثير في التكوين مع حقل "مرجع كيان". ليس لديها هذه المشكلة مع NID في الأقواس المربعة.

فيما يلي نسخة كاملة Drupal 7 (المراجع 7.x-2.1) إجابة Grayside. هذا يذهب في الوحدة المخصصة الخاصة بك:

/**
 * Implementation of hook_menu_alter().
 */
function custom_menu_alter(&$items) {
  $items['node_reference/autocomplete/%/%/%']['page callback'] = 'custom_new_node_reference_autocomplete';
}

/**
 * Implementation of Menu callback for the autocomplete results.
 */
function custom_new_node_reference_autocomplete($entity_type, $bundle, $field_name, $string = '') {
  $field = field_info_field($field_name);
  $instance = field_info_instance($entity_type, $field_name, $bundle);

  $options = array(
    'string' => $string,
    'match' => $instance['widget']['settings']['autocomplete_match'],
    'limit' => 10,
  );
  $references = node_reference_potential_references($field, $options);

  $matches = array();
  foreach ($references as $id => $row) {
    // Markup is fine in autocompletion results (might happen when rendered
    // through Views) but we want to remove hyperlinks.
    $suggestion = preg_replace('/<a href="([^<]*)">([^<]*)<\/a>/', '$2', $row['rendered']);
    // Add a class wrapper for a few required CSS overrides.
    $matches[$row['title']] = '<div class="reference-autocomplete">' . $suggestion . '</div>'; // this is the line that was modified to remove the "[nid:XX]" disambiguator
  }

  drupal_json_output($matches);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top