Módulo hierarchical select para Drupal 7

Bom tarde a todos!

O post de hoje é sobre um módulo muito bacana que já vem desde o Drupal 5. Seu nome é hierarchical_select. Este módulo permite usar de forma bem eficiente a navegação dentre os filhos de uma taxonomia.

Este post tem por objetivo alertar sobre alguns problemas que você pode enfrentar ao utilizar esse módulo no Drupal 7, já que ele ainda não está na sua versão mais estável. Vejamos alguns problemas e limitações que eu encontrei:

Limitações:

  • A primeira limitação que está até escrito no readme é que a utilização do hierarchical select dentro de uma view ainda não é possível no Drupal 7, somente nas versões anteriores.

Problemas:

  • Após instalar o módulo tente criar um novo item de menu para qualquer menu que seja, você verá que apresentará um erro. Similar a figura a abaixo.

  • O segundo problema ocorre quando você atualiza qualquer node, logo após atualização aparece um warning chato na tela do usuário, esse problema não impede o funcionamento correto porém é um erro que deve ser corrigido.

Não fique triste por que existe solução para esses dois problemas.

Para o primeiro problema basta executar esse arquivo .patch.

Para segundo problema execute esse outro arquivo .patch.

Para executar um arquivo patch é necessário ter o pacote patch instalado no se sistema operacional no caso do Linux ele já vem pré-instalado, no caso do Windows é necessário fazer uma instalação, na qual eu não conheço.

No caso do Linux eu recomendo ir na pasta /sites/all/modules/hierarchical_select/module e jogar esses 2 arquivos lá. Com os arquivos lá execute os seguintes comandos:

patch < Primeiro-hs_menu-cant_add_menu_items_to_empty_menu-1388308-1.patch

//Depois o segundo

patch < Segundo-fix_hs_menu_array_warning-1304002-1.patch

Pronto.

Detalhe importante, esses patchs servem como correções paliativas então fique atento sempre a novos updates desse módulo, pode ser que nas próximas atualizações esses problemas já terão sido resolvidos. Vamos torcer.

Esses patchs eu encontrei nas seguintes páginas:

Primeiro: http://drupal.org/node/1304002

Segundo: http://drupal.org/node/1388308

Como criar um formulário no Drupal 7 programaticamente.

Boa tarde!

Hoje vou ensinar a como criar um formulário programaticamente e fazer com que suas informações vá para dentro de um tipo de conteúdo.

Antes de continuar é necessário ler esse meu outro post, como criar um módulo no Drupal 7. Para saber como criar um módulo.

Crie seu módulo como é ensinado no post linkado acima. Eu farei o meu da seguinte forma.

Criei uma pasta em /sites/all/modules/meuformulario

Com os arquivos:

  • meuformulario.info
  • meuformulario.module

Dentro do meuformulario.info coloque isso:

name = Meuformulario
description = Meu pequeno formulario customizado
core = 7.x

; Information added by drupal.org packaging script on 2011-12-05
version = "7.x-0.1"

Não esqueça de limpar o cache para o Drupal reconhecer o novo módulo na interface. Quem usa Drush pode limpar o cache com esse comando no terminal do seu linux ou windows:

drush cc all

Para quem não usa Drush vá em Configurações (Configuration) >> Desempenho (Performance) dentro dessa página conterá um botão chamado limpar todos os caches (Flush all caches).

Feito isso é necessário habilitar o módulo. A ativação pode ser por dois caminhos, pelo drush:

drush en meuformulario

Ou via interface. Vá em módulos (modules) procure a categoria Outros (Others) marque o checkbox ao lado do módulo e vá ao final e parte o botão salvar (save).

Pronto! Nesse momento seu módulo já está ativo no Drupal.

Agora vamos criar o local que irá aparecer o nosso formulário :-)

Antes de criar o formulário propriamente dito precisamos definir em qual local ele deverá aparecer.

Então faça a seguinte pergunta: Esse formulário irá aparecer numa página ou num bloco? Ou então em ambos?

