JesseNaylor Posted December 18, 2012 Share Posted December 18, 2012 (edited) Buenos días, Estoy creando un formulario de contacto personalizado en una página que he creado dentro de una instalación de PrestaShop 1.4.8.3 que estoy personalizando. Este formulario no sustituye al formulario estándar de contact-form.tpl, sino que va a ser un formulario de asistencia específicamente para usuarios registrados. Por el momento, he realizado todos los pasos correctamente y mi página se muestra con el contenido deseado. He creado un directorio en la raíz de mi instalación, que a título de ejemplo voy a decir que es www.miprestashop.com/mipagina. Dentro de este directorio, he creado mi archivo index.php con el siguiente código: <?php global $smarty; include('../config/config.inc.php'); include('../header.php'); $smarty->display(dirname(__FILE__).'/index.tpl'); include('../footer.php'); ?> y mi archivo index.tpl que contiene la información HTML/CSS que quiero mostrar, y es aquí donde quiero insertar mi formulario. Hasta ahora, todo correcto. Una de las primeras cosas que he hecho es lo siguiente. Dado que solamente quiero mostrar este formulario a usuarios registrados, lo primero que hice fue poner el siguiente código: {if $logged} <!-- Aquí pongo todo el código de lo que quiero mostrar a mis usuarios logueados --> {else} <!-- Aquí pongo el mensaje que informa a mis usuarios que esta página solamente está disponible para usuarios que tienen cuenta y están logueados --> {/if} Esto sirve para mostrar un mensaje a los usuarios que no tienen cuenta o no han hecho login, mientras que para los que sí han hecho login les voy a mostrar mi formulario. Perfecto, esto funciona de maravilla. Pues bien, ya me estoy encontrando con algunos problemas, y creo que necesito un poco de ayuda. Para mostrar el formulario a los usuarios que solamente están logueados, he empezado directamente por copiar y pegar la parte del código de contact-form.tpl que sirve para mostrar el formulario de contacto estándar: {if isset($confirmation)} <p>{l s='Your message has been successfully sent to our team.'}</p> <ul class="footer_links"> <li><a href="{$base_dir}"><img class="icon" alt="" src="{$img_dir}icon/home.gif"/></a><a href="{$base_dir}">{l s='Home'}</a></li> </ul> {elseif isset($alreadySent)} <p>{l s='Your message has already been sent.'}</p> <ul class="footer_links"> <li><a href="{$base_dir}"><img class="icon" alt="" src="{$img_dir}icon/home.gif"/></a><a href="{$base_dir}">{l s='Home'}</a></li> </ul> {else} <p class="bold">{l s='For questions about an order or for more information about our products'}.</p> {include file="$tpl_dir./errors.tpl"} <form action="{$request_uri|escape:'htmlall':'UTF-8'}" method="post" class="std" enctype="multipart/form-data"> <fieldset> <h3>{l s='Send a message'}</h3> <p class="select"> <label for="id_contact">{l s='Subject Heading'}</label> {if isset($customerThread.id_contact)} {foreach from=$contacts item=contact} {if $contact.id_contact == $customerThread.id_contact} <input type="text" id="contact_name" name="contact_name" value="{$contact.name|escape:'htmlall':'UTF-8'}" readonly="readonly" /> <input type="hidden" name="id_contact" value="{$contact.id_contact}" /> {/if} {/foreach} </p> {else} <select id="id_contact" name="id_contact" onchange="showElemFromSelect('id_contact', 'desc_contact')"> <option value="0">{l s='-- Choose --'}</option> {foreach from=$contacts item=contact} <option value="{$contact.id_contact|intval}" {if isset($smarty.post.id_contact) && $smarty.post.id_contact == $contact.id_contact}selected="selected"{/if}>{$contact.name|escape:'htmlall':'UTF-8'}</option> {/foreach} </select> </p> <p id="desc_contact0" class="desc_contact"> </p> {foreach from=$contacts item=contact} <p id="desc_contact{$contact.id_contact|intval}" class="desc_contact" style="display:none;"> <label> </label>{$contact.description|escape:'htmlall':'UTF-8'} </p> {/foreach} {/if} <p class="text"> <label for="email">{l s='E-mail address'}</label> {if isset($customerThread.email)} <input type="text" id="email" name="from" value="{$customerThread.email}" readonly="readonly" /> {else} <input type="text" id="email" name="from" value="{$email}" /> {/if} </p> {if !$PS_CATALOG_MODE} {if (!isset($customerThread.id_order) || $customerThread.id_order > 0)} <p class="text"> <label for="id_order">{l s='Order ID'}</label> {if !isset($customerThread.id_order) && isset($isLogged) && $isLogged == 1} <select name="id_order" ><option value="0">{l s='-- Choose --'}</option>{$orderList}</select> {elseif !isset($customerThread.id_order) && !isset($isLogged)} <input type="text" name="id_order" id="id_order" value="{if isset($customerThread.id_order) && $customerThread.id_order > 0}{$customerThread.id_order|intval}{else}{if isset($smarty.post.id_order)}{$smarty.post.id_order|intval}{/if}{/if}" /> {elseif $customerThread.id_order > 0} <input type="text" name="id_order" id="id_order" value="{$customerThread.id_order|intval}" readonly="readonly" /> {/if} </p> {/if} {if isset($isLogged) && $isLogged} <p class="text"> <label for="id_product">{l s='Product'}</label> {if !isset($customerThread.id_product)} <select name="id_product" style="width:300px;"><option value="0">{l s='-- Choose --'}</option>{$orderedProductList}</select> {elseif $customerThread.id_product > 0} <input type="text" name="id_product" id="id_product" value="{$customerThread.id_product|intval}" readonly="readonly" /> {/if} </p> {/if} {/if} {if $fileupload == 1} <p class="text"> <label for="fileUpload">{l s='Attach File'}</label> <input type="hidden" name="MAX_FILE_SIZE" value="2000000" /> <input type="file" name="fileUpload" id="fileUpload" /> </p> {/if} <p class="textarea"> <label for="message">{l s='Message'}</label> <textarea id="message" name="message" rows="15" cols="20" style="width:340px;height:220px">{if isset($message)}{$message|escape:'htmlall':'UTF-8'|stripslashes}{/if}</textarea> </p> <p class="submit"> <input type="submit" name="submitMessage" id="submitMessage" value="{l s='Send'}" class="button_large" onclick="$(this).hide();" /> </p> </fieldset> </form> {/if} Curiosamente, cuando lo subo, lo recompilo y navego a mipagina/index y a contact-form y las comparo, veo que no me están mostrando lo mismo. Contact-form.tpl parece que está sacando de la base de datos más información que mipagina. Por ejemplo, ¿porqué contact-form me está publicando esto <input type="text" id="email" name="from" value="[email protected]" /> mientras que mipagina está publicando esto? <input type="text" id="email" name="from" value=""/> Necesitaría saber cómo extraer/publicar datos del usuario. ¿Cómo se extrae de la base de datos su e-mail, su nombre de usuario, etc, y qué tengo que hacer para mostrarlo correctamente en esta página? El formulario ni siquiera he probado a enviarlo todavía. ¿Cómo configuro a dónde se envía, con qué asunto, etc? Muchísimas gracias de antemano y espero que la información que estoy aportando le sea útil a los demás usuarios (he incluido algunos truqitos bastante interesantes, ¿eh? Jejeje...) ¡Respondedme lo antes posible, por favor! Edited December 18, 2012 by JesseNaylor (see edit history) Link to comment Share on other sites More sharing options...
JesseNaylor Posted December 19, 2012 Author Share Posted December 19, 2012 Bueno, antes de que me respondáis os diré que ya he encontrado una manera de añadir todos los formulario que querais en distintas páginas "custom" (propias, hechas por vosotros) de vuestro prestashop, sin hacer uso de ninguna función del formulario de contacto estándar. Es una solución un poco pegote, puesto que quería aprovechar el motor de email de PrestaShop, pero la solución me vale para los formularios que necesito crear. Más adelante, compartiré esta información, por si le es de utilidad a alguien. No obstante, si alguien tiene alguna respuesta a la pregunta inicial, bienvenida sea. 1 Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted December 19, 2012 Share Posted December 19, 2012 Bueno, antes de que me respondáis os diré que ya he encontrado una manera de añadir todos los formulario que querais en distintas páginas "custom" (propias, hechas por vosotros) de vuestro prestashop, sin hacer uso de ninguna función del formulario de contacto estándar. Es una solución un poco pegote, puesto que quería aprovechar el motor de email de PrestaShop, pero la solución me vale para los formularios que necesito crear. Más adelante, compartiré esta información, por si le es de utilidad a alguien. Comparte la informacion que comentas, nos vendra muy bien a todos. Un Saludo, Link to comment Share on other sites More sharing options...
JesseNaylor Posted December 19, 2012 Author Share Posted December 19, 2012 (edited) Vale, os pasaré la información completa en cuanto haya tenido tiempo (¡tengo que terminar este trabajo primero!) pero os voy adelantando una explicación "light" sobre lo que he hecho. Para empezar, este formulario quiero que parezca parte de la tienda online, por lo que el archivo index.php de mi directorio de formulario (www.miprestashop.com/mipagina/) lo he dejado así: <?php global $smarty; $miFormulario = "<form name=\"htmlform\" method=\"post\" action=\"miFormulario.php\" class=\"std\"> <!-- Aquí va todo el código HTML de mi formulario, donde obviamente escapo todas las comillas mediante \" (Esto es una variable que contiene el string entero) --> </form>"; // Comienza el código que une el PHP con PrestaShop global $smarty; include('../config/config.inc.php'); include('../header.php'); $smarty->assign('miFormulario', $miFormulario); $smarty->display(dirname(__FILE__).'/miPagina.tpl'); include('../footer.php'); ?> Nótese que hago un string con el formulario entero, y luego lo preparo para pasarlo a smarty en la página miPagina.tpl. Teneis que fijaros en un dato muy importante: action=\"miFormulario.php\". Este archivo no existe todavía, pero ya llegaremos a eso. Primero, vamos a crear el archivo miPagina.tpl, que va a contener la siguiente información: <!-- Primero incluyo los breadcrumbs y le digo que capture la ruta para mostrar esta página --> {capture name=path}miPagina{/capture} {include file="$tpl_dir./breadcrumb.tpl"} <!-- Aquí meto los diversos DIVs que quiero para darle estilo al contenido. Después de los DIVs, va el código que sirve para mostrar el formulario únicamente a usuarios logueados --> {if $logged} {if isset($miConfirmacion)} {$miConfirmacion} <!-- Mensaje de confirmación en caso de que el formulario de haya rellenado y enviado con éxito --> {else} {if isset($miError)} {$miError} <!-- Mensaje de error en caso de que haya fallos --> {/if} {$miFormulario} <!-- Esto ya lo conocemos. ¡Es el formulario que hemos creado en el archivo PHP anterior! --> {/if} {else} <!-- Aquí va el mensaje que vamos a mostrarle a usuarios que no han hecho login. Puedes meter todo el HTML/CSS que quieras --> {/if} <!-- y aquí cerramos los DIVs que hayamos abierto al principio --> Ok, ahora vamos a atar los cabos sueltos. Nos falta el archivo miFormulario.php, el cual vamos a crear ahora. Voy a asumir que estáis más o menos familiarizados con el sistema de mail de PHP, pero si no es así podéis encontrar cualquier ejemplo de formulario online que dirija el "action" hacia un archivo PHP que procesa la información. Allá va el código de miFormulario.php: <?php if(isset($_POST['email'])) { /* A PARTIR DE AQUÍ, PODÉIS METER TODO EL CÓDIGO QUE QUERÁIS, Y VA A VARIAR EN FUNCIÓN DEL FORMULARIO QUE HAYÁIS CREADO EN EL PRIMER PASO. Empezaría con algo así: $email_to = "[email protected]"; $email_subject = "Mi Asunto"; ... Y terminaría probablemente con lo siguiente, o algo similar: */ $headers = 'From: '.$email_from."\r\n". 'Reply-To: '.$email_from."\r\n" . 'X-Mailer: PHP/' . phpversion(); @mail($email_to, $email_subject, $email_message, $headers); /*Ahí ya termina nuestro código PHP que procesa el formulario y manda el mail, y ahora empieza lo nuevo: */ // Creamos variable para confirmación: $miConfirmacion = "Éste es un mensaje de confirmación que se mostrará en miPagina.tpl en caso de éxito, y además nos sirve para verificar que todo ha funcionado. "; } // Mostramos de nuevo la página: global $smarty; include('../config/config.inc.php'); include('../header.php'); $smarty->assign('miConfirmacion', $miConfirmacion); $smarty->display(dirname(__FILE__).'/miPagina.tpl'); include('../footer.php'); ?> Nótese que hemos creado una variable de confirmación que volvemos a enviar a la misma página miPagina.tpl desde la que veníamos, y eso nos sirve para que miPagina.tpl elija si debe mostrar el formulario cuando alguien entra o si debe mostrar el mensaje de confirmación puesto que el email ya está enviado. Al final me he extendido más de lo que pensaba extenderme; espero que lo haya dejado todo lo suficientemente claro. Espero no estar metiendo el patón pero me parece a mí que ésta es una forma cojonuda de añadir a PrestaShop todos los formularios que nos den la gana sin tener que comprarle un carísimo módulo a nadie. Lo siento, no es por desprestigiar el trabajo de nadie; simplemente creo que estamos usando PrestaShop porque es gratis, es Open Source, ¡y el mundo es más bonito si todos nos echamos una mano! Jaja... Si todo esto os parece muy laborioso, ¡a comprar un módulo de formularios! Edited December 19, 2012 by JesseNaylor (see edit history) Link to comment Share on other sites More sharing options...
jordiob Posted December 19, 2012 Share Posted December 19, 2012 Hola! Pero este form no guardará los datos en BD no? Hay un módulo que no es caro y que evita el engorro de tener que tocar código (muchas veces es un palo si no sabes cómo hacerlo) http://addons.prestashop.com/en/front-office-features-prestashop-modules/1313-Customizable-ContactForm.html 49,90 y puedes crear lo que quieras desde 0 Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted December 19, 2012 Share Posted December 19, 2012 Vale, os pasaré la información completa en cuanto haya tenido tiempo (¡tengo que terminar este trabajo primero!) pero os voy adelantando una explicación "light" sobre lo que he hecho. Para empezar, este formulario quiero que parezca parte de la tienda online, por lo que el archivo index.php de mi directorio de formulario (www.miprestashop.com/mipagina/) lo he dejado así: <?php global $smarty; $miFormulario = "<form name=\"htmlform\" method=\"post\" action=\"miFormulario.php\" class=\"std\"> <!-- Aquí va todo el código HTML de mi formulario, donde obviamente escapo todas las comillas mediante \" (Esto es una variable que contiene el string entero) --> </form>"; // Comienza el código que une el PHP con PrestaShop global $smarty; include('../config/config.inc.php'); include('../header.php'); $smarty->assign('miFormulario', $miFormulario); $smarty->display(dirname(__FILE__).'/miPagina.tpl'); include('../footer.php'); ?> Nótese que hago un string con el formulario entero, y luego lo preparo para pasarlo a smarty en la página miPagina.tpl. Teneis que fijaros en un dato muy importante: action=\"miFormulario.php\". Este archivo no existe todavía, pero ya llegaremos a eso. Primero, vamos a crear el archivo miPagina.tpl, que va a contener la siguiente información: <!-- Primero incluyo los breadcrumbs y le digo que capture la ruta para mostrar esta página --> {capture name=path}miPagina{/capture} {include file="$tpl_dir./breadcrumb.tpl"} <!-- Aquí meto los diversos DIVs que quiero para darle estilo al contenido. Después de los DIVs, va el código que sirve para mostrar el formulario únicamente a usuarios logueados --> {if $logged} {if isset($miConfirmacion)} {$miConfirmacion} <!-- Mensaje de confirmación en caso de que el formulario de haya rellenado y enviado con éxito --> {else} {if isset($miError)} {$miError} <!-- Mensaje de error en caso de que haya fallos --> {/if} {$miFormulario} <!-- Esto ya lo conocemos. ¡Es el formulario que hemos creado en el archivo PHP anterior! --> {/if} {else} <!-- Aquí va el mensaje que vamos a mostrarle a usuarios que no han hecho login. Puedes meter todo el HTML/CSS que quieras --> {/if} <!-- y aquí cerramos los DIVs que hayamos abierto al principio --> Ok, ahora vamos a atar los cabos sueltos. Nos falta el archivo miFormulario.php, el cual vamos a crear ahora. Voy a asumir que estáis más o menos familiarizados con el sistema de mail de PHP, pero si no es así podéis encontrar cualquier ejemplo de formulario online que dirija el "action" hacia un archivo PHP que procesa la información. Allá va el código de miFormulario.php: <?php if(isset($_POST['email'])) { /* A PARTIR DE AQUÍ, PODÉIS METER TODO EL CÓDIGO QUE QUERÁIS, Y VA A VARIAR EN FUNCIÓN DEL FORMULARIO QUE HAYÁIS CREADO EN EL PRIMER PASO. Empezaría con algo así: $email_to = "[email protected]"; $email_subject = "Mi Asunto"; ... Y terminaría probablemente con lo siguiente, o algo similar: */ $headers = 'From: '.$email_from."\r\n". 'Reply-To: '.$email_from."\r\n" . 'X-Mailer: PHP/' . phpversion(); @mail($email_to, $email_subject, $email_message, $headers); /*Ahí ya termina nuestro código PHP que procesa el formulario y manda el mail, y ahora empieza lo nuevo: */ // Creamos variable para confirmación: $miConfirmacion = "Éste es un mensaje de confirmación que se mostrará en miPagina.tpl en caso de éxito, y además nos sirve para verificar que todo ha funcionado. "; } // Mostramos de nuevo la página: global $smarty; include('../config/config.inc.php'); include('../header.php'); $smarty->assign('miConfirmacion', $miConfirmacion); $smarty->display(dirname(__FILE__).'/miPagina.tpl'); include('../footer.php'); ?> Nótese que hemos creado una variable de confirmación que volvemos a enviar a la misma página miPagina.tpl desde la que veníamos, y eso nos sirve para que miPagina.tpl elija si debe mostrar el formulario cuando alguien entra o si debe mostrar el mensaje de confirmación puesto que el email ya está enviado. Al final me he extendido más de lo que pensaba extenderme; espero que lo haya dejado todo lo suficientemente claro. Espero no estar metiendo el patón pero me parece a mí que ésta es una forma cojonuda de añadir a PrestaShop todos los formularios que nos den la gana sin tener que comprarle un carísimo módulo a nadie. Lo siento, no es por desprestigiar el trabajo de nadie; simplemente creo que estamos usando PrestaShop porque es gratis, es Open Source, ¡y el mundo es más bonito si todos nos echamos una mano! Jaja... Si todo esto os parece muy laborioso, ¡a comprar un módulo de formularios! Gracias por la información y el aporte. Link to comment Share on other sites More sharing options...
Recommended Posts