I don't know how to implement AJAX callback in hook_form_alter().
The field is plain text by default and it is populated by NID (number) of the client company. The module name is "my_car". I didn't use node reference in this field.
Here is the code:
function my_car_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'car_node_form') {
$clientCompanies = companyTitle(12); // TID 12
// Replace Client company NID with title
$form['field_car_company']['und'][0]['value'] = array(
'#title' => 'Client company',
'#type' => 'select',
'#default_value' => $form_state['node']->field_car_company['und'][0]['value'],
'#options' => $clientCompanies,
'#required' => TRUE,
'#empty_option' => t('- Select -')
);
}
}
Here I use companyTitle() function to return all companies (nodes) that have TID 12 and replace field type ("textfield" with "select") and it's content - a number with text (NID with title).
function companyTitle($tid) {
$results = db_query("
SELECT n.nid, n.title
FROM {node} AS n
LEFT JOIN {field_data_field_company_type} AS ct ON ct.entity_id = n.nid
WHERE n.type = 'company' AND ct.field_company_type_tid = :tid
ORDER BY n.title ASC",
array(':tid' => $tid))->fetchAllKeyed();
return $results;
}
I have written the function that returns NID and title of client company based on TID and title:
function ajaxCompanyTitle($tid, $companyName) {
$query = db_select('node', 'company')
->fields('company', array('nid', 'title'))
->condition('company.type', 'company', '=')
->condition('type.field_company_type_tid', $tid, '=')
->condition('company.title', '%'.db_like($companyName).'%', 'LIKE')
->orderBy('company.title', 'ASC')
->range(0, 10);
$query->leftJoin('field_data_field_company_type', 'type', 'type.entity_id = company.nid');
$results = $query->execute()->fetchAll();
return $results;
}
Now is the question of how to implement AJAX with the last function. I need text field (it does not to be a select list) with AJAX search where NID will be rendered as title (NID remaining only in the database in the field_car_company_value column).
Apparently, I don't know how to implement a callback function.
function my_car_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'car_node_form') {
// Replace Client company NID with title
$form['field_car_company']['und'][0]['value'] = array(
'#title' => 'Client company',
'#type' => 'textfield',
'#required' => TRUE,
'#ajax' => array(
'callback' => 'ajax_callback',
'wrapper' => 'edit-field-car-company-und-0-value',
)
);
}
}
function ajax_callback($string = '') {
$matches = array();
if ($string) {
$clientCompanies = ajaxCompanyTitle(12, $string);
foreach ($clientCompanies as $clientCompany) {
$matches[$clientCompany->title] = $clientCompany->title;
}
}
drupal_json_output($matches);
}
HtmlCommand
can be found here drupal-up.com/blog/drupal-8-ajax-form-submit-example, see if you can get any those to work.