No nosso caso faremos o formulário aparecer na sua própria página.

Para isso precisamos utilizar um tipo de hook especial chamado hook_menu().

Resumindo hook_menu é uma função que te auxilia a registrar caminhos para encontrar suas pages, forms criadas programaticamente e entre outras coisas. Para quem conhece o padrão de projeto MVC pode se dizer que o hook_menu faz mais ou menoso papel de um controller.

Pois bem, agora entre no seu arquivo meuformulario.module e escreva o seguinte:

<?php 
function meuformulario_menu() {
	$items['meuformulario'] = array(
	      'title' => 'Título do meu formulário',
	      'page callback' => 'drupal_get_form',
	      'page arguments' => array('meuformulario_form'),
              'access callback' => TRUE,
	);
	return $items;
}

function meuformulario_form($form, &$form_state) {
	return $form;
	
}

Toda vez que é utilizado um novo hook_ é necessário limpar o cache, então execute o mesmo comando de limpeza de cache ensinado acima.

Feito a limpeza vá ao navegador e digite:

Se tudo estiver certo você verá isto:

Clique aqui para ver em tamanho maior

Se conseguir chegar até aqui parabéns! Já chegamos na metade do caminho :-)

Antes de continuar vou explicar o que foi feito acima.

Após criar o hook_menu eu defini um novo local de acesso chamado meuformulario. Mas para criar um novo local eu preciso passar alguns parâmetros:

  • title: É o título que aparecerá no topo do navegador.
  • Page callback: É o que retornará dessa página. No nosso caso estamos retornando uma  chamada de formulário, drupal_get_form nada mais é que uma função que carrega um formulário.
  • No page arguments: passamos o parâmetro que será usado no drupal_get_form, nesse caso é o nome da função que escrevemos logo após o hook_menu, meuformulario_form.
  • Access callback: É para definir se o acesso é permitido ou não a essa página.

Depois de criado o hook precisamos criar a função que irá gerar o formulário. Até esse momento já foi criado tal função só que ela ainda está vazia.

Para esse formulário vamos usar como base o campos do tipo de conteúdo Artigo (Article). Nesse tipo de conteúdo nós possuimos somente dois campos como entrada de texto, título (title) e o corpo (body).

Será usado o padrão Forms API para criar os dois campos.

function meuformulario_form($form, &$form_state) {
	$form['titulo'] = array(
	  '#type' => 'textfield', 
	  '#title' => t('T[itulo'), 
	  '#default_value' => '', 
	  '#size' => 60, 
	  '#maxlength' => 128, 
	  '#required' => TRUE,
	);
	
	$form['corpo'] = array(
	  '#title' => t('Corpo'),
	  '#type' => 'textarea',
	  '#description' => t('Descrição breve'),
	  '#default_value' => ''
	);
	
	$form['submit'] = array(
	   '#type' => 'submit', 
	   '#value' => t('Enviar'));
	
	return $form;
}

Após escrever esses comandos salve e recarregue a página meuformulario e será isso que você verá:

Clique aqui para ver ampliado

Veja o que significa cada parâmetro declarado acima:

  • Type: É a declaração que define de que tipo seu campo será: textfield, textarea, select e etc...
  • Title: É o título que irá ao lado ou acima do campo.
  • Size: É o tamanho do campo própriamente dito e não a capacidade que pode ser escrito.
  • Maxlength: Esse sim é a capacidade de caracteres pode ser digitado.
  • Default_value: Serve para deixar alguma informação já escrita na hora que carregar o formulário.
  • Description: Serve para você colocar qualquer tipo de informação que desejar.
  • Required: Define se esse campo é de preenchimento obrigatório ou não.

Existem muitos outros parâmetros específicos ou não para cada tipo de campo, para maiores detalhes visite a página Forms API.

Entendido para que serve cada parâmetro declarado podemos ir para o próximo nivel de entendimento de um formulário criado programatiicamente.

