Порядок программного удаления / добавления полей и их экземпляров в друпал 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
- 5097 reads