Как создать пользовательский класс сущностей ECK (для каждого пакета) [закрыто]


С помощью ECK я создал транспортное средство типа сущности и добавил 2 связки, Легковые и грузовые автомобили

Цель состоит в том, чтобы иметь класс Car, чтобы я мог использовать Car::create() и аналогичные функции сущностей, а также реализовывать свои собственные функции.

Насколько я понял, это создание класса Vehicle, и он работает, но я борюсь с пакетами.

 1
Author: Trupal, 2016-06-15

1 answers

Я думаю, что невозможно делать то, что ты хочешь. Пакет не является подклассом сущности, как вы, кажется, предполагаете.

Классы всегда определяются в коде и всегда предоставляются модулем. ECK использует обходной путь, но на самом деле определяет только один тип сущности: EckEntity, затем он выполняет некоторые трюки, чтобы позволить Drupal видеть это как разные типы сущностей.

Создание объектов для каждого пакета динамически (поскольку пользователь может добавлять/удалять пакеты) было бы сложным и кажется, это возможно только с помощью таких грязных трюков, как этот:

// With a property
$myclassname = "anewclassname";
$myproperty = "newproperty";
eval("class {$myclassname} { protected \${$myproperty}; }";

От: https://stackoverflow.com/a/15579465/1293725

Я почти уверен, что Drupal не поддерживает это (к счастью).

Пакеты хранятся как свойства сущности, часто (всегда?) Как свойство type, посмотрите на этот пример:

// Create node object with attached file.
$node = Node::create([
  'type'        => 'article', // < - this is the bundle
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
    'alt' => 'Hello world',
    'title' => 'Goodbye world'
  ],
]);
$node->save();

От: https://drupal.stackexchange.com/a/189095/9921

Итак, в вашем случае вам нужно будет сделать следующее:

$car = Vehicle::create([
  'type'        => 'car',
   ...
]);

Или определите новый класс для своих пакетов, но вам нужно будет либо использовать метод eval выше, чтобы создать класс для всех ваших пакетов, либо определить их в коде и потерять гибкость. Затем в этом классе расширьте класс транспортного средства и в конструкторе укажите type или что-то в этом роде. Для удобства чтения вашего кода, я думаю, было бы лучше просто следовать соглашениям и не создавать классы для пакетов.

 2
Author: Neograph734, 2017-05-23 12:41:25