Jump to content

[Tutorial] Customizando campos de cadastro v. 1.5


Recommended Posts

Galera,

 

Resolvi fazer um tutorial para modificar o cadastro dos clientes conforme a necessidade.

Primeiro o ideal é definir o que se precisa.

 

No Brasil temos a necessidade de alguns campos diferenciados da Europa e EUA devido a nota fiscal e pagamentos dos gateways como PagSeguro e Bcash...

 

Então temos que adicionar alguns campos de códigos em alguns arquivos para que eles possam ser habilitados no front-end e adicionar colunas nos bancos de dados para que eles possam ser armazenados e utilizados conforme a necessidade.

 

Como exemplo vamos criar apenas um campo número para o endereço para que ele seja adicionado separado do resto do endereço.

 

1º - Passo: 

Vamos alterar o authentication.tpl -> no endereço /themes/_SEU_TEMA/authentication.tpl

 

Por volta da linha 647:

{elseif $field_name eq "address1"}
				<p class="required text">
					<label for="address1">{l s='Address'} <sup>*</sup></label>
					<input type="text" class="text" name="address1" id="address1" value="{if isset($smarty.post.address1)}{$smarty.post.address1}{/if}" />
				</p>

Esse é o campo de endereço 1. 

 

Vamos adicionar o código a seguir

{elseif $field_name eq "address_number"}
                <p class="required text">
                    <label for="address_number">{l s='Address_number'}<sup>*</sup></label>
                    <input type="text" class="text" name="address_number" id="address_number" value="{if isset($smarty.post.address_number)}{$smarty.post.address_number}{/if}" /
                </p>

Dependendo do template que estiver sendo utilizado esse valor pode se encontrar em outra linha ou pode até mesmo estar diferente, inclusive pode ser necessário adicionar em outros lugares do documento. É necessária a leitura do código do arquivo .tpl e observar o seu comportamento.

 

2º - O próximo passo é a alteração no arquivo AuthController.php.

 

Por boas práticas não devemos modificar o Core do Prestashop, mas podemos fazer um override para fazer a alteração necessária.

 

Caso não conheça a utilização de override segue o link:

http://doc.prestashop.com/display/PS15/Overriding+default+behaviors

 

O jeito mais fácil é dar override em todo o arquivo assim não terá que se preocupar aonde inserir a codificação.

 

Procure pelo código abaixo:

// Preparing customer
$customer = new Customer();
$lastnameAddress = Tools::getValue('lastname');
$firstnameAddress = Tools::getValue('firstname');

E adicione essa linha logo abaixo:


$addressNumber = Tools::getValue('address_number');

Isso fará a variável $addressNumber armazenar o valor obtido através do 'address_number'.

 

Localize esse código abaixo que se encontra no mesmo arquivo

$customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']);
if (!Validate::isBirthDate($customer->birthday))
$this->errors[] = Tools::displayError('Invalid date of birth.');

E adicione logo abaixo o código:

$customer->addressnumber = $addressNumber;

Procure pelo código abaixo ainda no mesmo arquivo:

$customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']);
if (!Validate::isBirthDate($customer->birthday))
$this->errors[] = Tools::displayError('Invalid date of birth');

E insira novamente o código abaixo:

$customer->addressnumber = $addressNumber;

Já quase no final do arquivo AuthController.php vamos encontrar um código assim:

$this->context->customer = $customer;
$this->context->smarty->assign('confirmation', 1);
$this->context->cookie->id_customer = (int)$customer->id;

Adicione a seguinte linha:

$this->context->cookie->customer_addressnumber = $customer -> addressnumber;

Ok esse arquivo está pronto agora iremos no próximo arquivo.

 

3º - Classe Address.php

 

Novamente não é bom modificar os arquivos de Core do prestashop.

Então iremos dar novamente um override no arquivo.

 

localize esse código:

/** @var string Address first line */
	public $address1;

e adicione:

/** @var int Address number */
    public $address_number;

No array abaixo :

