如何以编程方式设置时间类型字段?


8

我创建一个自定义内容实体类型。

我希望活动时间一个字段。

由于没有时间字段,而是dataTime_type,所以我为自定义字段创建了一个插件:

FieldType:TimeItem.php

/**
 * Plugin implementation of the 'time' field type.
 *
 * @FieldType(
 *   id = "time",
 *   label = @Translation("Time Field"),
 *   description = @Translation("Permet la creation d'un champ de type time"),
 *   default_widget = "time_widget",
 *   default_formatter = "time_formatter"
 * )
 */

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    return array(
        'columns' => array(
            'value' => array(
                'description' => 'The time value.',
                'type' => 'int',
                'length' => 6,
            ),
        ),

    );
  }

我尝试将类型更改为时间(对于mysql),但mysql错误返回给我该类型的null。所以我用int表示存储时间。

FieldWidget:TimeWIdget.php

/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';
$element += array(
'#type' => 'time', //HTML5 input
'#default_value' => $value,
'#size' => 4,
'#element_validate' => array(
array($this, 'validate'),
),
);

return $element;
}

我的实体:

 $fields['heure_evenement'] = BaseFieldDefinition::create('time')
        ->setLabel(t('test'))
        ->setDescription(t('test'))
        ->setRequired(TRUE)
        ->setDefaultValue('')
        ->setDisplayOptions('view', array(
            'label' => 'above',
            'type' => 'string',
            'weight' => 3,
        ))
        ->setDisplayOptions('form', array(
            'weight' => 3,
        ))
        ->setDisplayConfigurable('form', TRUE)
        ->setDisplayConfigurable('view', TRUE);

除了一件事,HTML5输入类型的时间全部正常

Drupal知道html5中的一些输入,但不是全部...输入tel,电子邮件,数字,范围,颜色,日期,日期时间是可以的,但不能单独输入时间。

所以我希望通过自定义插件来获得它,但是没有...

编辑1

我发现的唯一方法是为此类型创建2 select:

public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';

    //heure
    for($i=0;$i<=24;$i++){
        $hour[]=$i;
    }

    //minutes
    for($i=0;$i<=59;$i++){
        $minutes[]=$i;
    }


$element += array('hour'=>array(
    '#title'=>t('Hour'),
    '#type' => 'select',
    '#options'=>$hour,
    '#default_value' => $value,
    '#element_validate' => array(
    array($this, 'validate'),
    ),
)
);

    $element += array('minutes'=>array(
        '#title'=>t('Minutes'),
        '#type' => 'select',
        '#options'=>$minutes,
        '#default_value' => $value,
        '#element_validate' => array(
            array($this, 'validate'),
        ),
    )
    );


return $element;
}

有什么想法吗?


我需要这样的字段类型,可以在github或其他地方共享代码吗?
Adrian Cid Almaguer

Answers:


12

表单元素属性#type是指元素类型,而不是HTML元素。可以定义自己的元素类型(或主题类型),并且可以为其提供自己的标记。这可以通过实现RenderElement插件来完成。

更新:

您还可以使用datetimerender元素并禁用日期部分。

$element['#date_date_element'] = 'none';

更新2:

评论形式具有使用该渲染阵列的示例datetime类型。因此,作为指导原则,

  $form['time_without_date'] = array(
    '#type' => 'datetime',
    '#title' => $this->t('Time without date'),
    // HTML 5 time element format can be H:i
    '#default_value' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '1970-01-01 20:00', 'UTC'),
    '#size' => 20,
    '#date_date_element' => 'none',
    // This sets html 5 time element use explicitly, probably not necessary.
    '#date_time_element' => 'time',
  );

2
我还记得有关datetime元素的一些信息。您应该能够设置none日期部分,而只获取时间部分。
mradcliffe

@mradcliffe您能为这个新手提供详细的说明吗?如果我能够使它正常工作,我会毫不犹豫地给您赏金!谢谢!
克里斯·

你有什么特别的坚持吗?在注释中张贴代码可能很困难,但是我要确保在表单数组中设置了适当的元素属性(带有'#'的键)。我将用api.drupal.org中的一些示例来更新答案。
mradcliffe

1
他在这里创建了另一个问题:drupal.stackexchange.com/questions/227029/…,因为他的问题更特定于字段小部件而不是表单API元素。
mradcliffe

1
@AdrianCidAlmaguer是的,我在这里共享了代码。我会考虑将其转换为Github。希望能帮助到你!
克里斯·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.