我不知道如何在hook_form_alter()中实现AJAX回调。
默认情况下,该字段为纯文本,并由客户端公司的NID (number)填充。模块名为"my_car“。我没有在这个字段中使用节点引用。
以下是代码:
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 -')
);
}
}在这里,我使用companyTitle()函数返回所有具有TID 12的公司(节点),并将字段类型("textfield“替换为"select")及其内容--一个数字包含文本(NID和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;
}我根据TID和title编写了返回客户公司NID和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;
}现在是如何用最后一个函数实现AJAX的问题。我需要文本字段(它不是一个选择列表)在AJAX搜索中,NID将作为标题呈现(NID仅保留在field_car_company_value列中的数据库中)。
显然,我不知道如何实现回调函数。
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);
}发布于 2019-05-26 01:04:58
Drupal中有两种类型的ajax。传统的AJAX,以及Drupal表单api #ajax。通过在表单中使用#ajax,但返回和AJAX响应,而不是#ajax回调响应,您将两者混合在一起。
要理解#ajax,您需要了解表单API的工作过程。这就是标准的非Ajax表单API表单在Drupal中的工作方式:
在实现#ajax时,流程与上面相同,但中间有一些附加步骤。
参考您的代码,ajax回调将收到两个参数,$form和$form_state,并且需要返回表单的一部分。所以它应该看起来像:
function ajax_callback($form, $form_state) {
return $form['some_element']['of_the_form'];
}在您的表单中,这可能是$form['field_car_company']['und'][0]['value']。当表单最初以现在的方式呈现时,您将构建该表单元素的选项,如果表单是使用ajax提交的,则使用提交的值来确定要显示的新选项。
发布于 2019-05-27 14:01:46
@Jaypan
我做了以下工作:
function my_car_menu() {
$items = array();
$items['car/autocomplete'] = array(
'title' => 'Autocomplete for cars',
'page callback' => 'car_autocomplete',
'access arguments' => array('list of cars'),
'type' => MENU_CALLBACK
);
return $items;
}
function my_car_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'car_node_form') {
$form['field_car_company']['und'][0]['value']['#ajax'] = array(
'callback' => 'ajax_callback'
);
$form['field_car_company']['und'][0]['value'] = array(
'#type' => 'textfield',
'#default_value' => $form_state['node']->field_car_company['und'][0]['value'],
'#title' => 'Client company',
'#description' => 'Zakupac',
'#required' => TRUE,
'#autocomplete_path' => 'car/autocomplete'
);
}
}
function ajax_callback($form, $form_state) {
return $form['field_car_company']['und'][0]['value'];
}
function car_autocomplete($string = '') {
$matches = array();
if ($string) {
$clientCompanies = ajaxCompanyTitle(12, $string);
foreach ($clientCompanies as $clientCompany) {
$matches[$clientCompany->title] = check_plain($clientCompany->title);
}
}
drupal_json_output($matches);
}AJAX回调现在起作用了。我已经用'#autocomplete_path' => 'car/autocomplete'实现了它。但是在数据库中现在写的是$clientCompany->title而不是$clientCompany->nid。我还需要数据库中的NID。
https://drupal.stackexchange.com/questions/281584
复制相似问题