public static $definition = array(
		'table' => 'address',
		'primary' => 'id_address',
		'fields' => array(
			'id_customer' => 		array('type' => self::TYPE_INT, 'validate' => 'isNullOrUnsignedId', 'copy_post' => false),
			'id_manufacturer' => 	array('type' => self::TYPE_INT, 'validate' => 'isNullOrUnsignedId', 'copy_post' => false),

adicione o campo:

'address_number'=>      array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true, 'size' => 10),

4º - Adicione a tradução:

 

Vá no painel administrativo da sua loja > Localização > Traduções > Na guia Modificar traduções selecione :

Traduções da Loja, _SEU_TEMA e clique na bandeira do brasil

 

Na janela que foi aberta localize: authentication e expanda.

 

Localize:Address_number e substitua por Número.

 

5º - Adicionando o campo no formulário:

 

Vá novamente ao painel administrativo de sua loja> Localização > Países.

 

Localize o Brasil e clique em editar.

 

No campo do endereço adicione : address_number 

 

Salve.

 

6º - Adicionar coluna ao banco de dados:

 

O próximo passo é adicionar coluna. 

 

Vá no phpMyAdmin e Execute o comando SQL no banco de dados.

 

ALTER TABLE ps_address ADD addressnumber INT(10) NOT NULL AFTER address2

 

Verifique o passo a passo -> cheque se tudo estiver certo.

 

E não faça essas alterações em um site em produção verifique primeiro em um servidor de teste.

 

E boa sorte,

 

Tk

  • Like 4
Link to comment
Share on other sites

Bem vindo á nossa comunidade @tkzaum10 :)

 

Não experimentei o tutorial, mas parece estar suficientemente detalhado, pelo que mereceu o seu primeiro "Like This" ;)

 

No entanto o tema também pode usar override:

  • cria a pasta override dentro do folder do seu tema . ex: themes/nome-do-seu-tema/override
  • agora coloque aqui o seu ficheiro tpl personalizado, usando o prefixo "layout-". Ex: themes/nome-do-seu-tema/override/layout-authentication.tpl
  • também pode efectuar o override utilizando o hook  "DisplayOverrideTemplate", mas o método acima é mais simples.

 

Pode também criar um módulo que facilmente instalará os overrides e procederá á alteração da base de dados.

 

 

 

  • Like 1
Link to comment
Share on other sites

Bem vindo á nossa comunidade @tkzaum10 :)

 

Não experimentei o tutorial, mas parece estar suficientemente detalhado, pelo que mereceu o seu primeiro "Like This" ;)

 

No entanto o tema também pode usar override:

  • cria a pasta override dentro do folder do seu tema . ex: themes/nome-do-seu-tema/override
  • agora coloque aqui o seu ficheiro tpl personalizado, usando o prefixo "layout-". Ex: themes/nome-do-seu-tema/override/layout-authentication.tpl
  • também pode efectuar o override utilizando o hook  "DisplayOverrideTemplate", mas o método acima é mais simples.

 

Pode também criar um módulo que facilmente instalará os overrides e procederá á alteração da base de dados.

 

Opa obrigado pelos toques,

eu segui a documentação do namespace 1.5 mas não tive tempo de ler tudo ainda.

Vou tentar olhar esses overrides via layout e no modulo também.

 

Por acaso você sabe se já existe algum módulo com essa funcionalidade exadra?

 

Grato,

Tk

Edited by tkzaum10 (see edit history)
Link to comment
Share on other sites

Bem vindo á nossa comunidade @tkzaum10 :)

 

Não experimentei o tutorial, mas parece estar suficientemente detalhado, pelo que mereceu o seu primeiro "Like This" ;)

 

No entanto o tema também pode usar override:

  • cria a pasta override dentro do folder do seu tema . ex: themes/nome-do-seu-tema/override
  • agora coloque aqui o seu ficheiro tpl personalizado, usando o prefixo "layout-". Ex: themes/nome-do-seu-tema/override/layout-authentication.tpl
  • também pode efectuar o override utilizando o hook  "DisplayOverrideTemplate", mas o método acima é mais simples.

 

Pode também criar um módulo que facilmente instalará os overrides e procederá á alteração da base de dados.

 

Opa exadra blz? Cara você poderia me tirar uma dúvida? 

 

Eu estou com um override no authentication.tpl conforme você tinha comentado pois queria testar o seu método. Mas quando fui checar a página ela havia perdido o link com o arquivo authentication.css poderia me ajudar a linkar os 2 novamente?

 

Grato 

Tk

Link to comment
Share on other sites