Todo formulário criado por linha de programação precisa respeitar duas regras básicas, criar a função _form propriamente dita e criar sua função de submissão que é onde o formulário saberá pra onde deverá enviar as informações capturas no formulário.

Agora crie a seguinte função:

function meuformulario_form_submit($form, &$form_state) {
	echo "<pre>";
	print_r($form_state['values']);
	exit;
}

Esses três comandos dentro da função serve para debugar o que está dentro do form_state, para quem já é mais avançando em Drupal pode usar a função de debug do módulo Devel que é bastante recomendo para quem ainda não está acostumado com as matrizes e objetos gigantes que o Drupal gera rsrsrs.

Preencha o formulário e o submeta. Logo após o submit você deverá ver isso:

Clique aqui para ampliar

Esse pequeno debug servirá para você saber como pegar os valores de cada campo e assim enviar para objeto que será usado para registrar esses valores no tipo de conteúdo artigo.

Agora é o mais esperado! A parte final para que todo esse nosso trabalho funcione 100% como esperado!

function meuformulario_form_submit($form, &$form_state) {		
	$node = new stdClass();
	$node->type = 'article'; // Machine name: article. Encontra em: admin/structure/types 
	node_object_prepare($node); // Função que define propriedades default de um node
	$node->title    = $form_state['values']['titulo'];
	$node->language = LANGUAGE_NONE; //Como náo estamos trabalhando com multi-idiomas utilize essa constante
	$node->body[$node->language][0]['value']   = $form_state['values']['corpo'];
	$node->body[$node->language][0]['summary'] = text_summary($node->body[$node->language][0]['value']); //Para criar uma chamada
	$node->body[$node->language][0]['format']  = 'filtered_html'; //Para definir que o texto pode receber um formato filtrado de html
    node_save($node); //Salva o objeto no tipo de conteúdo article no banco de dados
    
    if(!empty($node->nid)){ //Se for diferente de vazio o cadastro foi bem sucedido.
    	drupal_set_message('Cadastro efetuado com sucesso!', 'status');
    }else{
    	drupal_set_message('Houve algum problema no cadastro.', 'error');
    }
    
    //Após o submissão com sucesso ou não o usuário será enviado de volta ao formulário com uma mensagem de aviso.
    $form_state['redirect'] = array(
        'meuformulario',
    );
}

Após programar as linhas acima, volte ao formulário e preencha-o. Caso obtenha sucesso será essa informação que deverã aparecer.

Clique aqui para ampliar

Se a caixa verde apareceu para você, SUCESSO ! Você conseguiu executar tudo corretamente! Para verificar se o conteúdo foi realmente cadastrado clique em find content (admin/content). Não esqueça que você precisa estar logado para acessar essa parte da administração.

Ẽ isso ai pessoal demorei, mas postei! Espero que gostem, por que da um trabalhão danado escrever com tantos detalhes!

Mais um detalhe estou anexão o módulo que fiz para criar esse post, para quem quiser testá-lo :-)

Baixe aqui!

Um bom final de domingo a todos!

Fui!

 

Webinars em português sobre PHP 5.3 e 5.4

Boa tarde!

Pessoal hoje recebi um e-mail da School of Net dizendo que ela possuia alguns webinars gratuitos para assisti.

Pois bem, fui lá da uma olhada no que tinha e achei um bem interessante sobre PHP eXtreme 5.3 com Raphael Almeida. Clique aqui para assistir.

Para quem já está habituado com PHP assista o video da metade pro final. Para quem precisa reforçar o básico ainda, assista o video desde o início.

Outra coisa interessante que ele deu umas pinceladas sobre o que está por vir no PHP 5.4, por sinal School of Netmuitas coisas boas e que irão poupar ainda mais nosso trabalho.

Além desse webinar existem outros lá gratuitos que eu não assisti mas com certeza deve valer a pena.

Acessar School of Net.

É muito importante para um desenvolver está por dentro das novidades da sua linguagem, principalmente aqueles que desenvolvem em cima de um framework que no meu caso é o Drupal e o Magento.

