2016-12-01 1 views
0

Je vois le champ de texte et le champ ckeditor sur la page d'édition du nœud, mais lorsque j'essaie de sauvegarder le nœud, je reçois "Cette valeur devrait être du type primitif correct."Champ personnalisé Drupal 8 // Erreur primitive

<?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; 
    } 

} 

je vis que je pouvais utiliser la méthode massageFormValues ​​() dans WidgetBase, mais je ne sais pas comment l'utiliser.

Un peu d'aide serait la bienvenue.

Merci

Répondre

1

i ajouter à 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; 

    } 

} 

Et maintenant il s travailler

+0

Merci, ça marche pour moi aussi –

0

Vous essayez de définir un varchar à 5000 la taille de caractères, mais il permet seulement 255 Votre erreur:

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

Si vous avez besoin 5000 l'utilisation de caractères type de texte, vous ne avez pas besoin à l'attribut « taille » précise, il est seulement pour entier

+0

Merci de votre réponse, mais j'ai la même erreur: s –

+0

@FrankDrebin i mon post édité – Fky

0

il semble à cause de

$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', 
    ); 

mais je ne sais pas comment remplacer la méthode massageFormValues ​​..?

+0

Ajouter à la condition parenthèse '#default_value' => (isset ($ items [$ delta] -> programmation)? $ items [$ delta] -> programmation: NULL) – Fky