【问题标题】:Drupal 7 Field API hook_field_validate not receiving data?Drupal 7 Field API hook_field_validate没有收到数据?
【发布时间】:2011-08-02 15:54:54
【问题描述】:

我的模块实现了一系列字段 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'),
            ),
        ),
    );
}

【问题讨论】:

    标签: drupal-7


    【解决方案1】:

    我觉得这段代码有点混乱,而且我不是专家,但我刚刚解决并解决了一个类似的问题,我觉得这个问题至少值得谨慎地部分回答。

    我理解,表单是通过循环和渲染 $element 数组生成的,它通过数组中每个项目的键计算出如何将结果输入与模式匹配。

    所以,在这里我立即觉得不对的是,架构设置了 3 种类型的数据来存储:“brooklandsheading”、“值”和“格式”,所以我希望 $element 数组有 $element['brooklandsheading'] 定义文本字段, $element['value'] 定义文本区域, $element['format'] 定义另一个文本字段。

    (顺便说一下,名称容易混淆!我个人会避免使用 'value' 和 'format',以避免与 ['#value'] 和格式化程序混淆)

    这个代码看起来有一个问题,它把应该映射到 ['value'] 的表单插入到没有 ['value'] 键的 $element 上。我看不到表单如何知道将其输入到哪一列。

    老实说,我真的不知道 ['#format'] 发生了什么,它看起来不正确,但我不知道它想做什么。

    所以对于这段代码,我会立即建议将 $text = array( '#type' =&gt; 'textarea', ... 替换为 $element['value'] = array( ' '#type' =&gt; 'textarea',

    至于为什么 $element['brooklandsheading'] 没有通过,代码中没有什么错误的地方,所以我怀疑这可能是因为另一个小问题:在 hook__field_schema( ),您必须删除该字段的所有实例,然后禁用,然后从“模块”->“卸载”选项卡中完全卸载该模块,然后重新启用模块并重新创建所有字段。要应用更改的架构,Drupal 需要从您的数据库中删除并重新创建表,而 Drupal 不会这样做,除非它确定不会破坏有价值的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多