Sabendo dessas novidades da para se adiantar nos estudos das possiveis melhorias dos nossos frameworks.

Um exemplo real foi o caso do Drupal 7 que adotou a biblioteca PDO para abstração das consultas aos bancos de dados, que foi incoporado na versão 5.3 do PHP.

Blog devolta ao ar.

Salve salve.

O blog está novamente no ar.
Mas qual motivo de sua queda durante o domingo e segunda-feira.
Pois bem, durante esse um dia e meio estava configurando minha hospedagem para suportar o deploy automatizado, utilizando o Capistrano.

Por que disso?
Isso foi feito para facilitar atualização do site, com esse novo mecanismo eu posso escrever os artigos diretamente do meu site local e depois só executar um simples comando: cap production deploy e ai o capistrano se encarrega de pegar a última versão do subversion e se encarrega de atualizar o site em produção via rsync.

É uma beleza, por que agora eu possuo também 2 ambientes, um staging e outro production. Esse que você está lendo agora é o production e o outro fica staging.helalferrari.com.

É isso ai, dentro de breve postarei um artigo mais detalhado sobre isso.

Como criar um módulo no Drupal 7

Bom dia!

Esse post irá ensinar a vocês a como criar uma estrutura básica de um módulo. Para podermos prosseguir num desenvolvimento mais avaçando do Drupal é extremamente necessário esse conhecimento, sem ele fica impossível de se fazer algo que não seja gambiarra. rsrsrs.

Então vamos lá!

Parte 1 - Criando módulos

Para você criar um módulo a primeira coisa importante que você precisa saber é:

  • Nunca se deve criar nada na pasta /modules que fica na raiz do projeto Drupal. Essa pasta é onde contém os módulos do core, por convênção e boa prática o recomendado é colocar os módulos de terceiros na pasta, sites/all/modules ou se tiver trabalhar com multisites sites/seusite/modules.

Com isso em mente podemos prosseguir para o próximo passo.

Um ótimo exemplo para saber como criar uma estrutura básica de um módulo é ver os que existem na pasta /modules da raíz do projeto. Se você for lá agora ver perceberá o seguinte:

Um módulo contém:

  • Uma diretório com nome do módulo em minúsculo, sem acentuação e espaços;
  • E dentro dessa pasta existirão 4 arquivos fundamentais (*.info, *.module, *.install, *.test).

Não preocupe agora com outros arquivos e pastas que você encontrar dentro de um módulo. O que faz realmente surgir um módulo no Drupal são esses arquivos. que vou explicar agora para que servem.

Arquivo .info (obrigatório criar)

O arquivo .info serve para descrever o que seu módulo será, podemos dizer que ele é um arquivo descritor. Sem ele o Drupal não consegue reconhecer o módulo na lista de módulos que existe na interface administrativa do sistema.

Dentro desse arquivo existe as seguintes informações:

name = Contrato (Mesmo nome usado na pasta do seu modulo)

description = "Descrição breve do que seu módulo fará."
package = Guga (É de qual pacote esse módulo pertencerá, caso você não ponha nada aqui o seu módulo aparecerá  no pacote Others)
dependencies[] = aluno (Esse parâmetro diz quais módulos que seu módulo depende para funcionar).
dependencies[] = print
;files[] = views/references_plugin_style.inc (Normalmente esse parâmetro é usado para carregar os arquivos de teste do seu módulo, também pode ser usado para carregar outras informações)
 
;Information added by drupal.org packaging script on 2011-05-12 (Descrição básica não é necessário escrever)
version = "7.x-0.1-alpha" (Aqui você declara que versão está seu módulo)
core = "7.x" (Aqui você diz de qual versão pertence seu módulo)
project = "Guga" (Esse parâmetro tem a mesma função que o package mas a partir da versão 7 do Drupal está entrando em deuso, então o recomendado é não usar mas, porém por questões de entendimento eu deixei aqui por que provavelmente você se irá se deparar com ele em muitos módulos ainda).
datestamp = "1305236816" (A data que seu módulo foi criado em formato timestamp para conseguir essa data nesse formata pasta executar esse comando no php echo time();)
 
