2016-12-01 76 views
0

我在节点编辑页面上看到文本字段和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()方法,但我不知道如何使用它。

有一点帮助是值得欢迎的。

谢谢

回答

1

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工作

+0

谢谢,它也适用于我 –

0

您试图设置一个varchar到5000字符的大小,但它仅允许255 你的错误:

'type' => 'varchar', 
    'length' => 5000, // change it to 255 
    'size' => 'normal' // delete this line 

如果您需要5000字的使用TEXT类型,你不需要精确的“大小”属性,这只是对整数

+0

感谢您的回答,但我有同样的错误:■ –

+0

@FrankDrebin我编辑我的职务 – Fky

0

似乎因为

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

+0

添加paranthesis到条件'#default_value'=>(isset($ items [$ delta] - > programmation)?$ items [$ delta] - > programmation:NULL) – Fky