Удаление [nid:n] в автоматическом заполнении nodereference

Ваш вопрос, кажется, больше об автоматизированном тестировании по сравнению с ручным тестированием. Поблочное тестирование является формой автоматизированного тестирования, но очень определенной формой.

Ваш комментарий о наличии отдельных тестеров и разработчиков является правильным на метке все же. Но это не означает, что разработчики не должны делать некоторой формы проверки.

Поблочное тестирование является способом для разработчиков надеть быструю обратную связь, что они делают. Они пишут тесты для быстрого выполнения небольших единиц кода и проверяют их правильность. Это действительно не тестирует в смысле, Вы, кажется, используете слово, тестирующее точно так же, как проверка синтаксиса компилятором не тестирует. Поблочное тестирование является методом разработки. Код, который это было записано с помощью этой техники, вероятно, имеет более высокое качество, чем код, написанный без, но все еще должен пройти контроль качества.

на вопрос об автоматизированном тестировании по сравнению с ручным тестированием на испытательный цех легче ответить. Каждый раз, когда проект становится достаточно большим для выравнивания по ширине инвестиций записи автоматизированных тестов, необходимо использовать автоматизированные тесты. Когда у Вас есть много маленьких одноразовых тестов, необходимо сделать их вручную.

13
задан googletorp 6 September 2010 в 11:05
поделиться

3 ответа

В конечном итоге вам нужно изменить вывод nodereference_autocomplete () в nodereference.module.

Чтобы сделать это правильно, вы хотите, чтобы пользовательский модуль полностью переопределил function.

Эта функция определяется как обратный вызов меню, поэтому

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

Затем скопируйте функцию nodereference_autocomplete в свой пользовательский модуль, изменив ее имя, чтобы оно соответствовало вашему обратному вызову. Затем измените эту строку:

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

Удаление ссылки на nid.

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

Я считаю, что идентификатор на данный момент носит чисто косметический характер, что означает, что вы также можете изменить текст, как вам нравится. Если это не чисто косметический характер, что ж, я не проверял, что произойдет в неправильных условиях.

Я всегда хотел понять, как это сделать. Спасибо, что мотивировали меня своим вопросом.

17
ответ дан 1 December 2019 в 22:07
поделиться

То, что опубликовал Грейсайд, будет работать ... до тех пор, пока у вас нет двух узлов с одинаковым названием. Другими словами, если вы хотите поступить так, как предлагал Грейсайд, вы должны знать, что nid не совсем не важен. Функция nodereference_autocomplete_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 передается.

Второй вариант немного медленнее, но здесь могут возникать ошибки. Если вы проследите за казнью, вы увидите, что if попытается найти узел, основываясь только на заголовке, и возьмет первый соответствующий узел. В результате, если у вас есть два узла с одинаковым заголовком, всегда будет использоваться один из них. Возможно, это не проблема для вас, но дело в том, что вы никогда не узнаете, произойдет ли это. Все будет работать нормально, и пользователь будет думать, что он выбрал узел, который хотел. Это могло быть так, но он мог также выбрать неправильный узел.

Короче говоря, вы можете избавиться от nid в обратном вызове автозаполнения, но у него есть 2 недостатка:

  1. ] производительность (немного)
  2. неопределенность в выборе правильного узла.

Поэтому вы должны подумать об этом, прежде чем идти по этому пути. Тем более, что вы, скорее всего, не сможете найти проблему выбора неправильных узлов, если это произойдет.

6
ответ дан 1 December 2019 в 22:07
поделиться

Я заставил ответ Грейсайда работать, но мне пришлось использовать MENU alter, вместо FORM alter, который он опубликовал. Ничего страшного!

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
0
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: