欢迎各位兄弟 发布技术文章
这里的技术是共享的
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://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
下面四个函数是自己亲自做的,注意红色的字,它们之间的关系就可以了
最后为了 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');
}
}
}