Drupal 8自定义字段//原始错误
我在节点编辑页面上看到文本字段和ckeditor字段,但是当我尝试保存节点时,我收到“该值应该是正确的原始类型”错误。Drupal 8自定义字段//原始错误
<?php
namespace Drupal\custom_field\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
/**
* Plugin implementation of the 'Program' field type.
*
* @FieldType(
* id = "program",
* label = @Translation("Programmation"),
* description = @Translation("Stores a Program n date string in various format"),
* default_widget = "program_default",
* default_formatter = "program_default",
*)
*/
class ProgramItem extends FieldItemBase implements FieldItemInterface {
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return array(
'columns' => array(
'date' => array(
'description' => 'Programmation du jour.(date)',
'type' => 'varchar',
'length' => 255,
'size' => 'normal',
),
'programmation' => array(
'description' => 'Programmation. (Concerts)',
'type' => 'varchar',
'length' => 5000,
'size' => 'normal',
),
),
);
}
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['date'] = DataDefinition::create('string')
->setLabel(t('Date du jour'));
$properties['programmation'] = DataDefinition::create('string')
->setLabel(t('Programmation du jour'));
return $properties;
}
public function isEmpty() {
$value = $this->get('date')->getValue();
return empty($value);
}
public static function mainPropertyName() {
return 'date';
}
}
<?php
namespace Drupal\custom_field\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Field\WidgetBaseInterface;
use Drupal\Core\Form\FormStateInterface;
/**
* Plugin implementation of the 'Program' widget.
*
* @FieldWidget(
* id = "program_default",
* label = @Translation("Programmation"),
* field_types = {
* "program"
* }
*)
*/
class ProgramWidget extends WidgetBase implements WidgetBaseInterface {
/**
* @param FieldItemListInterface $items
* @param int $delta
* @param array $element
* @param array $form
* @param FormStateInterface $form_state
* @return array
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element['date'] = array(
'#type' => 'textfield',
'#title' => $this->t('Date'),
'#placeholder' => $this->getSetting('placeholder_date'),
'#default_value' => isset($items[$delta]->date) ? $items[$delta]->date : NULL,
'#required' => $element['#required'],
);
$element['programmation'] = array(
'#type' => 'text_format',
'#title' => $this->t('Programmation'),
'#placeholder' => $this->getSetting('placeholder_programmation'),
'#default_value' => isset($items[$delta]->programmation) ? $items[$delta]->programmation : NULL,
'#format' => 'full_html',
);
$element['field_widget_display']['#access'] = true;
$element['field_widget_display_settings']['#access'] = true;
die('ProgramWidget');
return $element;
}
}
我看到我可以在WidgetBase中使用massageFormValues()方法,但我不知道如何使用它。
有一点帮助是值得欢迎的。
谢谢
finaly我添加到ProgramWidget:
/**
* {@inheritdoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
foreach ($values as &$value) {
if (count($value['programmation'])) {
$value['programmation'] = $value['programmation']['value'];
} else {
$value['programmation'] = $value['programmation'] !== '' ? $value['programmation'] : '0';
}
}
return $values;
}
}
而现在s工作
您试图设置一个varchar到5000字符的大小,但它仅允许255 你的错误:
'type' => 'varchar',
'length' => 5000, // change it to 255
'size' => 'normal' // delete this line
如果您需要5000字的使用TEXT类型,你不需要精确的“大小”属性,这只是对整数
感谢您的回答,但我有同样的错误:■ –
@FrankDrebin我编辑我的职务 – Fky
似乎因为
$element['programmation'] = array(
'#type' => 'text_format',
'#title' => $this->t('Programmation'),
'#placeholder' => $this->getSetting('placeholder_programmation'),
'#default_value' => isset($items[$delta]->programmation) ? $items[$delta]->programmation : NULL,
'#format' => 'full_html',
);
但我不知道如何覆盖方法massageFormValues ..?
添加paranthesis到条件'#default_value'=>(isset($ items [$ delta] - > programmation)?$ items [$ delta] - > programmation:NULL) – Fky
谢谢,它也适用于我 –