欢迎各位兄弟 发布技术文章
这里的技术是共享的
第一种方法 是 hook_theme 表单,表单字段 好像不需要对form 进行hook 感觉到 theme_form 可能用不着改写
<?php function accept_task_form()//accept_task_form 就是 $form_id { // 文本框 name是文本框的名称 $form['accept_task_num'] = array( '#type' =>'textfield',//drupal 规定文本框用textfield来表示 '#size' => 2, ); //提交按钮 // $form['submit'] = array('#type'=>'submit','#value'=>'领单'); $form['#after_build'][] = '_remove_form_item_div'; return $form; } function _remove_form_item_div($form, &$form_state) { // 第一步 给表单 加个 #theme $form['#theme'] = array('accept_task_form');
//第一步给表单字段 加个 #theme
$form['accept_task_num']['#theme'] = array('accept_task_num_text_field');
return $form; } function shipingzhongcustomtask_theme() { return array(
//第二步 hook theme一下 'accept_task_form' => array( 'render element' => 'form', ), 'accept_task_num_text_field' => array( 'render element' => 'element', ), ); }
//第三步 实现这个 hook 的theme 关于表单 function theme_accept_task_form($form) { // $export = kprint_r(drupal_render($element['accept_task_num']), TRUE); // $vars - is a variable which you want to print. // print $export; $output = ''; // $output .= drupal_render($element['form_id']); // $output .= drupal_render($element['form_build_id']); // $output .= drupal_render($element['form_token']); // $output .= drupal_render($element['accept_task_num']); // $output .= drupal_render($element['submit']); //$output .= drupal_render_children($form); //这个好像 drupal 6 不行 drupal 7 才行 $output .= drupal_render($form); return $output; // Anonymous div to satisfy XHTML compliance. // $action = $element['#action'] ? 'action="' . check_url($element['#action']) . '" ' : ''; // return '<form ' . $action . ' accept-charset="UTF-8" method="' . $element['#method'] . '" id="' . $element['#id'] . '"' . drupal_attributes($element['#attributes']) . ">\n<div>" . $element['#children'] . "\n</div></form>\n"; }
//第三步 实现这个 hook 的theme 关于表单字段 其实就是把 theme_textfield函数拿过来修改一下
function theme_accept_task_num_text_field($element) { $size = empty($element['#size']) ? '' : ' size="'. $element['#size'] .'"'; $maxlength = empty($element['#maxlength']) ? '' : ' maxlength="'. $element['#maxlength'] .'"'; $class = array('form-text'); $extra = ''; $output = ''; if ($element['#autocomplete_path'] && menu_valid_path(array('link_path' => $element['#autocomplete_path']))) { drupal_add_js('misc/autocomplete.js'); $class[] = 'form-autocomplete'; $extra = '<input class="autocomplete" type="hidden" id="'. $element['#id'] .'-autocomplete" value="'. check_url(url($element['#autocomplete_path'], array('absolute' => TRUE))) .'" disabled="disabled" />'; } _form_set_class($element, $class); if (isset($element['#field_prefix'])) { $output .= '<span class="field-prefix">'. $element['#field_prefix'] .'</span> '; } $output .= '<input type="text"'. $maxlength .' name="'. $element['#name'] .'" id="'. $element['#id'] .'"'. $size .' value="'. check_plain($element['#value']) .'"'. drupal_attributes($element['#attributes']) .' />'; if (isset($element['#field_suffix'])) { $output .= ' <span class="field-suffix">'. $element['#field_suffix'] .'</span>'; }
//修改处在这儿 _accept_task_num_text_field_form_element 是改写 theme_form_element 我的目的就是 去除掉 form-item 的div
//return theme('form_element', $element, $output) . $extra; return _accept_task_num_text_field_form_element($element, $output) . $extra; } function _accept_task_num_text_field_form_element($element, $value) { // This is also used in the installer, pre-database setup. $t = get_t(); $output = ''; $required = !empty($element['#required']) ? '<span class="form-required" title="'. $t('This field is required.') .'">*</span>' : ''; if (!empty($element['#title'])) { $title = $element['#title']; if (!empty($element['#id'])) { $output .= ' <label for="'. $element['#id'] .'">'. $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) ."</label>\n"; } else { $output .= ' <label>'. $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) ."</label>\n"; } } $output .= " $value\n"; if (!empty($element['#description'])) { $output .= ' <div class="description">'. $element['#description'] ."</div>\n"; } return $output; } //表单函数_validate 验证类似于钩子函数的回调函数 function accept_task_form_validate(&$form, &$form_state) { /** * 用户提交的所有数据在 $form_state['values'] 之中,相当于 $_POST */ // form_set_error('',$form_values['name']); if($form_state['values']['name'] == '') { form_set_error('',t('You must input your name')); } } //表单函数_submit 提交函数 function accept_task_form_submit(&$form, &$form_state) { /** * 用户提交的所有数据在 $form_state['values'] 之中,相当于 $_POST */ drupal_set_message(t('Your name is ').$form_state['values']['name'].' '. t('Your age is ').$form_state['values']['age']); }
第二种方法 是 在 主题的temlate.php文件中 好像不需要对form 进行hook 感觉到 theme_form 可能用不着改写 改写 超越一下 theme_form() 和 theme_textfiel() 和 theme_form_element() 判断一下 如果 是 字段 accept_task_num 就改写方法 否则的话 调用默认的方法 ,思路比较简单,就不写了