Primeiro precisa de verificar se authentication.css não está realmente a ser carregado dentor da tag <head></head> .

 

Se estiver eme falta, então o problema dever ser noutro lado.

 

O método que verifica qual o ficheiro do template que deve carregar não está relacionado com os ficheiros css.

/**
	 * Returns the layout corresponding to the current page by using the override system
	 * Ex:
	 * On the url: http://localhost/index.php?id_product=1&controller=product, this method will
	 * check if the layout exists in the following files (in that order), and return the first found:
	 * - /themes/default/override/layout-product-1.tpl
	 * - /themes/default/override/layout-product.tpl
	 * - /themes/default/layout.tpl
	 *
	 * @since 1.5
	 * @return bool|string
	 */
	public function getLayout()
	{
		$entity = $this->php_self;
		$id_item = (int)Tools::getValue('id_'.$entity);

		$layout_dir = $this->getThemeDir();
		$layout_override_dir  = $this->getOverrideThemeDir();

		$layout = false;
		if ($entity)
		{
			if ($id_item > 0 && file_exists($layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl'))
				$layout = $layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl';
			elseif (file_exists($layout_override_dir.'layout-'.$entity.'.tpl'))
				$layout = $layout_override_dir.'layout-'.$entity.'.tpl';
		}

		if (!$layout && file_exists($layout_dir.'layout.tpl'))
			$layout = $layout_dir.'layout.tpl';

		return $layout;
	}

Pode verificar em  https://github.com/PrestaShop/PrestaShop/blob/1.6/classes/controller/FrontController.php

Edited by exadra37
Escrevi em InglEs em vez de Português (see edit history)
  • Like 1
Link to comment
Share on other sites

Primeiro precisa de verificar se authentication.css não está realmente a ser carregado dentor da tag <head></head> .

 

Se estiver eme falta, então o problema dever ser noutro lado.

 

O método que verifica qual o ficheiro do template que deve carregar não está relacionado com os ficheiros css

/**
	 * Returns the layout corresponding to the current page by using the override system
	 * Ex:
	 * On the url: http://localhost/index.php?id_product=1&controller=product, this method will
	 * check if the layout exists in the following files (in that order), and return the first found:
	 * - /themes/default/override/layout-product-1.tpl
	 * - /themes/default/override/layout-product.tpl
	 * - /themes/default/layout.tpl
	 *
	 * @since 1.5
	 * @return bool|string
	 */
	public function getLayout()
	{
		$entity = $this->php_self;
		$id_item = (int)Tools::getValue('id_'.$entity);

		$layout_dir = $this->getThemeDir();
		$layout_override_dir  = $this->getOverrideThemeDir();

		$layout = false;
		if ($entity)
		{
			if ($id_item > 0 && file_exists($layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl'))
				$layout = $layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl';
			elseif (file_exists($layout_override_dir.'layout-'.$entity.'.tpl'))
				$layout = $layout_override_dir.'layout-'.$entity.'.tpl';
		}

		if (!$layout && file_exists($layout_dir.'layout.tpl'))
			$layout = $layout_dir.'layout.tpl';

		return $layout;
	}

Pode verificar em  https://github.com/PrestaShop/PrestaShop/blob/1.6/classes/controller/FrontController.php

 

Actualmente não está a carregar nada dentro do <head></head>. Eu fiz uma cópia do ficheiro authentication.tpl para layout-authentication.tpl e apenas carrega a página que pode ver na imagem:

http://puu.sh/bRUZM/732c5a4453.png

 

No painel de inspecção do browser verifico que nada está a ser carregado:

http://puu.sh/bRV3n/90e3afe368.png

 

Talvez tenha entendido algo errado, pelo que deixo aqui a directoria do tema:

http://puu.sh/bRVat/b29b804301.png

 

Se me puder ajudar, a sua ajuda será muito apreciada.

Edited by exadra37
O meu último post foi colocado em Inglês por engano, pelo que a resposta também foi dada em Inglês pelo @tkzaum10 (see edit history)
Link to comment
Share on other sites

Para ser sincero nunca tinha utilizado esta facilidade do Prestashop, apenas sabia que existia no código.

 

Na minha instalação também me acontece o mesmo se colocar um ficheiro tpl na pasta override.

 

Infelizmente estou no meio de um projecto de upgrade de uma loja de 1.3 para 1.6 pelo que não tenho tempo para verificar o porque deste comportamento :(

  • Like 1
Link to comment
Share on other sites

Para ser sincero nunca tinha utilizado esta facilidade do Prestashop, apenas sabia que existia no código.

 

Na minha instalação também me acontece o mesmo se colocar um ficheiro tpl na pasta override.

 

Infelizmente estou no meio de um projecto de upgrade de uma loja de 1.3 para 1.6 pelo que não tenho tempo para verificar o porque deste comportamento :(

 

Tudo bem sem problemas já solucionei o problema que eu tinha em minha loja de outra maneira, vou continuar pesquisando pois parece uma forma mais simples de dar override nos .tpl vou ver se o vekia sabe.

 

Obrigado,

Tk

Link to comment
Share on other sites

É um bug no método getLayout() no ficheiro FrontController.php

 

Código corrigido:

/**
	 * Returns the layout corresponding to the current page by using the override system
	 * Ex:
	 * On the url: http://localhost/index.php?id_product=1&controller=product, this method will
	 * check if the layout exists in the following files (in that order), and return the first found:
	 * - /themes/default/override/layout-product-1.tpl
	 * - /themes/default/override/layout-product.tpl
	 * - /themes/default/layout.tpl
	 *
	 * @since 1.5
	 * @return bool|string
	 */
	public function getLayout()
	{
		$entity = $this->php_self;
		$id_item = (int)Tools::getValue('id_'.$entity);

		$layout_dir = $this->getThemeDir();
		$layout_override_dir  = $this->getOverrideThemeDir();

		$layout = false;
		if ($entity)
		{
			if ($id_item > 0 && file_exists($layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl'))
				$this->template = = $layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl';
			elseif (file_exists($layout_override_dir.'layout-'.$entity.'.tpl'))
				$this->template = $layout_override_dir.'layout-'.$entity.'.tpl';
		}

		if (!$layout && file_exists($layout_dir.'layout.tpl'))
			$layout = $layout_dir.'layout.tpl';

		return $layout;
	}
Edited by exadra37 (see edit history)
Link to comment
Share on other sites

 

É um bug no método getLayout() no ficheiro FrontController.php

 

Código corrigido:

/**
	 * Returns the layout corresponding to the current page by using the override system
	 * Ex:
	 * On the url: http://localhost/index.php?id_product=1&controller=product, this method will
	 * check if the layout exists in the following files (in that order), and return the first found:
	 * - /themes/default/override/layout-product-1.tpl
	 * - /themes/default/override/layout-product.tpl
	 * - /themes/default/layout.tpl
	 *
	 * @since 1.5
	 * @return bool|string
	 */
	public function getLayout()
	{
		$entity = $this->php_self;
		$id_item = (int)Tools::getValue('id_'.$entity);

		$layout_dir = $this->getThemeDir();
		$layout_override_dir  = $this->getOverrideThemeDir();

		$layout = false;
		if ($entity)
		{
			if ($id_item > 0 && file_exists($layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl'))
				$this->template = = $layout_override_dir.'layout-'.$entity.'-'.$id_item.'.tpl';
			elseif (file_exists($layout_override_dir.'layout-'.$entity.'.tpl'))
				$this->template = $layout_override_dir.'layout-'.$entity.'.tpl';
		}

		if (!$layout && file_exists($layout_dir.'layout.tpl'))
			$layout = $layout_dir.'layout.tpl';

		return $layout;
	}

Obrigado pela atenção exadra,

 

Vou corrigir o código e  verificar se ta tudo certo.

 

Tk

Link to comment
Share on other sites

Muito Top o tutorial parabéns, vai ajudar muito.

Opa valew espero que funcione para você buds,

 

Aproveite e não esquece de verificar se seu banco de dados esta armazenando os dados que você precisa da maneira correta.

 

Abraço,

TK

Link to comment
Share on other sites

Opa valew espero que funcione para você buds,

 

Aproveite e não esquece de verificar se seu banco de dados esta armazenando os dados que você precisa da maneira correta.

 

Abraço,

TK

 

Estou começando agora com prestashop, ainda aprendendo direito como trabalhar com ele, me batendo no modulo do bcash, pois na última tela fica em branco não apresenta a opção de escolha de cartões após selecionar a plataforma bcash, enquanto não resolvo isso vou vendo mais afundo problemas e tutoriais como o seu que podem me ajudar futuramente. Meu outro maior problema é encontrar um tema decente e o modulo dos correios rs.

  • Like 1
Link to comment
Share on other sites

Estou começando agora com prestashop, ainda aprendendo direito como trabalhar com ele, me batendo no modulo do bcash, pois na última tela fica em branco não apresenta a opção de escolha de cartões após selecionar a plataforma bcash, enquanto não resolvo isso vou vendo mais afundo problemas e tutoriais como o seu que podem me ajudar futuramente. Meu outro maior problema é encontrar um tema decente e o modulo dos correios rs.

Bom para cada problema da para resolver de formas diferentes, recomendo que procure em todos os forums inclusive nos que estiverem em outros idiomas pq vc pode usar o tradutor do google e resolver isso rapidamente. 

 

Nunca testei o módulo do bcash, no momento uso pagseguro que é bem mais rápido de instalar e fazer funcionar mas o cliente pode requisitar bcash então recomendo que você verifique se o módulo é compatível com o seu tema. 

 

O template tem varios gratuitos na internet, mas nunca são exatamente o que você gostaria por que não são custom-made. Eu recomendo que estude os .tpl e como eles funcionam e também de uma olhada em overrides pq eles podem te ajudar bastante na criação de novos templates.

 

Se precisar de ajuda só chamar,

TK

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Estou tentando fazer essa adição. pode me ajudar?

 

Hrq1,

 

Se você seguir esse tutorial vai conseguir fazer no namespace 1.5. Tiveram algumas mudanças no 1.6 e tem alguns tutoriais na net que são especificos para essa versão.

 

Conforme o problema que você teve no módulo sugiro que você utilize um servidor de teste. Não instale ou modifique sua loja principal, eu sou iniciante em prestashop e tenho algum conhecimento em php mas não é minha especialidade.

 

Caso possa te ajudar em algo me avisa mas sugiro que seja mais preciso no que vc esta enfrentando problemas para que eu consiga te auxiliar.

 

TK

Link to comment
Share on other sites

Hrq1,

 

Se você seguir esse tutorial vai conseguir fazer no namespace 1.5. Tiveram algumas mudanças no 1.6 e tem alguns tutoriais na net que são especificos para essa versão.

 

Conforme o problema que você teve no módulo sugiro que você utilize um servidor de teste. Não instale ou modifique sua loja principal, eu sou iniciante em prestashop e tenho algum conhecimento em php mas não é minha especialidade.

 

Caso possa te ajudar em algo me avisa mas sugiro que seja mais preciso no que vc esta enfrentando problemas para que eu consiga te auxiliar.

 

TK

 

Olá!

 

Estou tentando adicionar o campo numero, para quando o cliente digite o endereço, tenha um campo para que especifique o numero de sua casa.

Link to comment
Share on other sites

  • 2 months later...

Ola a todos!
Inicialmente gostaria de agradecer pelo tutorial .... Funcionou 100% para o cadastro mas ainda estou com um problema. Como faço para acrescentar os novos campos no fechamento de compra, onde é feita a seleção de endereço de entrega e endereço de cobrança.

Ja tentei uma série de modificações mas nada de aparecer o numero e o complemento.

Alguém sabe que arquivo alterar para que as informações apareçam no fechamento de compra?

Muito obrigado desde ja ;)

 

Marcelo

Link to comment
Share on other sites

Ola a todos!

Inicialmente gostaria de agradecer pelo tutorial .... Funcionou 100% para o cadastro mas ainda estou com um problema. Como faço para acrescentar os novos campos no fechamento de compra, onde é feita a seleção de endereço de entrega e endereço de cobrança.

 

Ja tentei uma série de modificações mas nada de aparecer o numero e o complemento.

 

Alguém sabe que arquivo alterar para que as informações apareçam no fechamento de compra?

 

Muito obrigado desde ja ;)

 

Marcelo

 

Marcelo

 

Se vc adicionou os campos com sucesso, basta configurar o layout do endereço no País (Admin > Localização > Países : Escolher/Alterar o Brasil).

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...