Интеграция формы пометки с указанием узла
В настоящее время я делаю систему набора персонала с использованием Drupal 7..
В моей системе кандидату необходимо заполнить одноразовое онлайн-резюме, если он хочет подать заявку.
Я создаю имя типа контента "Профиль кандидата" для онлайн-резюме.
После этого я создаю флаг, чтобы кандидат мог выбрать работу. Имя флага - "Подать заявку", тип флага - "узел".
Тип ссылки флага я выбираю "Форма подтверждения", где заявителю необходимо заполнить поле, чтобы он встал с другим заявителем.
В этой форме получено "Имя кандидата" с типом поля ссылки на узел и "Шаг" с длинным типом текстового поля.
У меня вопрос, как сделать так, чтобы имя кандидата отображалось автоматически в поле имени кандидата? потому что моя проблема заключается в том, что заявитель должен выбрать свое имя.
p / s: ссылка на узел (поле имени кандидата) будет указывать на профиль кандидата (онлайн-резюме).
Благодарю вас.
1 ответ
Сначала я опишу, как я понимаю вашу установку, а также мои предположения, потому что, не видя никакого кода, сложно точно следовать:
Я предполагаю, что вы используете новейшую версию Drupal 7 с последним модулем ссылки на узел и флага. Если вы не в курсе, вы должны быть, если вы используете что-то меньше, чем D7, это, скорее всего, не будет работать. С D8 вы можете быть в порядке, но у меня не было возможности проверить это.
У вас есть тип контента
Applicant Profile
который пользователь может создать, я предполагаю, что он может создать несколько профилей?У вас есть
Apply Now
флаг, который будет отображаться на ваших рекламируемых вакансиях, при условии, чтоJob
это тип контента.Когда пользователь нажимает
Apply Now
наJob
они заносятся в форму подтверждения флага, которая просит их выбратьApplicant Profile
и заполните текст.
Если все вышеперечисленное верно, то нет способа точно выбрать правильный профиль приложения автоматически, потому что они могут создать более одного (и могут пожелать выбрать один на произвольный выбор), однако вы можете сделать некоторые обоснованные предположения,
настройки поля
Я не уверен, как вы отображаете Applicant Profiles
в поле выбора, вы можете просто полагаться на флажок типа контента в настройках поля вашего Applicant Name
ссылка на узел... если это так, вам следует переключиться на использование вида для выбора элементов для отображения. Таким образом, вы получаете больший контроль над тем, как создается список... который включает в себя возможность контролировать порядок отображения. Вы найдете следующий раздел внизу формы настроек поля для справочного поля узла. Прежде чем вы сможете использовать его, вам нужно создать references
Посмотреть.
Вы должны определить это представление так, чтобы оно работало с типом контента вашего профиля и упорядочением по последнему контенту вверху. После редактирования представления добавьте references
дисплей. Установите этот дисплей, чтобы принять UID в качестве контекстного аргумента, который получает свое значение от вошедшего в систему пользователя, если аргумент не передан. Затем настройте отображение так, чтобы отображать любой текст, который вы хотите для каждого профиля приложения, и убедитесь, что вы фильтруете, чтобы показывать только те профили, которые принадлежат UID.
сделанный на заказ код
Для следующего шага будет лучше, если вы создадите свой собственный модуль, который лучше всего описывает (и содержит в себе) изменения, которые вы делаете. Обычно разработчики либо используют имя проекта (для основного модуля проекта), либо имя надстройки, которую вы собираете. Если у вас уже есть заказной модуль, который может отвечать всем требованиям, вы можете объединить следующий код в этот модуль. Если модуль уже имеет hook_form_alter
реализовано, просто скопируйте if ( $form_id === 'flag_confirm' ) { ... }
заблокировать в этом крюке. Помните, что вам придется заменить HOOK_
с названием вашего модуля. Например, мой самый последний модуль назывался tate_microsites
так что крюк будет tate_microsites_form_alter
,
ПРИМЕЧАНИЕ. Если вы ранее не создавали никаких специальных модулей, вы также можете скопировать этот код в тему своего сайта.
template.php
(убедившись, что вы заменитеHOOK_
с названием вашей темы, т.е.bartik_form_alter
).
/**
* Implements hook_form_alter().
*
* Steps in, finds the flag confirmation form, and causes the
* 'Applicant Name' field to select its second most item.
*/
function HOOK_form_alter(&$form, &$form_state, $form_id) {
if ( $form_id === 'flag_confirm' ) {
/// make sure our form has the field we are looking for
if ( !empty($form['field_applicant_name']) ) {
$und = LANGUAGE_NONE;
/// grab out the possible options, rendered by our view
$options = &$form['field_applicant_name'][$und]['#options'];
/// shift on to avoid the _none option
next($options);
/// Set the default value to the second item, using its key.
$form['field_applicant_name'][$und]['#default_value'] = key($options);
}
}
}
Как только этот код появится на вашем сайте, не забудьте очистить кеши, а затем перейдите к соответствующей форме, вы должны увидеть, что выбран первый реальный элемент в списке. Это предполагает, что пользователь захочет выбрать свой последний созданный профиль, но, видя, что поле выбора все еще доступно, он может выбрать другой, если он того пожелает.
поиск проблемы
Если вы обнаружите, что вышеперечисленное не работает, вам необходимо убедиться, что $form_id
и имя поля правильные, и что вы заменили HOOK_
с правильным именем для того, где вы размещаете код. Если вы используете конкретный язык, вам может потребоваться изменить LANGUAGE_NONE
на язык по вашему выбору. Если это не помогло, убедитесь, что вы очистили кэши и не имеете других систем кэширования, которые могут вызывать проблемы, такие как лак, memcache или APC.
разработки
Просто чтобы объяснить, как я пришел к этому решению - так как для большинства простых модификаций Drupal шаблон, как правило, одинаков - сначала вам нужно выбрать свой хук. В этом случае, поскольку мы хотим изменить поведение поля, ваше первое место, на которое стоит обратить внимание, - это либо hook_form_alter
или же hook_field_preprocess
, На этот раз я выбрал первое, потому что знал, что хочу, чтобы полевые элементы были полностью рассчитаны, и к тому времени, когда мы находимся form_alter
В этом случае. Если вы не знаете, какие хуки для Drupal доступны, вы обычно можете искать в Google по ключевым словам "drupal hook" и всем, что вы пытаетесь найти, чтобы найти много информации. Тем не менее, есть также этот список, который ни в коем случае не является исчерпывающим, особенно если принять во внимание хуки contrib из установленных модулей.
Во всяком случае, однажды с правильным хуком, я обычно делаю следующее изначально:
function HOOK_form_alter(&$form, &$form_state, $form_id) {
watchdog(__FUNCTION__ . ':' . $form_id, '<xmp>' . print_r($form, TRUE) . '</xmp>');
}
ПРИМЕЧАНИЕ. Очевидно, что если у вас установлены какие-либо отладочные модули, вы можете использовать вместо них обработку отладочных сообщений, но обычно это быстрый запасной вариант.
После того, как приведенный выше код работает и кэши очищены, вы должны выполнить действие, которое вызовет сообщение отладки. В этом случае нам нужно посетить форму, над которой мы работаем. После этого наше отладочное сообщение должно быть доступно в сторожевом таймере (помните, это будет работать, только если у вас включено ведение журнала).
С этим выводом мы должны быть в состоянии выяснить две вещи, идентификатор формы, на который мы должны ориентироваться - в данном случае это было flag_confirm
- и конструкция поля, чей вывод должен выглядеть следующим образом:
[field_applicant_name] => Array
(
[#type] => container
[#attributes] => Array
(
[class] => Array
(
[0] => field-type-node-reference
[1] => field-name-field-applicant-name
[2] => field-widget-options-select
)
)
[#weight] => 1
[#tree] => 1
[#language] => und
[und] => Array
(
[#entity] => stdClass Object
(
[flagging_id] =>
[flag_name] => apply_now
[fid] => 2
[entity_type] => comment
[entity_id] => undefined
[uid] =>
[sid] =>
)
[#entity_type] => flagging
[#bundle] => apply_now
[#field_name] => field_applicant_name
[#language] => und
[#field_parents] => Array
(
)
[#columns] => Array
(
[0] => nid
)
[#title] => Applicant Name
[#description] =>
[#required] =>
[#delta] => 0
[#type] => select
[#default_value] => Array
(
)
[#multiple] =>
[#options] => Array
(
[_none] => - None -
[297541] => Pebbl Profile
[297543] => Another profile
)
[#value_key] => nid
[#element_validate] => Array
(
[0] => options_field_widget_validate
)
[#properties] => Array
(
[strip_tags] => 1
[optgroups] => 1
[empty_option] => option_none
[filter_xss] =>
)
[#after_build] => Array
(
[0] => field_form_element_after_build
)
)
[#access] => 1
)
Из этого вывода и перекрестных ссылок с Drupal Form API вы сможете увидеть, как был рассчитан конечный результат. Два ключевых элемента #default_value
а также #options
,
Обновить
Ну, опять же, не видя больше видов и других предметов, которые у вас есть; советовать сложно. Тем не менее, пока у вас есть поле в форме подтверждения флага, которое отображает возможные приложения для выбора, вы все равно можете использовать следующее form_alter
изменить это поле.
Если в вашем поле в настоящий момент перечислены все возможные профили, то, если у вас есть какой-то способ определить, каким профилем владеет в настоящее время вошедший в систему пользователь, вы можете отсканировать варианты и выбрать тот, который требуется (так же, как мой код выше хотя и для первого пункта в списке).
/**
* Implements hook_form_alter().
*
* Steps in, finds the flag confirmation form, and causes the
* 'Applicant Name' field to select its second most item.
*/
function HOOK_form_alter(&$form, &$form_state, $form_id) {
global $user; /// access to the $user object
if ( $form_id === 'flag_confirm' ) {
/// make sure our form has the field we are looking for
if ( !empty($form['field_applicant_name']) ) {
$und = LANGUAGE_NONE;
/// grab out the possible options, rendered by our view
$options = &$form['field_applicant_name'][$und]['#options'];
/// start with nothing selected
$selected = '';
/// here you could implement your search code
foreach ( $options as $application_nid => $option ) {
if ( ... ) {
$selected = $application_nid;
/// update the select box to only have one option
$form['field_applicant_name'][$und]['#options'] = array(
"$selected" => $option
);
break;
}
}
if ( $selected ) {
/// Set the default value to the correct application
$form['field_applicant_name'][$und]['#default_value'] = $selected;
/// Because this field has been auto selected, and only has one option
/// you might as well hide it from the user.
$form['field_applicant_name']['#access'] = 0;
}
}
}
}
Очевидно, что в приведенном выше вам придется заменить ...
с вашей логикой для выбора правильного приложения. Но все зависит от того, как именно вы настроили эти отношения в вашей системе. У вас есть доступ к $user
объект, но вам, возможно, придется сделать какой-то другой вид поиска в базе данных или загрузить, чтобы получить всю информацию, необходимую для поиска нужного приложения. Это вполне возможно node_load
каждый $application_nid
и сравнить $user->uid
против $application->uid
Однако я бы не рекомендовал это, особенно если список приложений может стать большим. Вместо этого, если вам нужно загрузить дополнительную информацию для сравнения, вам следует использовать EntityFieldQuery, чтобы найти само приложение, а затем сравнить его с элементами в списке параметров.
Вышеупомянутое все еще не самый оптимальный способ сделать что-либо, так как было бы намного лучше, если бы по умолчанию генерировался какой-либо список опций на основе текущего зарегистрированного пользователя (то есть, когда-либо будет только один элемент для выбора, который может быть достигнуты с использованием представлений, а затем иметь автоматический выбор) или полагаться на отношения пометки и игнорировать приложение, непосредственно выбранное пользователем. Однако, по крайней мере, не увидев пример экспорта и снимок экрана с вашей попыткой просмотра (тот, который вы упомянули в своем комментарии об отображении как приложения, так и высоты тона), я не могу помочь намного дальше.