Puncte:1

Vreau să creez un modul personalizat de câmp de taxonomie

drapel es

Ce vreau sa fac

Vreau să realizez acest lucru pe Drupal9.

  • În cele din urmă, vreau să creez câmpul personalizat pe un formular web.
  • Cu acest câmp personalizat, Emitentul care utilizează formularul web poate adăuga un nou termen de taxonomie la un vocabular (Acest vacabular este predeterminat în modul) pe acest formular web.
  • Acest câmp este câmp text.
  • Dacă noul termen iese deja în vocabular, acesta nu este adăugat la vocabular.
  • Dacă este posibil, solicitantul poate alege și un termen dintre termenii care sunt deja înregistrate.

Problemă

Încerc un câmp personalizat care poate înregistra un termen într-un tip de conținut. (Nu pot adăuga un câmp personalizat la formularul web. Deci, l-am încercat mai întâi.) L-am creat deja provizoriu. Cu toate acestea, dacă scriu ceva în acest câmp, apare un avertisment.

Avertisment: Conversie matrice în șir în Drupal\mymodule2\Plugin\Field\FieldType\MyModule2Field->isEmpty() (linia 62 din modules/custom/mymodule2/src/Plugin/Field/FieldType/MyModule2Field.php).

MyModule2 este modulul personalizat pe care l-am creat.

Așa că vreau să știu cum să creez un câmp personalizat care poate înregistra un termen în mod corespunzător.

Cod și Structura folderelor

mymodule2(dosar) -mymodule2.info.yml

-mymodule2.modul

-src(dosar)/Plugin(dosar)/Câmp(dosar)

Câmp(folder)-FieldType(folder)-MyModule2Field.php

Câmp(dosar)-FieldWidget(dosar)-MyModule2Widget.php

Câmp(dosar)-FieldFormatter(dosar)-MyModule2Formatter.php

Codurile

mymodule2.info.yml

nume: mymodule2
tip: modul
descriere: hogehoge
cerinta_versiune_core: ^8.8 || ^9
pachet: Exemplu

mymodule2.modul

<?php ?>

MyModule2Field.php

    <?php 
namespace Drupal\mymodule2\Plugin\Field\FieldType;

use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\taxonomy\Entity\Term;      
use Drupal\Core\Link;
use Drupal\Core\Url;
/**
 * Plugin implementation of the 'MyModule2' field type.
 *
 * @FieldType(
 *   id = "mymodule2",
 *   label = @Translation("MyModule"),
 *   description = @Translation("This field is used to store alpha-numeric values."),
 *   default_widget = "MyModule2Widget",
 *   default_formatter = "MyModule2Formatter"
 * )
 */
class MyModule2Field extends FieldItemBase {
 
 /**
  * {@inheritdoc}
  */
  
  public static function propertyDefinitions(FieldStorageDefinitionInterface $definition) {
    // Prevent early t() calls by using the TranslatableMarkup.
    $properties['mymodule2'] = DataDefinition::create('string')
    ->setLabel(new TranslatableMarkup('Text value'));
 
    return $properties;
  }
 
  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $definition) {
    $schema = [
        'columns' => [
          'mymodule2' => [
            'type' => 'varchar',
            'length' => 255,
          ],
        ],
    ];
    
    
    
    return $schema;
  }
 
  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    $value = $this->getValue();
    if (isset($value['mymodule2']) && $value['mymodule2'] != '') {
      
      /*this is problem code*/
      $val=implode("",$value);
      $arr = explode(',',$val);
      $categories_vocabulary='pixelarttag';
      foreach($arr as $a){
        $term = term::create(array(
        'parent' => array(),
        'name' => $a,
        'vid' => $categories_vocabulary,))->save();
      }
      return FALSE;
    }
    return TRUE;
  }
 
}
?>

MyModule2Widget.php

<?php 
namespace Drupal\mymodule2\Plugin\Field\FieldWidget;
 
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
 
/**
 * Plugin implementation of the 'MyModule2Widget' widget.
 *
 * @FieldWidget(
 *   id = "MyModule2Widget",
 *   label = @Translation("My Field widget"),
 *   field_types = {
 *     "mymodule2"
 *   }
 * )
 */
class MyModule2Widget extends WidgetBase {
 
 /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
   
    $element['mymodule2'] =  [
      '#type' => 'textfield',
      '#title' => 'AddictionTaxonomy',
      '#description' => 'Custom field to be used for alpha-numeric values',
      '#default_value' => isset($items[$delta]->title) ? $items[$delta]->title : NULL,
      '#weight' => 0,
    ];
 
    return $element;
  }
 
}
?>

MyModule2Formatter.php

<?php
namespace Drupal\mymodule2\Plugin\Field\FieldFormatter;
 
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Field\FieldItemListInterface;
 
/**
 * Plugin implementation of the 'MyModule2Formatter' formatter.
 *
 * @FieldFormatter(
 *   id = "MyModule2Formatter",
 *   label = @Translation("My Field Formatter"),
 *   field_types = {
 *     "mymodule2"
 *   }
 * )
 */
class MyModule2Formatter extends FormatterBase {
 
 /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      // Implement default settings.
    ] + parent::defaultSettings();
  }
 
  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $summary = [];
    $summary[] = $this->t('Displays the random string.');
    return $summary;
  }
 
  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
 
    $elements = [];
    foreach ($items as $delta => $item) {
      $elements[$delta] = [
        '#type' => 'markup',
        '#markup' => $item->mymodule2
      ];
    }
 
    return $elements;
  }
}
?>

P.S.

Nu mă pricep la engleză și, de asemenea, nu știu prea multe despre Drupal. Am studiat Drupal de acum 1 lună. Așadar, aș putea întreba ceva prostesc. Vă rog să mă iertați

Cu sinceritate

apaderno avatar
drapel us
Bun venit la Drupal Answers! Dacă `$value` conține o matrice, `$val = implode("", $value);` va provoca acel avertisment. Din păcate, o întrebare care întreabă de ce codul scris de utilizatori provoacă un avertisment PHP și cum să-l evităm este în afara subiectului pentru noi, mai ales când codul care provoacă avertismentul nu folosește nicio funcție/metodă Drupal, deoarece aceasta nu este o întrebare la care trebuie să se răspundă cunoștințele Drupal.
yohei shibasaki avatar
drapel es
Mulțumesc și scuze că ai pus întrebarea în locul greșit. O să pun aceeași întrebare în locul corect.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.