Порядок программного удаления / добавления полей и их экземпляров в друпал 7 пример
Primary tabs
алгорит такой -
при создании поля и его экземпляра =
- сначала создаётся поле
- а только потом его экземпляр
при удалении =
- сначала удаляется экземпляр (при это вроде как потом и поле удалится автоматически в случае если этот экземпляр был последним)
- а только потом поле
но при каждой переустановке модуля мы будем получать новые строки в таблицах - проблема описана здесь
При попытке разместить , следующий ниже код в install/uninstall хуках возможно возникновение следующей проблемы.
здесь я приведу код как для install/uninstall enable/disable (выбирайте что нужно именно вам - помните про дублирование)
LL - имя моего модуля
log_ligh - сомописная фунция - для записи лога в текстовый файл (дедовский способ отладки не слишком грамотного программиста))
итак вот код (прокомментирован)=
function LL_install()
{
watchdog("LL=","LL_install() section !");
$fieldname='field_88';// имя поля
drupal_set_message(t('LL_install() section !'), 'error');
if (!($field = field_info_field($fieldname))) // если информации о таком поле как об установленном нет - то добавим его
{
watchdog("LL=","field install section !");
log_ligh(" create filed section !");
log_ligh(" create filed section !");
$field = array(
"field_name"=>$fieldname, // имя поля
"type"=>"node_reference",// его тип (спасибо модулю references)
'cardinality' => 1,
'settings' => array(),
'entity_types' => array('user', 'node'), // видимо сущности к которым можно будет привязывать экземпляры поля
);
field_create_field($field); // создаем поле
log_ligh(" new field !");
watchdog("LL="," filed is created !");// добавим запись в системный журнал
}
// работаем с экземпляром поля
if (!($field = field_info_instance('node',$fieldname,'article'))) //если экземлпяр поля не
//известен как "установленный" - создадим его
{
log_ligh(" create filed instance section !");
$instance = array(
"field_name"=>$fieldname,
'entity_type' => 'node', // указываем сущность к которой будет относится экземляр поля
"label"=>t("Cool"),
'bundle' => 'article',// выбираем привязку к "статье"
"type"=>"node_reference",
"widget"=>array(
"type"=>"options_select"
),
);
field_create_instance($instance); //создаём экземпляр этого поля и привязываем его к типу "статья"
}
log_ligh("INSTALLation waS COMPLETED ") ;
}
function LL_uninstall()
{
drupal_set_message(t('LL_uninstall() section !'));
watchdog("LL=","LL_uninstall() section !");
$fieldname='field_88';// имя поля
if ($field = field_info_instance('node',$fieldname,'article')) // если поле существует - удалим его
{
log_light(" delete filed instance !");
field_delete_instance($field);
watchdog("LL=","delete filed instance !");
log_light(" filed is deleted !");
}
if ($field = field_info_field($fieldname)) //
{
log_light(" deleting field section !");
watchdog("LL=","deletion field is completed !");
field_delete_field($field);
log_light(" deletion field is completed !");
watchdog("LL=","filed is deleted !");
}
}
function LL_enable() // работает при включении модуля - каждый раз
{
watchdog("LL=","LL_install() section !");
$fieldname='field_88';// имя поля
drupal_set_message(t('LL_install() section !'));
if (!($field = field_info_field($fieldname))) // если информации о таком поле как об установленном нет - то добавим его
{
watchdog("LL=","field install section !");
log_ligh(" create filed section !");
log_ligh(" create filed section !");
$field = array(
"field_name"=>$fieldname, // имя поля
"type"=>"node_reference",// его тип (спасибо модулю references)
'cardinality' => 1,
'settings' => array(),
'entity_types' => array('user', 'node'), // видимо сущности к которым можно будет привязывать экземпляры поля
);
field_create_field($field); // создаем поле
log_ligh(" new field !");
watchdog("LL="," filed is created !");// добавим запись в системный журнал
}
// работаем с экземпляром поля
if (!($field = field_info_instance('node',$fieldname,'article'))) //если экземлпяр поля не
//известен как "установленный" - создадим его
{
log_ligh(" create filed instance section !");
$instance = array(
"field_name"=>$fieldname,
'entity_type' => 'node', // указываем сущность к которой будет относится экземляр поля
"label"=>t("Cool"),
'bundle' => 'article',// выбираем привязку к "статье"
"type"=>"node_reference",
"widget"=>array(
"type"=>"options_select"
),
);
field_create_instance($instance); //создаём экземпляр этого поля и привязываем его к типу "статья"
}
log_ligh("INSTALLation waS COMPLETED ") ;
}
function LL_disable() // работает при выключении модуля - каждый раз.
{
drupal_set_message(t('LL_uninstall() section !'));
watchdog("LL=","LL_uninstall() section !");
$fieldname='field_88';// имя поля
if ($field = field_info_instance('node',$fieldname,'article')) // если поле существует - удалим его
{
log_light(" delete filed instance !");
field_delete_instance($field);
watchdog("LL=","delete filed instance !");
log_light(" filed is deleted !");
}
if ($field = field_info_field($fieldname)) //
{
log_light(" deleting field section !");
watchdog("LL=","deletion field is completed !");
field_delete_field($field);
log_light(" deletion field is completed !");
watchdog("LL=","filed is deleted !");
}
}
- drudev's blog
- Log in to post comments
- 5285 reads