Создать пакет программно?


Я пытался решить эту проблему, позволяя пользователю динамически создавать формы запросов на проект (добавлять свои собственные поля, включая выпадающие списки, множественный выбор и т. Д.). Пользователю нужен способ создания нескольких типов запросов на проекты (возможно, пакетов?) для разных бизнес-подразделений. Я решил, что отношение сущность/пакет будет идеальным для этого. Итак, вот моя идея:

Используйте API схемы, чтобы определить мою базовую таблицу "проект". Используйте API сущности hook_entity_info(), чтобы сообщить Drupal о моей новой сущности, указав ее в таблице "проект". Теперь в этом крючке я могу определить связки - и это здорово. Но мне нужно, чтобы пользователь мог создать пакет. Где находится вызов entity_create_bundle($entity_type, $bundle)?

Пример:

ТИП сущности: Проект (с общими полями, определенными в БД, и он доступен для заполнения)

Пакет: ИТ-проект, HR-проект - которые имеют общие поля из проекта

Таблица project_type будет храните необходимую мне дополнительную группировку (запросы на проекты для бизнес-подразделений).

Теперь я читал разработку модуля Drupal 7, которая была замечательной, и в главе 6 они определяют сущность "художественное произведение", которая имеет пару пакетов, "скульптура" и "живопись". То, как они описывают шаги, выглядит так, как будто они создают интерфейс администратора для создания дополнительных типов иллюстраций, но это неправда (из того, что я могу сказать). После завершения главы я могу создавать только объекты типа "живопись". или "скульптура".

Как я могу разрешить пользователям создавать пакеты типа сущности "проект"?

Я что-то упускаю или функциональность отсутствует [еще]?

 7
Author: zanvidmar, 2012-02-24

3 answers

Изучение пакетов узлов по умолчанию

Модуль узла не создает пакеты "Статья" и "Базовая страница" самостоятельно. После некоторых поисков я нашел определения для этих пакетов в файле установки стандартного профиля установки.

/ профили/стандартные/стандартные.установить

  // Insert default pre-defined node types into the database. For a complete
  // list of available node type attributes, refer to the node type API
  // documentation at: http://api.drupal.org/api/HEAD/function/hook_node_info.
  $types = array(
    array(
      'type' => 'page',
      'name' => st('Basic page'),
      'base' => 'node_content',
      'description' => st("Use <em>basic pages</em> for your static content, such as an 'About us' page."),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
    array(
      'type' => 'article',
      'name' => st('Article'),
      'base' => 'node_content',
      'description' => st('Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
  );

  foreach ($types as $type) {
    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }

  // clear the site cache

Несколько замечаний об этом коде

  1. Он не использует API сущностей
  2. st() функция должна использоваться только во время Drupal процесс установки
  3. Узел содержит множество полей API, не относящихся к полю, которые он обрабатывает в node_type_save
  4. Узел вызывает field_attach_create_bundle, чтобы сообщить полевым модулям о новом пакете

Создание пакета с помощью API сущности

Я не уверен, как вы определили свои сущности, но если вы использовали API сущностей, то ваш код создания пакета может выглядеть примерно так:

$bundle = new stdClass();
$bundle->type = 'project_hr';
$bundle->label = t('HR Project');
$bundle->is_new = true;
$bundle->description = t("A super cool project");

$controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController
$controller->save($bundle);

Примечание о сущностях

  • Сущность тип - это абстрактный базовый класс
  • Пакет - это класс расширенного типа сущности
  • Поле - это член класса, свойство, переменная или экземпляр поля
  • Сущность - это объект или экземпляр базового или расширенного класса

Подробнее о сущностях

 15
Author: tmsimont, 2013-02-08 20:24:59

Я потратил довольно много времени, пытаясь понять это. Я работаю над проектом, основанным на модуле модели (https://drupal.org/project/model ). В моем сценарии установки я хотел создать пакеты. Пример кода для примера API сущности в ответе "Изучение пакетов узлов по умолчанию" близок, но не совсем верен (ну, это было не для меня).

Должен работать следующий фрагмент:

$bundles = field_info_bundles('project_type');

if (empty($bundles['project_hr'])) {
    $controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController

    $params = array();
    $params['type'] = 'project_hr';
    $params['label'] = t('HR Project');
    $params['is_new'] = TRUE;
    $params['description'] = t('A super cool project.');

    $bundle = $controller->create($params);
    $controller->save($bundle);
}

Field_info_bundles проверяет, существует ли пакет (поэтому вы не пытаетесь и создайте его дважды). Это позволяет получить информацию о пакетах, созданных для сущности project_type.

Если пакет не существует, то вы можете продолжить и создать пакет.

Сначала вы создаете контроллер, затем создаете массив параметров с параметрами для пакета, который вы хотите создать. Затем вы используете контроллер для создания объекта пакета (это создает объект PHP со всеми "стандартными" полями и методами сущности, а затем добавляет ваши параметры в объект. Затем вы используете контроллер для сохранения пакета. Эта последняя часть сохраняет пакет в базе данных.

Я надеюсь, что это поможет.

 3
Author: Damien Whaley, 2013-06-04 12:02:23

Я пытаюсь сделать что-то подобное, и похоже, что модуль узла уже содержит код, так как при создании нового типа контента он создает новый пакет для сущности узла и добавляет в него поле "тело" по умолчанию (используя API полей). Все эти операции и формы (таблица пакетов, набор пакетов и т. Д.) Выполняются вручную.

Благодаря разработчикам Drupal вы можете скопировать код, содержащийся в модуле Node.

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

 2
Author: zaycker, 2012-06-14 18:08:00