欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal 7 custom autocomplete drupal7 d7 自定义字段 表单自动完成 自动补全 自己亲自做的 有大用 有大大用

https://www.drupal.org/docs/7/modules/entity-reference/using-a-view-to-display-the-elements-in-the-autocomplete-widget 

https://www.drupal.org/node/854216

https://x-team.com/blog/extending-drupal-7-autocomplete-fields-output/

https://www.bounteous.com/insights/2019/01/30/drupal-how-customize-autocomplete-labels

https://drupal.stackexchange.com/questions/51089/creating-module-with-autocomplete-and-accepting-multiple-values-in-textfield

https://www.webomelette.com/how-create-autocomplete-form-element-drupal-7

https://antistatique.net/en/blog/how-to-create-a-custom-autocomplete-using-the-drupal-8-form-api

https://www.drupal.org/project/webform/issues/2962972

https://www.drupal.org/forum/support/module-development-and-code-questions/2016-02-12/custom-autocomplete-fields-like 

https://www.drupal.org/forum/support/module-development-and-code-questions/2015-02-12/autocomplete-does-not-work-when-call  



下面四个函数是自己亲自做的,注意红色的字,它们之间的关系就可以了

最后为了 items 生效,还要清空缓存


function custom_twenty_two_jses_menu()
{
 
   
$items['batch_dhcps'] = array(
       
'title' => '批量添加dhcp',
       
'page callback' => 'custom_twenty_two_jses_batch_dhcps',
       
'access arguments' => array('create wp_blog_clone_2 content'),
   );
   
$items['network_segment_autocomplete'] = array(
       
'title' => '批量添加dhcp',
       
'page callback' => 'custom_twenty_two_jses_network_segment_autocomplete',
       
'access arguments' => array('create wp_blog_clone_2 content'),
   );
   
return $items;
}


function batch_dhcps_form()
{
   
$form['dchp_network_segment'] = array(
       
'#type' => 'textfield',
       
'#title' => t('网段名称'),
       
'#size' => 60,
       
'#autocomplete_path' => 'network_segment_autocomplete',
   );
   
$form['mac_address'] = array(
       
'#type' => 'textarea',
       
'#title' => t('mac address'),
       
'#cols' => 60,
       
'#rows'  => 10,
       
'#default_value' => $_SESSION['transfor_form_textarea'],
       
'#description' => '一行一个mac地址中短横,冒号及连在一起的mac都可以;'
   
);

   
$form['submit'] = array('#type' => 'submit', '#value' => t('submit'));

   
return $form;
}


function custom_twenty_two_jses_batch_dhcps()
{
   
return drupal_get_form('batch_dhcps_form'); //记住,这里千万要用 drupal_get_form
}


function custom_twenty_two_jses_network_segment_autocomplete($string)
{
   
$string = _removeCnEnSpace($string);
   
$results =  array();
     // 为什么drupal7 中后面没有fetchAll() 方法也行
   
$results_db =  db_query("select n.nid,net_name.field_network_name_value,network_ip.field_network_ip_value,server_ip.field_dhcp_server_ip_value from node n
         inner join field_data_field_network_name net_name on n.nid=net_name.entity_id
         inner join  field_data_field_network_ip network_ip  on n.nid=network_ip.entity_id
         inner join  field_data_field_dhcp_server_ip server_ip  on  n.nid=server_ip.entity_id
       where type='dchp_network_segment'
         and net_name.entity_type='node' and net_name.bundle='dchp_network_segment'
        and network_ip.entity_type='node' and network_ip.bundle='dchp_network_segment'
        and server_ip.entity_type='node' and server_ip.bundle='dchp_network_segment'
        and net_name.field_network_name_value  like :field_network_name_value"
,array(':field_network_name_value' => '%' . db_like($string) . '%'));

   
foreach ($results_db as $row) {
       
$results[$row->field_network_name_value.'-'.$row->field_network_ip_value.'-'.$row->field_dhcp_server_ip_value] = check_plain($row->field_network_name_value.'-'.$row->field_network_ip_value.'-'.$row->field_dhcp_server_ip_value);
   }
   drupal_json_output(
$results);
   
exit;
}




