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!

Jane Panda
fonte

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!

Alex Weber
fonte
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

wiifm
fonte
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.

Desenhou
fonte
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')); 
}

}
Sanjay
fonte
-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.

Scott Reynen
fonte
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