knowledge-8.x-1.x-dev/src/Plugin/Field/FieldType/KnowledgeItem.php

src/Plugin/Field/FieldType/KnowledgeItem.php
<?php

namespace Drupal\knowledge\Plugin\Field\FieldType;

use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AnonymousUserSession;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\Url;
use Drupal\knowledge\Entity\KnowledgeType;
use Drupal\knowledge\KnowledgeInterface;

/**
 * Plugin implementation of the 'knowledge' field type.
 *
 * @FieldType(
 *   id = "knowledge",
 *   label = @Translation("Knowledges"),
 *   description = @Translation("This field manages configuration and presentation of knowledge on an entity."),
 *   list_class = "\Drupal\knowledge\KnowledgeFieldItemList",
 *   default_widget = "knowledge_default",
 *   default_formatter = "knowledge_default",
 *   cardinality = 1,
 * )
 */
class KnowledgeItem extends FieldItemBase implements KnowledgeItemInterface {

  /**
   * {@inheritdoc}
   */
  public static function defaultStorageSettings() {
    return [
      'knowledge_type' => '',
      'short_period' => '15',
      'medium_period' => '90',
      'long_period' => '365',
    ] + parent::defaultStorageSettings();
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultFieldSettings() {
    return [
      'per_page' => 50,
      'form_location' => KnowledgeItemInterface::FORM_BELOW,
      'anonymous' => KnowledgeInterface::ANONYMOUS_MAYNOT_CONTACT,
    ] + parent::defaultFieldSettings();
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['status'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Knowledge status'))
      ->setRequired(TRUE);

    $properties['kid'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Last knowledge ID'));

    $properties['last_knowledge_timestamp'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Last knowledge timestamp'))
      ->setDescription(new TranslatableMarkup('The time that the last knowledge was created.'));

    $properties['last_knowledge_uid'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Last knowledge user ID'));

    $properties['total_count'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Amount of knowledge'))
      ->setDescription(new TranslatableMarkup('The amount of knowledge.'));

    $properties['long_count'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Long knowledge count'))
      ->setDescription(new TranslatableMarkup('The amount of knowledge.'));

    $properties['medium_count'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Medium knowledge count'))
      ->setDescription(new TranslatableMarkup('The amount of knowledge.'));

    $properties['short_count'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Short knowledge count'))
      ->setDescription(new TranslatableMarkup('The amount of knowledge.'));

    $properties['total_citation'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Amount of citations'))
      ->setDescription(new TranslatableMarkup('The amount of citations.'));

    $properties['long_citation'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Long citation count'))
      ->setDescription(new TranslatableMarkup('The amount of citations.'));

    $properties['medium_citation'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Medium citation count'))
      ->setDescription(new TranslatableMarkup('The amount of citations.'));

    $properties['short_citation'] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('Short citation count'))
      ->setDescription(new TranslatableMarkup('The amount of citations.'));

    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    return [
      'columns' => [
        'status' => [
          'description' => 'Whether knowledge is allowed on this entity: 0 = no, 1 = closed (read only), 2 = open (read/write).',
          'type' => 'int',
          'default' => 0,
        ],
      ],
      'indexes' => [],
      'foreign keys' => [],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
    $element = [];

    $settings = $this->getSettings();

    $anonymous_user = new AnonymousUserSession();

    $element['per_page'] = [
      '#type' => 'number',
      '#title' => $this->t('Links per page'),
      '#default_value' => $settings['per_page'],
      '#required' => TRUE,
      '#min' => 1,
      '#max' => 1000,
    ];
    $element['anonymous'] = [
      '#type' => 'select',
      '#title' => $this->t('Anonymous linking'),
      '#default_value' => $settings['anonymous'],
      '#options' => [
        KnowledgeInterface::ANONYMOUS_MAYNOT_CONTACT => $this->t('Anonymous posters may not enter their contact information'),
        KnowledgeInterface::ANONYMOUS_MAY_CONTACT => $this->t('Anonymous posters may leave their contact information'),
        KnowledgeInterface::ANONYMOUS_MUST_CONTACT => $this->t('Anonymous posters must leave their contact information'),
      ],
      '#access' => $anonymous_user->hasPermission('post knowledge'),
    ];

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public static function mainPropertyName() {
    return 'status';
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    // There is always a value for this field, it is one of
    // KnowledgeItemInterface::OPEN, KnowledgeItemInterface::CLOSED or
    // KnowledgeItemInterface::HIDDEN.
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
    $element = [];

    // @todo Inject entity storage once typed-data supports container injection.
    //   See https://www.drupal.org/node/2053415 for more details.
    $knowledge_types = KnowledgeType::loadMultiple();
    $options = [];
    $entity_type = $this->getEntity()->getEntityTypeId();
    foreach ($knowledge_types as $knowledge_type) {
      if ($knowledge_type->getTargetEntityTypeId() == $entity_type) {
        $options[$knowledge_type->id()] = $knowledge_type->label();
      }
    }
    $element['knowledge_type'] = [
      '#type' => 'select',
      '#title' => $this->t('Knowledge type'),
      '#options' => $options,
      '#required' => TRUE,
      '#description' => $this->t('Select the Knowledge type to use for this knowledge field. Manage the knowledge types from the <a href=":url">administration overview page</a>.', [':url' => Url::fromRoute('entity.knowledge_type.collection')->toString()]),
      '#default_value' => $this->getSetting('knowledge_type'),
      '#disabled' => $has_data,
    ];

    $element['short_period'] = [
      '#type' => 'number',
      '#title' => $this->t('Short Frequency'),
      '#default_value' => $this->getSetting('short_period'),
    ];
    $element['medium_period'] = [
      '#type' => 'number',
      '#title' => $this->t('Medium Frequency'),
      '#default_value' => $this->getSetting('medium_period'),
    ];
    $element['long_period'] = [
      '#type' => 'number',
      '#title' => $this->t('Long Frequency'),
      '#default_value' => $this->getSetting('long_period'),
    ];

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
    $statuses = [
      KnowledgeItemInterface::HIDDEN,
      KnowledgeItemInterface::CLOSED,
      KnowledgeItemInterface::OPEN,
    ];
    return [
      'status' => $statuses[mt_rand(0, count($statuses) - 1)],
    ];
  }

}

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

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