MaryDey Posted June 24, 2014 Share Posted June 24, 2014 (edited) Hola a todos! Es la primera vez que escribo aqui, pero he buscado y rebuscado y no encuentro ninguna solucion a mi problema. Necesito incorporar un formulario de contacto en la pagina de producto para que los usuarios puedan pedir informacion. He cogido el código de contact-form.tpl y lo he añadido a product.tpl, he conseguido que salga en la medida que quiero y queda muy bonito, pero no envía los mensajes y tampoco me dá ningun error. ¿Sabéis por que puede ser? ¿tengo que tocar algun archivo mas para que se pueda enviar los mensajes a traves de la pagina product.tpl ? Este es el codigo que he copiado en Product.tpl {capture name=path}{l s='Contact'}{/capture} <h3 class="bottom-indent"> {l s='Pedir Información sobre '}{$product->name|escape:'html':'UTF-8'} </h3> {if isset($confirmation)} <p class="alert alert-success" style="margin-top:80px;"><h1>{l s='Your message has been successfully sent to our team.'}</h1></p> <ul class="footer_links clearfix"> <li> <a class="btn btn-default button button-small" href="{$base_dir}"> <span> <i class="icon-chevron-left"></i>{l s='Home'} </span> </a> </li> </ul> {elseif isset($alreadySent)} <p class="alert alert-warning" style="margin-top:80px;">{l s='Your message has already been sent.'}</p> <ul class="footer_links clearfix"> <li> <a class="btn btn-default button button-small" href="{$base_dir}"> <span> <i class="icon-chevron-left"></i>{l s='Home'} </span> </a> </li> </ul> {else} {include file="$tpl_dir./errors.tpl"} <form action="{$request_uri|escape:'html':'UTF-8'}" method="post" class="contact-form-box" enctype="multipart/form-data"> <fieldset> <div class="clearfix" style="border: 1px solid #A6AAAD;padding: 7px;background-color: #056b8f;color: #fff;"> <div class="col-xs-12 col-md-3" style="width: 82%;"> <div class="form-group selector1"> <p class="form-group"> <label for="email">{l s='Correo Electrónico'}</label> {if isset($customerThread.email)} <input class="form-control grey" type="text" id="email" name="from" value="{$customerThread.email|escape:'html':'UTF-8'}" readonly="readonly" /> {else} <input class="form-control grey validate" type="text" id="email" name="from" data-validate="isEmail" value="{$email|escape:'html':'UTF-8'}" /> {/if} <input type="hidden" name="id_contact" value="{$contact.id_contact|intval}" /> </p> {if $fileupload == 1} <p class="form-group"> <label for="fileUpload">{l s='Attach File'}</label> <input type="hidden" name="MAX_FILE_SIZE" value="2000000" /> <input type="file" name="fileUpload" id="fileUpload" class="form-control" /> </p> {/if} </div> <div class="col-xs-12 col-md-9"> <div class="form-group"> <label for="message">{l s='Mensaje'}</label> <textarea class="form-control" id="message" name="message" style="line-height:2.42857; width:324px;">{if isset($message)}{$message|escape:'html':'UTF-8'|stripslashes}{/if}{$product->name|escape:'html':'UTF-8'}:</textarea> </div> </div> </div> <div class="submit"> <button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium" style=" background-color:#950341;"><span>{l s='Pedir Información'}<i class="icon-chevron-right right"></i></span></button> </div> </fieldset> </form> {/if} {addJsDefL name='contact_fileDefaultHtml'}{l s='No file selected' js=1}{/addJsDefL} {addJsDefL name='contact_fileButtonHtml'}{l s='Choose File' js=1}{/addJsDefL} Muchas gracias. Edited June 25, 2014 by SaraB (see edit history) 1 Link to comment Share on other sites More sharing options...
rsaiz Posted June 24, 2014 Share Posted June 24, 2014 Para eso yo tengo un módulo; no es una solución exacta a tu pregunta, pero quizá pueda interesarte: http://store.nemops.com/free-modules/32-ask-a-question.html#.U6lmv9N9hEI Añade una pestañita en la ficha del producto y los clientes pueden hacer preguntas y tú responderlas; y quedan públicas de manera que si más personas tienen dudas a lo mejor ya están resueltas. Un saludo. Link to comment Share on other sites More sharing options...
MaryDey Posted June 25, 2014 Author Share Posted June 25, 2014 Muchas Gracias Rsaiz por tu contestación, pero ese modulo ya lo he probado y no me sirve. He incorporado el formulario de contacto dentro de la ficha de producto (adjunto imagen) lo único que me debe de faltar algo en algún controller para que envíe el mensaje, por que sale todo bien, menos la acción submit. Tengo prestashop 1.6 y lo que he visto en los foros es para versiones anteriores y tampoco me vale. Link to comment Share on other sites More sharing options...
rsaiz Posted June 25, 2014 Share Posted June 25, 2014 Okis. Si sólo modificaste el tpl, tiene pinta de que tienes que modificar el controller que muestra la ficha del producto y añadir ahí lo necesario para que reciba el formulario y te envíe la confirmación; no sé si con copiar el postProcess de ContactController.php en ProductController sería suficiente... en caso de que no lo hayas probado ya, claro. Link to comment Share on other sites More sharing options...
MaryDey Posted June 25, 2014 Author Share Posted June 25, 2014 Ha funcionado lo que me has dicho, he copiado postProcess en ProductController y ahora ya envia los mensajes. Muchas Gracias rsaiz!!! Me has salvado la vida! Link to comment Share on other sites More sharing options...
rsaiz Posted June 25, 2014 Share Posted June 25, 2014 Genial, ¡me alegro! Si puedes, edita el titulo del tema para marcarlo como solucionado y que lo cierre algún moderador si pasa por aquí (editando el primer mensaje, pulsando en editar, y después en "Usar editor completo", añadiendo la palabra "Solucionado" al titulo, esto ayudara, a mantener una mayor organización en el foro). Link to comment Share on other sites More sharing options...
MaryDey Posted June 25, 2014 Author Share Posted June 25, 2014 Vale, ya está hecho! Gracias otra vez por tu ayuda y por explicar las cosas tan claras. Un saludo! Link to comment Share on other sites More sharing options...
hgarcia Posted December 18, 2014 Share Posted December 18, 2014 Hola. Sé que este post está cerrado desde hace 6 meses. Quería agradecer publicamente a @MaryDey y @rsaiz por el mismo, además de agregar mi granito de arena. Después de una tarde de frustración, y una mañana completa de investigación y pruebas en una tienda Version 1.6.09, por fin pude tener un form de contacto en la página de producto. Me tomo la libertad de publicar mis resultados aquí, a manera de contribución y complemento al post. Voy por pasos largos: product.tpl Primero, me pareció mejor organizado poner el form de contacto del lado izquierdo, en ése espacio vacío entre las imagenes del producto, y la sección de más información. Así, en product.tpl, busqué el div correspondiente: <!-- left infos--> <div class="pb-left-column col-xs-12 col-sm-4 col-md-5"> y, al final del mismo justo antes del </div> de cierre puse el mismo código de @MaryDey, al cual, después de generarme varios errores, le hice cambios: {* product contact form *} <h3 class="bottom-indent"> {l s='Request info about '}{$product->name|escape:'html':'UTF-8'} </h3> {if isset($confirmation)} <p class="alert alert-success" style="margin-top:80px;"><h1>{l s='Your message has been successfully sent to our team.'}</h1></p> <ul class="footer_links clearfix"> <li> <a class="btn btn-default button button-small" href="{$base_dir}"> <span> <i class="icon-chevron-left"></i>{l s='Home'} </span> </a> </li> </ul> {elseif isset($alreadySent)} <p class="alert alert-warning" style="margin-top:80px;">{l s='Your message has already been sent.'}</p> <ul class="footer_links clearfix"> <li> <a class="btn btn-default button button-small" href="{$base_dir}"> <span> <i class="icon-chevron-left"></i>{l s='Home'} </span>sobre </a> </li> </ul> {else} {include file="$tpl_dir./errors.tpl"} <form action="{$request_uri|escape:'html':'UTF-8'}" method="post" class="contact-form-box" enctype="multipart/form-data"> <fieldset> <div class="clearfix" style="border: 1px solid #A6AAAD;padding: 7px;background-color: #056b8f;color: #fff;"> <div class="col-xs-12 col-md-3" style="width: 82%;"> <div class="form-group selector1"> <p class="form-group"> <label for="email">{l s='Email address'}</label> {if isset($customerThread.email)} <input class="form-control grey" type="text" id="email" name="from" value="{$customerEmail|escape:'html':'UTF-8'}" readonly="readonly" /> {else} <input class="form-control grey validate" type="text" id="email" name="from" data-validate="isEmail" value="{$customerEmail|escape:'html':'UTF-8'}" /> {/if} <input type="hidden" name="id_contact" value="2" /> <input type="hidden" name="id_product" value="{$product->id|intval}" /> </p> </div> <div class="col-xs-12 col-md-9"> <div class="form-group"> <label for="message">{l s='Message'}</label> <textarea class="form-control" id="message" name="message" style="line-height:2.42857; width:324px;">{if isset($message)}{$message|escape:'html':'UTF-8'|stripslashes}{/if}{$product->name|escape:'html':'UTF-8'}:</textarea> </div> </div> </div> <div class="submit"> <button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium" style=" background-color:#950341;"><span>{l s='Send'}<i class="icon-chevron-right right"></i></span></button> </div> </fieldset> </form> {/if} {* end contact form *} A simple vista se puede apreciar que eliminé la primera línea: {capture name=path}{l s='Contact'}{/capture} Esto para evitar que la pequeña barrita de navegación, justo abajo del menú horizontal sea la que le corresponde al producto, y no la que se muestra en el contact form. También se puede observar que regresé los textos dentro del tpl a su version original en Inglés. Ésto para permitirme traducir los mismos desde el menu de traducciones, lo mostraré mas adelante. Product no tiene acceso ni a $customerThread.email, tampoco a $email; por lo que genera un error. Así, en los dos input text con id="email" (lineas 192 y 194 del código que puse arriba ) cambié sus propiedades value a value="{$customerEmail|escape:'html':'UTF-8'}" En las lineas 196 y 197, tenemos lo siguiente: <input type="hidden" name="id_contact" value="2" /> <input type="hidden" name="id_product" value="{$product->id|intval}" /> Esto es importante: El valor de id_contact lo puse a 2, corresponde a la dirección de correo de Servicio a Cliente en mi tienda, configurado en el menú Clientes, Contacto. También aquí se generaba un error al no estar accesibles los id de contacto en el entorno del producto. La segunda línea de código, me sirve para pasarle el id del producto al controller, para poder enviar el mensaje de acuerdo al mismo También lo veremos más adelante. Por último, las dos lineas addJsDefL al final del código de @MaryDey, las puse hasta el final de product.tpl justo antes del {/strip} {addJsDefL name='contact_fileDefaultHtml'}{l s='No file selected' js=1}{/addJsDefL} {addJsDefL name='contact_fileButtonHtml'}{l s='Choose File' js=1}{/addJsDefL} {/strip} {/if} Aunque, en mi modificación, me parece que éstas llamadas no son necesarias, veremos el por qué más adelante. Sigamos ahora con ProductController.php La función postProcess(), la puse justo después de protected $category; y arriba de la funcion setMedia() Aquí la función modificada, con las instrucciones que eliminé comentadas: /** * Start forms process * @see FrontController::postProcess() * Agregar contact form a product */ public function postProcess() { if (Tools :: isSubmit('submitMessage')) { /*$extension = array('.txt', '.rtf', '.doc', '.docx', '.pdf', '.zip', '.png', '.jpeg', '.gif', '.jpg');*/ /*$fileAttachment = Tools::fileAttachment('fileUpload');*/ $message = Tools :: getValue('message'); // Html entities is not usefull, iscleanHtml check there is no bad html tags. /*$id_contact = (int)(Tools::getValue('id_contact'));*/ if (!($from = trim(Tools :: getValue('from'))) || !Validate :: isEmail($from)) $this->errors[] = Tools :: displayError('Invalid email address.'); else if (!$message) $this->errors[] = Tools :: displayError('The message cannot be blank.'); else if (!Validate :: isCleanHtml($message)) $this->errors[] = Tools :: displayError('Invalid message'); else if (!($id_contact = (int) (Tools :: getValue('id_contact'))) || !(Validate :: isLoadedObject($contact = new Contact($id_contact, $this->context->language->id)))) $this->errors[] = Tools :: displayError('Please select a subject from the list provided. '); /*else if (!empty($fileAttachment['name']) && $fileAttachment['error'] != 0) $this->errors[] = Tools::displayError('An error occurred during the file-upload process.'); else if (!empty($fileAttachment['name']) && !in_array( Tools::strtolower(substr($fileAttachment['name'], -4)), $extension) && !in_array( Tools::strtolower(substr($fileAttachment['name'], -5)), $extension)) $this->errors[] = Tools::displayError('Bad file extension');*/ else { $customer = $this->context->customer; if (!$customer->id) $customer->getByEmail($from); $contact = new Contact($id_contact, $this->context->language->id); /*$id_order = (int) $this->getOrder();*/ $id_order = 0; if (!((($id_customer_thread = (int) Tools :: getValue('id_customer_thread')) && (int) Db :: getInstance()->getValue(' SELECT cm.id_customer_thread FROM ' . _DB_PREFIX_ . 'customer_thread cm WHERE cm.id_customer_thread = ' . (int) $id_customer_thread . ' AND cm.id_shop = ' . (int) $this->context->shop->id . ' AND token = \'' . pSQL(Tools :: getValue('token')) . '\'')) || ($id_customer_thread = CustomerThread :: getIdCustomerThreadByEmailAndIdOrder($from, $id_order)))) { $fields = Db :: getInstance()->executeS(' SELECT cm.id_customer_thread, cm.id_contact, cm.id_customer, cm.id_order, cm.id_product, cm.email FROM ' . _DB_PREFIX_ . 'customer_thread cm WHERE email = \'' . pSQL($from) . '\' AND cm.id_shop = ' . (int) $this->context->shop->id . ' AND (' . ($customer->id ? 'id_customer = ' . (int) ($customer->id) . ' OR ' : '') . ' id_order = ' . (int) $id_order . ')'); $score = 0; foreach ($fields as $key => $row) { $tmp = 0; if ((int) $row['id_customer'] && $row['id_customer'] != $customer->id && $row['email'] != $from) continue; if ($row['id_order'] != 0 && $id_order != $row['id_order']) continue; if ($row['email'] == $from) $tmp += 4; if ($row['id_contact'] == $id_contact) $tmp++; if (Tools :: getValue('id_product') != 0 && $row['id_product'] == Tools :: getValue('id_product')) $tmp += 2; if ($tmp >= 5 && $tmp >= $score) { $score = $tmp; $id_customer_thread = $row['id_customer_thread']; } } } $old_message = Db :: getInstance()->getValue(' SELECT cm.message FROM ' . _DB_PREFIX_ . 'customer_message cm LEFT JOIN ' . _DB_PREFIX_ . 'customer_thread cc on (cm.id_customer_thread = cc.id_customer_thread) WHERE cc.id_customer_thread = ' . (int) ($id_customer_thread) . ' AND cc.id_shop = ' . (int) $this->context->shop->id . ' ORDER BY cm.date_add DESC'); if ($old_message == $message) { $this->context->smarty->assign('alreadySent', 1); $contact->email = ''; $contact->customer_service = 0; } if ($contact->customer_service) { if ((int) $id_customer_thread) { $ct = new CustomerThread($id_customer_thread); $ct->status = 'open'; $ct->id_lang = (int) $this->context->language->id; $ct->id_contact = (int) ($id_contact); $ct->id_order = (int) $id_order; if ($id_product = (int) Tools :: getValue('id_product')) $ct->id_product = $id_product; $ct->update(); } else { $ct = new CustomerThread(); if (isset ($customer->id)) $ct->id_customer = (int) ($customer->id); $ct->id_shop = (int) $this->context->shop->id; $ct->id_order = (int) $id_order; if ($id_product = (int) Tools :: getValue('id_product')) $ct->id_product = $id_product; $ct->id_contact = (int) ($id_contact); $ct->id_lang = (int) $this->context->language->id; $ct->email = $from; $ct->status = 'open'; $ct->token = Tools :: passwdGen(12); $ct->add(); } if ($ct->id) { $cm = new CustomerMessage(); $cm->id_customer_thread = $ct->id; $cm->message = $message; /*if (isset ($fileAttachment['rename']) && !empty ($fileAttachment['rename']) && rename($fileAttachment['tmp_name'], _PS_UPLOAD_DIR_ . basename($fileAttachment['rename']))) { $cm->file_name = $fileAttachment['rename']; @ chmod(_PS_UPLOAD_DIR_ . basename($fileAttachment['rename']), 0664); }*/ $cm->ip_address = ip2long(Tools :: getRemoteAddr()); $cm->user_agent = $_SERVER['HTTP_USER_AGENT']; if (!$cm->add()) $this->errors[] = Tools :: displayError('An error occurred while sending the message.'); } else $this->errors[] = Tools :: displayError('An error occurred while sending the message.'); } if (!count($this->errors)) { $var_list = array ( '{message}' => Tools :: nl2br(stripslashes($message)), '{email}' => $from, '{product_name}' => '', ); /*if (isset ($fileAttachment['name'])) $var_list['{attached_file}'] = $fileAttachment['name'];*/ $id_product = (int) Tools :: getValue('id_product'); /*if (isset ($ct) && Validate :: isLoadedObject($ct) && $ct->id_order) { $order = new Order((int) $ct->id_order); $var_list['{order_name}'] = $order->getUniqReference(); $var_list['{id_order}'] = (int) $order->id; }*/ if ($id_product) { $product = new Product((int) $id_product); if (Validate :: isLoadedObject($product) && isset ($product->name[Context :: getContext()->language->id])) $var_list['{product_name}'] = $product->name[Context :: getContext()->language->id]; } if (empty ($contact->email)) /*Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, null, null, $fileAttachment);*/ Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, null, null, null); else { /*if (!Mail :: Send($this->context->language->id, 'contact', Mail :: l('Message from contact form') . ' [no_sync]', $var_list, $contact->email, $contact->name, $from, ($customer->id ? $customer->firstname . ' ' . $customer->lastname : ''), $fileAttachment) || !Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, $contact->email, $contact->name, $fileAttachment)) $this->errors[] = Tools :: displayError('An error occurred while sending the message.');*/ if (!Mail :: Send($this->context->language->id, 'contact', Mail :: l('Request info about product: ') . $product->name[Context :: getContext()->language->id], $var_list, $contact->email, $contact->name, $from, ($customer->id ? $customer->firstname . ' ' . $customer->lastname : ''), null) || !Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, $contact->email, $contact->name, null)) $this->errors[] = Tools :: displayError('An error occurred while sending the message.'); } } if (count($this->errors) > 1) array_unique($this->errors); else $this->context->smarty->assign('confirmation', 1); } } } /* Fin contact form en producto */ Casi todos los cambios que realicé en éste código, se limitan a quitar información innecesaria: archivos adjuntos, y numero de orden; todas las líneas encerradas en comentario son relacionadas con éstas omisiones. Por ésta razón, me parecieron innecesarias las dos llamadas a addJsDefL en el .tpl Agregué, en la línea 71, una asignación en cero para el número de orden, comentando la instrucción original: /*$id_order = (int) $this->getOrder();*/ $id_order = 0; En las líneas 155-160, eliminé del array la información de archivo adjunto y numero de orden: $var_list = array ( '{message}' => Tools :: nl2br(stripslashes($message)), '{email}' => $from, '{product_name}' => '', ); En las lineas 181 y 186, cambié los comandos Mail, eliminando los adjuntos, y cambiando el nombre de las plantillas de correo a enviar. Aquí también hay un pequeño cambio en el subject del mensaje, agregándo el nombre del producto al mismo. ¿Se acuerdan del campo hidden que puse en el tpl con el id del producto? Para ésto sirvió if (empty ($contact->email)) /*Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, null, null, $fileAttachment);*/ Mail :: Send($this->context->language->id, 'contact_form_product', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, null, null, null); else { /*if (!Mail :: Send($this->context->language->id, 'contact', Mail :: l('Message from contact form') . ' [no_sync]', $var_list, $contact->email, $contact->name, $from, ($customer->id ? $customer->firstname . ' ' . $customer->lastname : ''), $fileAttachment) || !Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, $contact->email, $contact->name, $fileAttachment)) $this->errors[] = Tools :: displayError('An error occurred while sending the message.');*/ if (!Mail :: Send($this->context->language->id, 'contact_product', Mail :: l('Request info about product: ') . $product->name[Context :: getContext()->language->id], $var_list, $contact->email, $contact->name, $from, ($customer->id ? $customer->firstname . ' ' . $customer->lastname : ''), null) || !Mail :: Send($this->context->language->id, 'contact_form', ((isset ($ct) && Validate :: isLoadedObject($ct)) ? sprintf(Mail :: l('Your message has been correctly sent #ct%1$s #tc%2$s'), $ct->id, $ct->token) : Mail :: l('Your message has been correctly sent')), $var_list, $from, null, $contact->email, $contact->name, null)) $this->errors[] = Tools :: displayError('An error occurred while sending the message.'); } Se puede observar que los nombres de los archivos de plantilla son: contact_form_product y contact_product lo que nos lleva al siguiente paso plantillas de correo Simplemente, dentro de la carpeta mails/idioma de la tienda ( en mi caso, mx) copié los archivos contact.html, contact.txt, contact_form.html y contact_form.txt a sus nuevos nombres, como lo especifiqué más arriba: contact_product.html, contact_product.txt, contact_form_product.html y contact_form_product.txt. Aquí un detalle de los archivos desde filezilla Después de eso (o antes), con un editor abrí cada uno de los archivos *_product.* y eliminé la información de id del pedido y archivo adjunto. En el caso de los .html, ésta se encuentra dentro de secciones <span>. En el caso de los txt, son líneas simples, fáciles de identificar. No muestro detalles de éstos cambios, ya que son simples de hacer. traducciones Como comenté más arriba, dejé los mensajes a cliente en el .tpl en su formato original en inglés, con el fin de traducirlos desde el menú de traducciones, pues bien, en el back, me voy al menú Localización, Traducciones. Allí selecciono Traducciones del Fron Office, Mi tema e idioma defecto y le doy click a Modificar. Después, busco la sección Product y aquí la tenemos, mostrando en rojo los nuevos campos añadidos Ahora, lo único que falta, es jugar con las hojas de estilo para personalizar la apariencia. Pero eso, es otro boleto Pues eso es todo. Espero que a los que lean éste post les sea tan útil como a mí. Por último, me obligo a poner mi DISCLAIMER La información, códigos y procesos aquí vertida es, opinión meramente personal. Se proporciona *tal cual* y no otorga ningún derecho ni obligación. Saludos!! 3 Link to comment Share on other sites More sharing options...
Recommended Posts