trinion_tp-1.0.x-dev/src/Plugin/Field/FieldWidget/OtgruzkaFieldWidget.php

src/Plugin/Field/FieldWidget/OtgruzkaFieldWidget.php
<?php

namespace Drupal\trinion_tp\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;

/**
 * Виджет для отображения элементов отгрузки
 *
 * @FieldWidget(
 *   id = "trinion_tp_otgruzka_field_widget",
 *   label = "Строки отгрузки",
 *   field_types = {"entity_reference"},
 * )
 */
class OtgruzkaFieldWidget extends WidgetBase {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $stroka_uit = $items[$delta]->entity;
    $vals = $form_state->get('vals');
    if ($stroka_uit) {
      if (($stroka_uit_tovar = $items[$delta]->entity->get('field_tp_tovar')->first()) && isset($stroka_uit_tovar->entity)) {
        $stroka_uit_tovar_name = $stroka_uit_tovar->entity->label() . ' [' . $stroka_uit_tovar->entity->get('field_tp_artikul')->getString() . ']';
        $harakteristiki = \Drupal::service('trinion_tp.helper')->getHarakteristikiTovara($stroka_uit_tovar->entity);
        $harakteristika = $items[$delta]->entity->get('field_tp_kharakteristika_tovara')->getString();
      }
      else
        $stroka_uit_tovar_name = $stroka_uit->label();
    }

    $element['uit'] = [
      '#type' => 'textfield',
      '#autocomplete_route_name' => 'trinion_tp.tovar.autocomplete',
      '#title' => 'Товар',
      '#attributes' => ['class' => ['uit']],
      '#default_value' => $stroka_uit_tovar_name ?? '',
      '#size' => '255',
    ];
    if (\Drupal::config('trinion_tp.settings')->get('harakteristiki')) {
      $element['harakteristika'] = [
        '#type' => 'select',
        '#title' => t('Сharacteristics'),
        '#options' => $harakteristiki ?? [],
        '#attributes' => ['class' => ['harakteristika']],
        '#default_value' => $harakteristika ?? '',
        '#validated' => TRUE,
      ];
    }
    $element['kolichestvo'] = [
      '#type' => 'number',
      '#title' => 'Кол-во',
      '#attributes' => ['class' => ['kolichestvo']],
      '#step' => '0.01',
      '#default_value' => $stroka_uit ? $stroka_uit->get('field_tp_kolichestvo')->getString() : '',
    ];
    $element['opisanie'] = [
      '#type' => 'textarea',
      '#default_value' => $stroka_uit ? $stroka_uit->get('field_tp_opisanie')->getString() : '',
      '#rows' => 2,
    ];
    foreach (\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree('edinicy_izmereniya') as $term)
      $opts[$term->tid] = $term->name;
    $element['edinica_izmereniya'] = [
      '#type' => 'select',
      '#title' => 'Ед. изм. просл.',
      '#options' => $opts,
      '#attributes' => ['class' => ['edinica_izmereniya']],
      '#default_value' => $stroka_uit ? $stroka_uit->get('field_tp_ed_izmereniya_prosl')->getString() : key($opts),
    ];
    $element['reg_nomer'] = [
      '#type' => 'textfield',
      '#title' => 'Рег. ном. просл.',
      '#attributes' => ['class' => ['reg_nomer']],
      '#step' => '0.01',
      '#default_value' => $stroka_uit ? $stroka_uit->get('field_tp_upd_reg_nomer')->getString() : '',
    ];
    $element['kolichestvo_proslezh'] = [
      '#type' => 'textfield',
      '#title' => 'Кол-во просл. тов.',
      '#attributes' => ['class' => ['kolichestvo_proslezh']],
      '#step' => '0.01',
      '#default_value' => $stroka_uit ? $stroka_uit->get('field_tp_kolichestvo_proslezh')->getString() : '',
    ];
    $element['id'] = [
      '#type' => 'hidden',
      '#value' => is_object($stroka_uit) ? $stroka_uit->id() : ($vals[$delta]['target_id'] ?? ''),
    ];

    return $element;
  }

  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    static $vals = [];
    if ($vals)
      return $vals;
    if ($form_state->getErrors())
      return;
    else {
      $vals = [];
      foreach ($values as $item) {
        if (empty($item['kolichestvo']) || empty($item['uit']))
          continue;
        if (empty($item['id'])) {
          $data = [
            'type' => 'tp_stroka_dokumenta_uit',
            'title' => $item['uit'],
            'uid' => \Drupal::currentUser()->id(),
            'status' => 1,
            'field_tp_kolichestvo' => $item['kolichestvo'],
            'field_tp_ed_izmereniya_prosl' => $item['edinica_izmereniya'] == '' ? NULL : $item['edinica_izmereniya'],
            'field_tp_upd_reg_nomer' => $item['reg_nomer'],
            'field_tp_kolichestvo_proslezh' => $item['kolichestvo_proslezh'],
            'field_tp_opisanie' => $item['opisanie'],
          ];
          if (!empty($item['harakteristika']))
            $data['field_tp_kharakteristika_tovara'] = $item['harakteristika'];
          if ($tovar = \Drupal::service('trinion_tp.helper')->tovarfromAutocomleteString($item['uit'])) {
            $data['field_tp_tovar'] = $tovar->id();
            $data['field_tp_artikul'] = $tovar->get('field_tp_artikul')->getString();
          }
          $stroka_uit = Node::create($data);
          $stroka_uit->save();
          $vals[] = ['target_id' => $stroka_uit->id()];
        }
        else {
          $tovar = \Drupal::service('trinion_tp.helper')->tovarfromAutocomleteString($item['uit']);
          $stroka_uit = Node::load($item['id']);
          $stroka_uit->field_tp_kolichestvo = $item['kolichestvo'];
          $stroka_uit->field_tp_ed_izmereniya_prosl = $item['edinica_izmereniya'] == '' ? NULL : $item['edinica_izmereniya'];
          $stroka_uit->field_tp_upd_reg_nomer = $item['reg_nomer'];
          $stroka_uit->field_tp_kolichestvo_proslezh = $item['kolichestvo_proslezh'];
          $stroka_uit->field_tp_opisanie = $item['opisanie'];
          $stroka_uit->field_tp_kharakteristika_tovara = !empty($item['harakteristika']) ? $item['harakteristika'] : NULL;
          $stroka_uit->title = $item['uit'];
          if ($tovar) {
            $stroka_uit->field_tp_tovar = $tovar->id();
            $stroka_uit->field_tp_artikul = $tovar->get('field_tp_artikul')->getString();
            $stroka_uit->title = $tovar->label();
          }
          $stroka_uit->save();
          $vals[] = ['target_id' => $stroka_uit->id()];
        }
      }
    }

    $form_state->set('vals', $vals);
    return $vals;
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc