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.