2011-08-02 1 views
2

私のモジュールは、テキストフィールドとテキストエリアからなるカスタムフィールドタイプを提供するために、ある範囲のフィールドapi関数を実装しています。 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

をインストールしている私は、このコードは少し混乱を見つけると私は専門家だが、私はちょうどに取り組んし、修正しました同様の問題と私はこの質問が記録のための少なくとも慎重な部分的な答えに値すると思う。

私はそれを理解しています。フォームはループして$要素の配列をレンダリングして生成し、結果の入力を配列の各項目のキーでスキーマにマッチさせる方法を見つけ出します。

ここで私に間違っているのは、スキーマが 'brooklandsheading'、 'value'、 'format'の3種類のデータを設定しているためです。配列には、テキストフィールドを定義する$ element ['brooklandsheading']、テキスト領域を定義する$ element ['value']、別のテキストフィールドを定義する$ element ['format']があります。これで問題がどのように見えるか

(紛らわしい名前は、この方法で!個人的に私は、[「#VALUE」]との混同を避けるために、「値」と「形式」を使用して回避し、フォーマッタと思います)

コードは、['value']キーを使わずに['value']に$ elementにマッピングするべきフォームをスロットに入れていることです。どの列がどの列にそれを供給するかをフォームがどのように知るかは分かりません。

['#format']が正直言って何が起こっているのか本当に分かりませんが、正しくは見えませんが、何をしようとしているのか分かりません。

だから、このコードのために、私はすぐに$要素[「brooklandsheading」]は通過しない理由については$element['value'] = array(' '#type' => 'textarea',

$text = array('#type' => 'textarea', ...を交換することをお勧めしたい、何も私の疑いので、コードのように間違ってジャンプしませんそれは別の小さな 'つかみ'のためかもしれません:フィールドのすべてのインスタンスを削除するとを無効にして完全にアンインストールモジュールからのスキームを変更した後、 [アンインストール]タブをクリックし、モジュールを再度有効にしてすべてのフィールドを再作成します。変更されたスキーマを適用するには、データベースからテーブルを削除して再作成する必要があります。貴重なデータを破棄しない限り、Drupalはそれを実行しません。

関連する問題