function batch_dhcps_form_validate($form, &$form_state)
{
   
//文件不存在 或者文件修改(这里就是创建)的时间 大于30天 即 30*24*3600=2592000
   
if (!is_file(dirname(__FILE__) . '/enumpools.txt') || (time() - filemtime(dirname(__FILE__) . '/enumpools.txt')) > 2592000) {
       
$enumpools = _generate_all_network_pool();
   }
else {
       
$enumpools = unserialize(file_get_contents(dirname(__FILE__) . '/enumpools.txt'));//反序列化为数组
   
}

   
$values = $form_state['values'];
   
$dchp_network_segment = $values['dchp_network_segment'];
   
$dchp_network_segment_arr = explode("-", $dchp_network_segment);

   
$num = count($dchp_network_segment_arr);
   
$server_Ip = $dchp_network_segment_arr[$num - 1];
   
$network_ip = $dchp_network_segment_arr[$num - 2];
   
$enumpool = $enumpools[$network_ip];//当前的要保留的ip所在的池
   
$mac_address_arr = explode("\n", _removeCnEnSpace($values['mac_address']));
   
foreach ($mac_address_arr as $key => $one) {
       
$one = _isMacAddressOrEmtpy($one, $middle_symbol = '-');
       
if ($one === true || !$one) {
           
unset($mac_address_arr[$key]);
           drupal_set_message(
'mac 地址 ' . $one . '不合格!');
           
continue;
       }
       
$mac_address_arr[$key] = $one;
   }

   
foreach ($mac_address_arr as $outer_key => $one) {
       
$ReservedIp = null;
       
//我们先要执行的是在子网上查询客户端
       
$one_dim_param_SubnetFindOneClient = array(
           
'server' => array('Ip' => $server_Ip),
           
'network' => array('Ip' => $network_ip),//
           
'terms' => array(
               
'MacRegEx' => _my_mac_address_remove_zhong_duan_heng_maohao_dian($one),
           ),
       );
       
$result = _call_dhcpoperations('SubnetFindOneClient', $one_dim_param_SubnetFindOneClient);//这是一个对象
       
if (is_array($result) && !empty($result['failed'])) { //假如查不到的话,什么也不用做,继续往下执行
       
} else {
           
$tm_one_client = $result->SubnetFindOneClientResult;
           
$tm_one_client = _object_to_array($tm_one_client);
           
$tm_one_client = _my_OneClientResult_two_dim_array($tm_one_client);
           
if (!empty($tm_one_client) && !_is_Reservation($tm_one_client)) {  //假如查到的是租约,不是保留,继续往下执行
               
$ReservedIp = $tm_one_client['IpAddress_Ip'];
           }
else {//正常查到保留 保留的ip是 $tm_one_client['IpAddress_Ip']
               
drupal_set_message('返回原保留,mac地址为 ' . _my_mac_address_to_zhong_duan_heng_maohao_dian($one, '-') . ' ip地址为 ' . $tm_one_client['IpAddress_Ip']);
           }
       }
       
//查不到保留,就往下执行,进行创建保留
       
$one_dim_param_wireless_EnumLeases = array(
           
'server' => array('Ip' => $server_Ip),
           
'network' => array('Ip' => $network_ip),
       );
       
$from_EnumLeases = _call_dhcpoperations('EnumLeases', $one_dim_param_wireless_EnumLeases);//这是一个对象
       
$result_EnumLeases = $from_EnumLeases->EnumLeasesResult->DhcpClient;
       
$result_EnumLeases = _object_to_array($result_EnumLeases);//把对象转换为数组
       
$temp_arr = array();
       
if (empty($result_EnumLeases[0])) {
           
$temp_arr[] = $result_EnumLeases;
       }
       !
empty($temp_arr) && $result_EnumLeases = $temp_arr;
       
foreach ($result_EnumLeases as $key => $value) {
           
unset($result_EnumLeases[$key]['IpAddress']);
           
unset($result_EnumLeases[$key]['SubnetMask']);
           
unset($result_EnumLeases[$key]['MacAddress']);
           
$result_EnumLeases[$key]['IpAddress_Ip'] = $value['IpAddress']['Ip'];
           
$result_EnumLeases[$key]['SubnetMask_Ip'] = $value['SubnetMask']['Ip'];
           
$result_EnumLeases[$key]['MacAddress_Mac'] = $value['MacAddress']['Mac'];
       }


       
if (empty($ReservedIp)) { //这里 $ReservedIp 是上面 约1153行获得的租约,如果存在这个ip,就直接用这个$ReservedIp来进行保留
           
$ReservedIp = _my_get_ReservedIp(_my_mac_address_remove_zhong_duan_heng_maohao_dian($one), $enumpool, $result_EnumLeases);
           
if (is_array($ReservedIp) && $ReservedIp['failed']) { //如果出现结果为 array('failed'=>'得不到保留ip地址,地址池可能不够!'),就中止执行吧
               
drupal_set_message($ReservedIp['failed'], 'warning');
               
break;
           }
       }
       
$one_dim_param_CreateReservation = array(
           
'server' => array('Ip' => $enumpool['server_Ip']),
           
'network' => array('Ip' => $network_ip),
           
'res' => array(
               
'ReservedIp' => array('Ip' => $ReservedIp),
               
'ReservedMac' => array('Mac' => _my_mac_address_remove_zhong_duan_heng_maohao_dian($one)),
               
'bAllowedClientTypes' => 'Dhcp',
               
'Name' => '',
               
'Comment' => '',
           ),
       );
       
$result2 = _call_dhcpoperations('CreateReservation', $one_dim_param_CreateReservation);//这是一个对象

       
if (is_array($result2) && !empty($result2['failed'])) {
           drupal_set_message(
' 在dhcp上创建保留失败,此 mac为 ' . _my_mac_address_to_zhong_duan_heng($one) . ' 保留,ip地址为:' . $ReservedIp, 'warning');
       }
else { //正常创建保留返回,
           
drupal_set_message('创建保留成功,mac地址为 ' . _my_mac_address_to_zhong_duan_heng($one) . ' , ip地址为 ' . $ReservedIp);

           _save_dhcp_reserved_log(_my_mac_address_to_zhong_duan_heng(
$one),$ReservedIp,'insert');
       }
   }
}


普通分类: