Saudações meus amigos!
O artigo de hoje vai ensinar a criar um node programaticamente, no Drupal 7. A situação é a seguinte:
Quando o usuário autentica-se no site, será necessário verificar ele é autor de um node do tipo "Galeria de Fotos". Caso este conteúdo não exista, crie um. Caso o usuário já seja o autor de um node do tipo "Galeria de Fotos", não faça nada.
O usuário não pode ter permissão de criar, editar ou apagar galerias de fotos. As fotos que comporão a galeria serão inseridas posteriormente, através de programação.
Para realizar este serviço, criei um pequeno módulo chamado "auto user gallery" e no arquivo auto_user_gallery.module eu incluí o seguinte código:
-
// Esta função é executada no início do carregamento de páginas não cacheadas.
-
// Como o usuário vai efetuar login no site, a página inicial será recarregada.
-
function auto_user_gallery_init() {
-
// carrega os dados do usuário logado atual
-
global $user;
-
// testa se estamos na página inicial e se o usuário não é anônimo
-
if ((drupal_is_front_page() || empty($_GET['q'])) && $user->uid != 0) {
-
// verifica se já existe algum node do tipo "galeria_de_fotos"
-
$galerias = db_select('node','nid')->fields('nid')->condition('uid', $user->uid, '=')->condition('type', 'galeria_de_fotos', '=')->orderBy('created', 'DESC')->execute()->fetchField();
-
// caso não exista, crie um novo node com as seguintes características
-
if (empty($galerias)) {
-
$node = new StdClass(); // define $node como um objeto
-
$node->type = 'galeria_de_fotos'; // tipo do node
-
node_object_prepare($node); // preenche os demais dados do node
-
$node->status = 1; // define o node como publicado
-
$node->uid = $user->uid; // define o autor como o usuário atual
-
$node->title = 'Galeria de ' . $user->name; // define o título do node
-
$node->created = time(); // data de criação como o sendo a data atual
-
$node->language = LANGUAGE_NONE; // define a linguagem como neutra
-
node_save($node); // salva o node no banco de dados.
-
}
-
}
-
}
No meu caso, o campo "body" não é necessário, então o deixei em branco. Mas caso precise preencher o campo, é só seguir a lógica apresentada acima (dica, o módulo devel é seu amigo):
-
// Let's add standard body field
-
$node->body[$node->language][0]['value'] = 'Este é o texto do body';
-
$node->body[$node->language][0]['summary'] = 'Este é o sumário do campo';
-
$node->body[$node->language][0]['format'] = 'filtered_html'; // É necessário definir qual o formato de texto, caso o campo use este recurso
E para outros campos, é quase a mesma coisa:
-
$node->field_custom_name[$node->language][0]['value'] = 'este é o texto de um campo de texto customizado';
-
// se você usa um formato de texto no campo, não esqueça de defini-lo
-
$node->field_custom_name[$node->language][0]['format'] = 'filtered_html';
E por aí vai.
Preencher campos de arquivo e imagem é um pouco mais complexo, pois no Drupal 7 os arquivos são uma entidade também, e precisam ser descrevidos. Exemplo:
-
$file_path = drupal_realpath('somefile.png');
-
// Cria o file object
-
$file = (object) array(
-
'uid' => $user->uid, // "dono" do arquivo
-
'uri' => $file_path, // caminho para o arquivo
-
'filemime' => file_get_mimetype($filepath), // pega o mimetype do arquivo
-
'status' => 1,
-
);
-
$file = file_copy($file, 'public://'); // Salva o arquivo na raiz da sua pasta files. Você pode especificar uma sub-pasta, usando public://imagens, por exemplo.
-
$node->field_image[$node->language][0] = (array)$file; //associa o file object com o campo de imagem
This is it. Este código é uma exemplo simples e muito prático da criação de um node programaticamente. Você pode criar usuários, comentários e termos de forma muito semelhante ao que foi mostrado aqui.
Este artigo foi parcialmente baseado neste artigo em inglês aqui.