Crie um novo tipo de conteúdo em hook_install


11

Alguém pode me mostrar um exemplo adequado de como criar um novo tipo de conteúdo no método hook_install de um módulo ?

Eu também gostaria de saber se / o que devo fazer durante o hook_uninstall para limpar minha bagunça; Eu li que há algum debate sobre simplesmente remover o conteúdo.

Não consegui encontrar um exemplo do método adequado para realizar esta tarefa; qualquer ajuda seria apreciada!

Respostas:


7

Para responder exatamente às suas perguntas:

Criando um tipo de conteúdo na instalação do gancho : Você usa node_type_save () para criar o tipo de conteúdo, aqui está um exemplo de webform.install:

  // Create the default webform type.
  $webform_type = array(
    'type' => 'webform',
    'name' => st('Webform'),
    'base' => 'node_content',
    'description' => st('Create a new form or questionnaire accessible to users. Submission results and statistics are recorded and accessible to privileged users.'),
    'custom' => TRUE,
    'modified' => TRUE,
    'locked' => FALSE,
  );

  $webform_type = node_type_set_defaults($webform_type);
  node_type_save($webform_type);
  node_add_body_field($webform_type);

O que fazer no hook_uninstall : basicamente apenas faça a limpeza depois de você mesmo; exclua as variáveis ​​criadas pelo módulo (usando o variable_del () ), exclua os arquivos carregados pelo módulo (use file_unmanaged_delete_recursive () ), exclua os tipos de conteúdo definidos (use node_type_delete () ), etc.

Espero que isto ajude!


Obrigado, é bom saber o caminho de codificação para fazê-lo bem, e eu precisava encontrar algumas boas informações sobre o uso de desinstalação
— Jane Panda

Não tem problema, feliz em ajudar! :)
— Alex Weber

11

Uma das melhores maneiras de manter essas informações em código é usar os recursos . Os recursos podem colocar no código:

  • Tipos de conteúdo
  • Campos CCK
  • Permissões
  • Funções

A lista continua.

Um recurso interessante sobre os recursos é a integração drush

drush featuresfornecerá uma lista de todos os recursos do site e seu status
drush features revert allreverterá todos os recursos para o que está no código (realmente útil para executar após implantações)

Ajude isso ajuda


Concordou, apesar de não responder à pergunta diretamente ...
— Alex Weber

Sim, eu sei que isso não é exatamente a solução exata solicitada, mas, em última análise, ambos atingirão o mesmo objetivo, é apenas um que será um pesadelo para manter e o outro será fácil com a integração de apontar e clicar e impressionante drush . Bob pode decidir o que funciona para ele
— WIIFM

1
Concordou novamente! Drush + Features pode ser intimidante no início, mas é tão útil quando você pegar o jeito dele :)
— Alex Weber

Vou dar uma chance, acho que economizará tempo se eu puder exportar um tipo de conteúdo personalizado, para que não tenha que colocar manualmente todos os campos. Obrigado!
— Jane Panda

3

Confira o módulo D7 Examples . O node_example possui instalação e desinstalação.

Você poderá detalhar o tipo com as ferramentas de interface e criar um recurso (com módulo de recursos) e extrair partes relevantes para a função de instalação do seu módulo personalizado.


0

Se você deseja criar um novo tipo de conteúdo com alguns campos, pode usar o código abaixo.

Este código funciona para mim perfeitamente.

function HOOK_install() {

 /* CREATE THE CONTENT TYPE */
 $t = get_t();
 $node_example = array(
    'type' => 'slider',
    'name' => $t('Slider Content'),
    'base' => 'node_content',
    'description' => $t('Add slider content.'),
    'body_label' => $t('Slider Description')
 );
 $content_type = node_type_set_defaults($node_example);

// Create a custom Field with our required field-type.
$field = array(
  'field_slider_images' => array (
    'field_name' => 'field_slider_images',
    'type' => 'image',
  ),
 'field_slider_links' => array (
   'field_name' => 'field_slider_links',
   'type' => 'text',
   'entity_types' => array('node'),
  ),

);
foreach ($field as $fields) {
  field_create_field($fields);
}

// Create a instances of that Field.
$instance = array(
'field_slider_images' => array (
  'field_name' => 'field_slider_images',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Image'),
  'description' => 'Add Slider Image.',
  'settings' => array(
    'file_directory' => 'field/document',
    'file_extensions' => 'png PNG jpg jpeg JPG JPEG',
    'max_filesize' => '10MB',
    'title_field' => '',
  ),
  'widget' => array(
     'type' => 'image_image',
     'weight'=> 10,
  ),
  'formatter' => array(
    'label' => t('label'),
    'format' => 'image'
  ),
  'settings' => array(
    'file_directory' => 'slider-image', // save inside "public://photos"
    'max_filesize' => '4M',
    'preview_image_style' => 'thumbnail',
    'title_field' => TRUE,
    'alt_field' => FALSE,
  )
),
'field_slider_links' => array (
  'field_name' => 'field_slider_links',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Link'),
  'widget' => array('type' => 'text_textfield'),
 ),
);

foreach ($instance as $fieldinstance) {
 field_create_instance($fieldinstance);
}

$status = node_type_save($content_type);
node_add_body_field($content_type);

// Replacement rule for the messages.
$t_args = array('%name' => $content_type->name);
if ($status == SAVED_UPDATED) { // update case
 drupal_set_message($t('The content type %name has been updated.', $t_args));
} 
 elseif ($status == SAVED_NEW) { // create case
   drupal_set_message($t('The content type %name has been added.', $t_args));
   watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
}

}

-1

Eu fiz isso no módulo MySpace Sync .
Lembro-me de juntar isso de várias fontes, mas não lembro quais eram todas. Você pode navegar no repositório git lá para ver o que eu fiz, mas é basicamente uma exportação de cada tipo de conteúdo com o módulo Content Copy do CCK na instalação e, em seguida, excluindo todos os nós antes de excluir o tipo de conteúdo na desinstalação.


4
Enquanto a questão é marcado drupal-7, módulo MySpace Sync é única fro disponíveis Drupal 6. A API usado para criar o tipo de conteúdo mudou muito entre Drupal 6 e Drupal 7.
— Pierre Buyle

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.