Может ли один функциональный модуль вносить дополнения в другой функциональный модуль?
Я хотел бы иметь два функциональных модуля для включения пользователями. Один базовый и один продвинутый. Например, базовая функция создает тип контента блога, содержащий только поля заголовка и текста. Расширенный модуль, после включения, добавляет дополнительные поля к этому исходному типу контента, такие как теги или поле изображения. Возможно ли это или одно будет переопределять другое? Или мой сайт взорвется? или?
2 answers
Это определенно возможно, вчера мне пришлось сделать нечто подобное, и я рад сказать, что функции могут справиться с этим идеально.
Хитрость в том, что ваша "расширенная" функция вообще не будет содержать тип контента, а просто список дополнительных полей, прикрепленных к типу контента, определяемому исходным правилом.
Когда вы установите/включите второй функциональный модуль, дополнительные поля будут добавлены к существующему типу контента как по волшебству. Я был приятно удивлен удивлен тем, как хорошо это работает.
Есть пример хорошо зарекомендовавшего себя дистрибутива Drupal, использующего тот же метод (если честно, у меня возникла идея); OpenPublish содержит функцию openpublish_article
, которая определяет тип контента, и функцию openpublish_atricle_extra_media
, единственная задача которой - добавить пару дополнительных полей в статью.
Просто в качестве примечания, вероятно, было бы неплохо сделать ваш основной функциональный модуль зависимым от второго, поэтому тип контента определенно определяется временем, когда вторая функция пытается добавить к ней дополнительные поля.
Вы можете легко сделать это с помощью hook_form_alter
function hook_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
if($form_id == 'YOUR_FORM_ID') {
// Write your code here with conditions.
global $user;
if($user->role == 'somerole') {
// Here You can add form fields whatever you want for somerole.
}
else {
// Here You can add form fields whatever you want for other roles.
}
}
}
Но для полей, которые вы хотите добавить для определенной роли, поле не должно быть обязательным.