Drupal 8 自定义字段 // 原始错误

Drupal 8 Custom Field // Primitive error

我在节点编辑页面上看到文本字段和 ckeditor 字段,但是当我尝试保存节点时收到 "This value should be of the correct primitive type. " 错误。

    <?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()方法,但是不知道怎么用

欢迎提供一点帮助。

谢谢

好像是因为

 $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 ..?

最后我添加到 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;

  }

}

现在可以使用了