【问题标题】:Drupal 8 Custom Field // Primitive errorDrupal 8 自定义字段 // 原始错误
【发布时间】:2016-12-01 15:09:18
【问题描述】:

我在节点编辑页面上看到文本字段和 ckeditor 字段,但是当我尝试保存节点时,我收到“这个值应该是正确的原始类型。”错误。

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

欢迎提供一点帮助。

谢谢

【问题讨论】:

    标签: php drupal drupal-modules drupal-8


    【解决方案1】:

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

    现在它开始工作了

    【讨论】:

      【解决方案2】:

      似乎是因为

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

      【讨论】:

      • 将括号添加到条件'#default_value' => (isset($items[$delta]->programmation) ? $items[$delta]->programmation : NULL)
      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多