Создать пакет программно?
Я пытался решить эту проблему, позволяя пользователю динамически создавать формы запросов на проект (добавлять свои собственные поля, включая выпадающие списки, множественный выбор и т. Д.). Пользователю нужен способ создания нескольких типов запросов на проекты (возможно, пакетов?) для разных бизнес-подразделений. Я решил, что отношение сущность/пакет будет идеальным для этого. Итак, вот моя идея:
Используйте API схемы, чтобы определить мою базовую таблицу "проект". Используйте API сущности hook_entity_info(), чтобы сообщить Drupal о моей новой сущности, указав ее в таблице "проект". Теперь в этом крючке я могу определить связки - и это здорово. Но мне нужно, чтобы пользователь мог создать пакет. Где находится вызов entity_create_bundle($entity_type, $bundle)?
Пример:
ТИП сущности: Проект (с общими полями, определенными в БД, и он доступен для заполнения)
Пакет: ИТ-проект, HR-проект - которые имеют общие поля из проекта
Таблица project_type будет храните необходимую мне дополнительную группировку (запросы на проекты для бизнес-подразделений).
Теперь я читал разработку модуля Drupal 7, которая была замечательной, и в главе 6 они определяют сущность "художественное произведение", которая имеет пару пакетов, "скульптура" и "живопись". То, как они описывают шаги, выглядит так, как будто они создают интерфейс администратора для создания дополнительных типов иллюстраций, но это неправда (из того, что я могу сказать). После завершения главы я могу создавать только объекты типа "живопись". или "скульптура".
Как я могу разрешить пользователям создавать пакеты типа сущности "проект"?
Я что-то упускаю или функциональность отсутствует [еще]?
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
Несколько замечаний об этом коде
- Он не использует API сущностей
-
st()
функция должна использоваться только во время Drupal процесс установки - Узел содержит множество полей API, не относящихся к полю, которые он обрабатывает в
node_type_save
- Узел вызывает
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);
Примечание о сущностях
- Сущность тип - это абстрактный базовый класс
- Пакет - это класс расширенного типа сущности
- Поле - это член класса, свойство, переменная или экземпляр поля
- Сущность - это объект или экземпляр базового или расширенного класса
Я потратил довольно много времени, пытаясь понять это. Я работаю над проектом, основанным на модуле модели (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 со всеми "стандартными" полями и методами сущности, а затем добавляет ваши параметры в объект. Затем вы используете контроллер для сохранения пакета. Эта последняя часть сохраняет пакет в базе данных.
Я надеюсь, что это поможет.
Я пытаюсь сделать что-то подобное, и похоже, что модуль узла уже содержит код, так как при создании нового типа контента он создает новый пакет для сущности узла и добавляет в него поле "тело" по умолчанию (используя API полей). Все эти операции и формы (таблица пакетов, набор пакетов и т. Д.) Выполняются вручную.
Благодаря разработчикам Drupal вы можете скопировать код, содержащийся в модуле Node.
Я думаю, что позже я смогу опубликовать свою работу как модуль drupal для визуального создания сущностей и его иерархии пакетов.