Para informar que tal instrução é um comentário coloque ; (ponto e vírgula no início do comando).
 

Arquivo .module (obrigatório criar)

Este arquivo é o cérebro do seu módulo é a partir dele que tudo surge. Por enquanto não vamos se aprofundar nesse arquivo por que exige uma atenção muito especial e também por que envolve muitas áreas de desenvolvimento aqui dentro. Não há problema de deixar esse arquivo vazio.

Arquivo .install (não é obrigatório)

Este arquivo é utilizado para criar, atualizar e remover tabelas que seu módulo irá utilizar. Caso seu módulo não for criar uma tabela ou alterar uma outra, então não é necessário criar esse arquivo.

E o último arquivo.

Arquivo .test (não é obrigatório)

Este arquivo é muito importante caso você necessite criar um caso de test para seu módulo, a criação desses teste exige um conhecimento bem avançado da arquitetura Drupal. Mas para conhecimento geral é bom saber que existe uma maneira bastante organizada e profissional de criar teste de casos.

No final você terá a seguinte estrutura.

  • sites/all/modules/nomedoseumodulo
  • sites/all/modules/nomedoseumodulo/nomedoseumodulo.info
  • sites/all/modules/nomedoseumodulo/nomedoseumodulo.module

O restante como dito anteriormente não é necessário criar.

É isso. Qualquer dúvida estarei prontamente em responder!

Modelo Entidade Relacionamento - Drupal 7

Salve galera, hoje vai mais uma dica rápida sobre Drupal 7.Modeo Entidade Relacionamento do Drupal 7

Quem ai está afim de se aprofundar na arquitetura do Drupal 7 o primeiro passo é conhecer o modelo Entidade Relacionamento.

Para quem não sabe o que é um Modelo ER. Ele é um documento onde específica onde cada informação ficará armazenada e relacionada com a outra.

Bons estudos!

 

fonte: http://upsitesweb.com/blog/2011/06/drupal-7-database-schema

Drupal Cheat Sheets

Bom dia! Essa é rápidinha.

Pra quem curte ter todos os comandos e funções do Drupal numa imagem só, segue abaixo o link para fazer download.

Drupal Cheat Sheets

Agradeço o link ao Paulino Michellazo que no seu Preguiça Mode On encontrou esse site! rsrs

Como formatar uma data no Magento

Essa dica é muito útil para quem está criado módulos no Magento e em algum momento precisa formatar um campo data.

Sem melongas ai vai!

Mage::helper(’core’)->formatDate(suaData(), ‘medium’, false);

Pode usar:

  • short;
  • medium;
  • long.

É importante usar esse método formatador por que ele saberá em qual idioma deverá formatar a sua data.

Fonte: Magento Commerce

Tags: 

Instalando o php no IIS 7.5 com fastcgi + sql server

Bom dia galera, segue abaixo um link muito explicativo de como proceder com a instalação do IIS + PHP + Sql server.

Vale lembrar que essa explicação server as versões a partir do Windows Vista, 7 ++

http://sqlfromhell.wordpress.com/2009/12/21/instalando-o-php-no-iis-7-5/

Como enviar um e-mail por linha de comando no Magento

Primeiro Passo: Adicionar o caminho do template no CONFIG.XML do seu MÓDULO

Para avisar seu módulo que existe um template de e-mail criado, adicione as seguintes linhas no xml.

<global>
        <template>
            <email>
                <email_template_aviso_debito_cc_cliente module="oferta">
                    <label>Oferta - Avisando ao cliente que será feito um débito no seu cartão de crédito</label>
                    <file>email_template_aviso_debito_cc_cliente.html</file>
                    <type>html</type>
                </email_template_aviso_debito_cc_cliente>
            </email>
        </template>
</global>

