У кого-то еще есть проблемы с созданием пользовательских обработчиков для D8-объектов?

Я начинаю с Drupal 8 и до сих пор меня впечатлила вся новая функциональность. Тем не менее, я пытался написать свою собственную сущность, и у меня возникли проблемы:

Это определение сущности:

<?php

/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace Drupal\entitytest\Entity;

use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;

/**
 * Defines the Candidate Entity
 * 
 * @ingroup entitytest
 * 
 * @ContentEntityType(
 *    id="entitytest_AuditionCandidate",
 *    label=@Translation("Candidate"),
 *    base_table="candidate",
 *    
 *    handlers = {
 *     "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
 *     "list_builder" = "Drupal\entitytest\Entity\Controller\CandidateListBuilder",
 *     "form" = {
 *       "add" = "Drupal\Core\Entity\ContentEntityForm",
 *       "edit" = "Drupal\Core\Entity\ContentEntityForm",      
 *       "delete" = "Drupal\EntityTest\Form\CandidateDeleteForm",
 *        },   
 *    },
 *    admin_permission="administer candidates",
 *    entity_keys={
 *      "id"="id",
 *      "label"="lastname",   
 *   },
 *    links = {
 *     "canonical" = "/AuditionCandidate/view/{entitytest_AuditionCandidate}",
 *     "edit-form" = "/AuditionCandidate/edit/{entitytest_AuditionCandidate}",
 *   },
 * )
 */
class Candidate extends ContentEntityBase {
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['id'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('ID'))
      ->setDescription(t('The ID of the Contact entity.'))
      ->setReadOnly(TRUE);

     $fields['lastname'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Last Name'))
      ->setDescription(t('The name of the Contact entity.'))
      ->setSettings(array(
        'default_value' => '',
        'max_length' => 255,
        'text_processing' => 0,
      ))
      ->setDisplayOptions('view', array(
        'label' => 'above',
        'type' => 'string',
        'weight' => -6,
      ))
      ->setDisplayOptions('form', array(
        'type' => 'string',
        'weight' => -6,
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

     $fields['firstname'] = BaseFieldDefinition::create('string')
      ->setLabel(t('First Name'))
      ->setDescription(t('The name of the Contact entity.'))
      ->setSettings(array(
        'default_value' => '',
        'max_length' => 255,
        'text_processing' => 0,
      ))
      ->setDisplayOptions('view', array(
        'label' => 'above',
        'type' => 'string',
        'weight' => -6,
      ))
      ->setDisplayOptions('form', array(
        'type' => 'string',
        'weight' => -6,
      ))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

     return $fields;
  }
}

Поэтому я пытаюсь редактировать Deleteform из этой сущности. Я создал файл в /modules/custom/EntityTest/src/Form/CandidateFormDelete.php

Код в этом файле выглядит следующим образом:

<?php
namespace Drupal\EntityTest\Form;

use Drupal\Core\Entity\ContentEntityConfirmFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;

class CandidateDeleteForm extends ContentEntityConfirmFormBase {
  public function getQuestion() {
    return $this->t('Are you sure?');
  }

  public function getCancelUrl() {
    return new Url('entity.entitytest_AuditionCandidate.collection');
  }

  public function getConfirmText() {
    return $this->t('Delete');

  }
}

Я также добавил маршрут для формы удаления:

entity.entitytest_AuditionCandidate.delete_form:
    path: 'AuditionCandidate/delete/{entitytest_AuditionCandidate}'
    defaults:
        _entity_form: entitytest_AuditionCandidate.delete
        _title: 'Delete Candidate'
    requirements:
        _permission: 'administer candidates'

Но когда я пытаюсь открыть /AuditionCandidate/delete/1, я получаю следующее сообщение об ошибке:

Drupal \ Component \ Plugin \ Exception \ InvalidPluginDefinitionException: тип сущности "entitytest_AuditionCandidate" не определил класс формы "удалить". в Drupal\Core\Entity\EntityManager->getFormObject() (строка 309 из core/lib/Drupal/Core/Entity/EntityManager.php).

Это просто не имеет смысла, так как я определил класс для deleteform.

Кто-нибудь, кто может видеть, что мне не хватает? Возможно, это просто опечатка, но я уже давно смотрю на нее и не могу понять.

Мэтт.

1 ответ

Drupal 8 реализует стандарт PSR-4 для автозагрузки пространства имен PHP на основе пакетов. В этом случае имя вашего файла класса не соответствует имени фактического используемого класса. Имя файла также должно быть "CandidateDeleteForm.php" вместо "CandidateFormDelete"

Вот почему вы получаете это исключение. Подробнее об этом читайте по адресу: https://www.drupal.org/node/2156625

Другие вопросы по тегам