2011-08-02 60 views
2

我的模塊實現了一系列字段api函數,以提供由文本字段和textarea組成的自定義字段類型。 hook_field_validate函數被所有正確的鍵調用,但從來沒有任何值 - 真的很感激,如果有人會看看所有的代碼,並告訴我是否有任何問題。Drupal 7字段API hook_field_validate沒有接收數據?

function brooklands_field_info() { 
    return array(
     'brooklands_heading_text' => array(
      'label' => t('Heading with text'), 
      'description' => t('Heading with text - says it all.'), 
      'default_widget' => 'brooklands_heading_text_widget', 
      'default_formatter' => 'brooklands_heading_text_formatter', 
     ), 
    ); 
} 

function brooklands_field_validate($entity_type, $entity, $field, 
         $instance, $langcode, $items, &$errors) { 
    /*foreach ($items as $delta => $item) { 

      // $item never contains any data!!!!! 

     $heading = check_plain($item['brooklandsheading']); 
     $text = check_markup($item['value'], $item['format']); 
     if(!empty($heading) || !empty($text) && empty($heading) || empty($text)) { 
      $errors[$field['field_name']][$langcode][$delta][] = array(
       'error' => 'brooklands_invalid', 
      'message' => t('Must have both heading and text'), 
     ); 
     } 
    }*/ 
} 

function brooklands_field_widget_error($element, $error, $form, &$form_state) { 
    switch ($error['error']) { 
     case 'brooklands_invalid': 
     form_error($element, $error['message']); 
     break; 
    } 
} 

function brooklands_field_is_empty($item, $field) { 
    return empty($item['brooklandsheading']) || empty($item['value']); 
} 

function brooklands_field_formatter_info() { 
    return array(
     'brooklands_heading_text_formatter' => array(
      'label' => t('Heading text formatter'), 
      'field types' => array('brooklands_heading_text'), 
     ), 
    ); 
} 

function brooklands_field_formatter_view($entity_type, $entity, $field, 
         $instance, $langcode, $items, $display) { 
    $element = array(); 
    foreach ($items as $delta => $item) { 
     $element[$delta]['#markup'] = '<div class="brooklands-heading-text"><h3>' 
     .check_plain($item['brooklandsheading']).'</h3>' 
     .check_markup($item['value'], $item['format']).'</div>'; 
    } 
    return $element; 
} 

function brooklands_field_widget_info() { 
    return array(
     'brooklands_heading_text_widget' => array(
      'label' => 'Heading/text widget', 
      'field types' => array('brooklands_heading_text'), 
     ), 
    ); 
} 

function brooklands_field_widget_form(&$form, &$form_state, $field, 
         $instance, $langcode, $items, $delta, $element) { 
    $element['brooklandsheading'] = array(
     '#delta' => $delta, 
     '#default_value' => isset($items[$delta]['brooklandsheading']) ? 
      $items[$delta]['brooklandsheading'] : '', 
     '#type' => 'textfield', 
     '#size' => 64, 
     '#maxlength' => 256, 
     '#title' => t('Heading') 
    ); 
    $text = array(
     '#type' => 'textarea', 
     '#default_value' => isset($items[$delta]['value']) ? 
      $items[$delta]['value'] : '', 
    ); 
    $element += $text; 
    $element['#format'] = isset($items[$delta]['format']) ? 
          $items[$delta]['format'] : NULL; 
    $element['#base_type'] = $element['#type']; 
    $element['#type'] = 'text_format'; 
    $element['#title'] = t('Text'); 
    return $element; 
} 

編輯:這是從我模塊的hook_field_schema執行文件級安裝

function brooklands_field_schema($field) { 
    $columns = array(
     'brooklandsheading' => array(
      'type' => 'varchar', 
      'length' => 256, 
      'not null' => FALSE 
     ), 
     'value' => array(
      'type' => 'text', 
      'not null' => FALSE 
     ), 
     'format' => array(
      'type' => 'varchar', 
      'length' => 255, 
      'not null' => FALSE, 
     ), 
    ); 
    return array(
     'columns' => $columns, 
     'indexes' => array(
      'format' => array('format'), 
     ), 
     'foreign keys' => array(
      'format' => array(
       'table' => 'filter_format', 
       'columns' => array('format' => 'format'), 
      ), 
     ), 
    ); 
} 

回答

0

我發現這個代碼有點混亂,我不是專家,但我只是和固定扭打一個類似的問題,我覺得這個問題至少應該謹慎的部分回答記錄。

我明白了,表單通過循環並呈現$ element數組而生成,並且它會計算出如何通過數組中的每個項的鍵將結果輸入與模式匹配。

因此,這裏立即看起來錯誤的是,模式設置了3種類型的數據來存儲:'brooklandsheading','value'和'format',所以我期望$元素數組具有定義文本字段的$ element ['brooklandsheading'],定義文本區域的$ element ['value']以及定義另一個文本字段的$ element ['format']。

(混淆的名字,順便說一下!我個人會避免使用「價值」和「格式」,以避免與[「#VALUE」]混亂和格式化)

什麼看起來像這是一個問題代碼是它將沒有['value']鍵的應該映射到['value']右邊的表單插入$ element。我無法看到表單如何知道將哪一列提供給它。

老實說,我不太清楚['#format']是怎麼回事,它看起來不正確,但我無法弄清楚它要做什麼。

因此,對於這個代碼,我會馬上建議與$element['value'] = array(' '#type' => 'textarea',

至於爲什麼$元素[「brooklandsheading」]不通過更換$text = array('#type' => 'textarea', ...,沒有跳出在代碼中錯誤的,所以我懷疑是這可能是因爲另一個小「疑難雜症」:改變hook__field_schema()模式後,你必須刪除所有領域的實例,然後從模塊禁用,然後完全卸載模塊 - >卸載選項卡,然後重新啓用該模塊並重新創建所有字段。爲了應用已更改的模式,Drupal需要從數據庫中刪除並重新創建表,並且Drupal不會這樣做,除非它確信它不會銷燬有價值的數據。