Segundo Passo: Instanciar a classe  core/email_template  e adicionando método de envio no helper do seu módulo.

Essa classe é responsável por enviar e-mails do Magento, então nada mais do que correto utilizar essa classe para o nosso benefício.

Aproveitando vamos criar esse método no nosso helper. Desse modo, estamos encapsulando e tornando nosso método reutilizável.

/**
   * Método que permite enviar e-mails de forma rápida e segura.
   * @param type $cliente array(nome, email, assunto, template)
   * @param type $emailTemplateVariables array(var1,var2,var3,varn,...)
   */
public function enviarEmail($cliente, $emailTemplateVariables){
        $emailTemplate  = Mage::getModel('core/email_template')->loadDefault($cliente['template']);
        $emailTemplate->setTemplateSubject($cliente['assunto']);
        $emailTemplate->setSenderName(Mage::getStoreConfig('trans_email/ident_general/name'));
        $emailTemplate->setSenderEmail(Mage::getStoreConfig('trans_email/ident_general/email'));
        $emailTemplate->send($cliente['email'], $cliente['nome'], $emailTemplateVariables);
 } 

Terceiro passo: Executar a chamada do método helper para envio de e-mail

// Array que guarda toda as informações necessárias para o envio
$cliente['email'] = 'email do destinatário';
$cliente['nome'] = 'Nome do destinatário;
$cliente['assunto'] = 'Assunto do e-mail';
$cliente['template'] = 'email_template_aviso_debito_cc_cliente'; //arquivo .html de template que será chamado para ser enviado ao e-mail do cliente

// Array que guarda as váriaveis que conterão informações dinâmicas que serão injetadas dentro do .html de template do email
// Aqui você pode colocar quantas variaveis quiser
$emailTemplateVariables['myvar1'] = 'Informações que você quiser';
$emailTemplateVariables['myvar2'] = $objeto->metodoQueVoceQuiser();
...

// Método estático do Magento para acionar um método helper do módulo desejado
Mage::helper('nomeDoSeuModulo')->enviarEmail($cliente, $emailTemplateVariables);

Quarto e Último Passo: Criar seu template do seu e-mail

O último passo é muito tranqüilo basta você ir na seguinte pasta do seu Magento.

app\locale\en_US\template\email\email_template_aviso_debito_cc_cliente.html

Duas coisas importantes no caminho a cima.

email_template_aviso_debito_cc_cliente.html >> Esse é o nome do arquivo que deverá ser criado nesta pasta. Note que esse nome está no passo 1, na declaração do XML e também está no passo 3, na declaração do array $cliente['template'] = .
en_US >> Caso você esteja utilizando idioma pt-br no Magento você precisa ir na pasta pt-br e também adicionar esse mesmo arquivo. Isso vale para todos os idiomas que você esteja utilizando no seu e-commerce.

Por fim, dentro do arquivo email_template_aviso_debito_cc_cliente.html você colocará o HTML e suas váriaveis criadas no passo 3 e enviadas para seu método enviarEmail().:

Veja um exemplo do que colocar:

<div>
    <h1>Adega Imperatriz Informa: Aviso de débito</h1>
    <p>Olá, {{var myvar1}}</p>
    <p>Neste momento, está sendo efetuado um débito no seu cartão de crédito no valor de R$ {{var myvar2}}.</p>
    <p>Este débito é referente ao seu pedido de nº: {{var myvar3}}</p>
    <p>Para mais detalhes favor acessar sua conta no <a href="{{var myvar4}}"</a>Adega Imperatriz</a>.</p>
    <p>Atenciosamente, equipe Imperatriz agradece a sua compra!</p>
</div>

Pronto! A partir de agora seu módulo terá um método para e-mail no momento que jugar necessário!

Bom proveito!

Fontes de estudo:
Inchoo, StackOverFlow

 

Tags: 

Páginas

Inscreva-se em Helal Ferrari RSS
© 2011 HelalFerrari.com. Drupal theme by Kiwi Themes.