Создание настраиваемого поля /виджета

Я пытаюсь создать поле, которое является комбинацией двух полей. Первое поле должно ссылаться на другую сущность (так же, как в модуле entityreference). Второе поле - это просто текстовое поле (с помощью виджета textarea).

Вот код, который у меня есть.

sample.install:

function sample_field_schema($field) {
    $schema = array(
        'columns' => array(
            'place_id' => array(
                'type' => 'int',
                'unsigned' => true,
                'not null' => true
            ),
            'quote' => array(
                'type' => 'text',
                'size' => 'big',
                'not null' => false
            )
        ),
        'indexes' => array(
            'place_id' => array('place_id')
        ),
        'foreign keys' => array()
    );

    $entity_type = 'place';
    $bundles = field_info_bundles('node');
    if (!empty($bundles['place'])) {
        $schema['foreign keys']['place'] = array(
            'table' => 'place',
            'columns' => array('place_id' => 'nid')
        );
    }

    return $schema;
}

sample.module:

function sample_field_info() {
    return array(
        'sample_field' => array(
            'label' => t('Label'),
            'description' => t('description.'),
            'default_widget' => 'sample_field_widget',
            'default_formatter' => 'sample_field_formatter',
            'settings' => array(),
            'instance_settings' => array(),
        )
    );
}

function sample_field_formatter_info() {
    return array(
        'sample_field_formatter' => array(
            'label' => t('sample formatter'),
            'field types' => array('sample_field')
        )
    );
}

function sample_field_formatter_view($entity_type, $entity, $field, $instance, $lang, $items, $display) {
    $element = array();

    switch ($display['type']) {
        case 'sample_field_formatter':
            // I'm not really familiar with these bits ... this is just to output *something*
            $element[]['#markup'] = var_export($items, true);
            break;
    }

    return $element;
}

function sample_field_widget_form(&$form, &$form_state, $field, $instance, $lang, $items, $delta, $element) {
    switch ($instance['widget']['type']) {
        case 'sample_field_widget':
            $element['place_id'] = array(
                '#type' => 'textfield',
                '#maxlength' => 1024,
                '#title' => t('Place'),
                '#default_value' => isset($items[$delta]['place_id']) ? $items[$delta]['place_id'] : null,
                '#required' => $element['#required'],
                '#weight' => (int)$element['#weight'],
                '#delta' => $delta,
                '#size' => 'big',
                '#autocomplete_path' => 'api/find/places'
            );

            $element['quote'] = array(
                '#type' => 'textarea',
                '#title' => t('Quote'),
                            '#default_value' => isset($items[$delta]['quote']) ? $items[$delta]['quote'] : null,
            );
            break;
    }

    return $element;
}

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

function sample_field_is_empty($item, $field) {
    if (empty($item['sample_field'])) {
        return true;
    }
}

function sample_field_widget_info() {
    return array(
        'sample_field_widget' => array(
            'label' => t('Sample Field Widget'),
            'field types' => array('sample_field'),
            'settings' => array(),
            'behaviors' => array(
                'default value' => FIELD_BEHAVIOR_NONE
            )
        )
    );
}

Итак, все это дает мне новый тип поля и новый виджет для этого поля. Когда я редактирую /создаю новый контент с этим типом поля, виджет правильно отображается с обоими полями, но когда я отправляю для вставки /обновления контента, поля не сохраняются. Как получить форму для сохранения данных поля для этого настраиваемого поля и как я могу получить эти данные для повторной загрузки при редактировании содержимого?

2 голоса | спросил gregghz 27 J0000006Europe/Moscow 2012, 01:02:42

2 ответа


0

Это был мой hook_field_is_empty() . Он возвращал истину в тех случаях, когда этого не должно было быть. Просто убедитесь, что hook_field_is_empty() правильно проверяет наличие пустых значений.

ответил gregghz 27 J0000006Europe/Moscow 2012, 02:49:57
0

Вам не хватает hook_field_validate (), который, очевидно, необходим для того, чтобы это работало. Посмотрите этот пост в блоге (который вы, возможно, уже сделали - я просто сравниваю то, что он сделал с вашим кодом) ... http://www.agileapproach.com/blog-entry/compound-fields-drupal-7

ответил tenken 27 J0000006Europe/Moscow 2012, 02:37:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132