Scripts y consultas SQL interesantes de Plesk 10

0

¿Un cliente llama con problemas en uno de sus buzones de correo? No hay problema. En lugar de ir preguntando la contraseña, podemos averiguarla nosotros mismos, utilizando uno de los scripts que el CLI de Plesk 10 incorpora, así que accedemos por SSH a nuestro servidor y lo lanzamos. En esta entrada iremos actualizando con los scripts que veamos interesantes, conforme los vayamos descubriendo.

/usr/local/psa/admin/bin/mail_auth_view: Muestra en la salida estándar una tabla con todos los buzones de correo, el estado de la cuenta y la contraseña.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "use psa; select sys_users.home, sys_users.login, accounts.password from accounts INNER JOIN sys_users ON accounts.id=sys_users.account_id;": Muestra una lista de los usuarios y contraseñas FTP, el directorio raíz (que nos da una pista del dominio o subdominio al que acceden), y su contraseña.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "USE psa; SELECT domains.name AS domain_name, data_bases.name AS database_name, db_users.login, accounts.password FROM data_bases, db_users, domains, accounts WHERE data_bases.dom_id = domains.id AND db_users.db_id = data_bases.id AND db_users.account_id = accounts.id ORDER BY domain_name;": Muestra una lista con el dominio, nombre de la base de datos, usuario y contraseña de todas las bases de datos registradas en Plesk.

for i in `mysql -uadmin -p\`cat /etc/psa/.psa.shadow\` psa -Ns -e "select concat(mail.mail_name,\"@\",domains.name) as address from mail,domains,accounts where mail.dom_id=domains.id and mail.account_id=accounts.id order by address"`; do /usr/local/psa/bin/spamassassin -u $i -status true -action move -modify-subj false; done: Activar el sistema de detección de correo basura Spamassassin en todas las cuentas, configurado para mover los mensajes sospechosos a una carpeta específica y sin modificar el asunto.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "USE psa; SELECT cl.type, cl.login, acc.password FROM clients cl, accounts acc WHERE acc.id = cl.account_id;": Obtiene todos los nombres de usuario y contraseñas de clientes y revendedores.

Eliminar pedidos desde el Backend de Magento

0

Magento no dispone de un sistema para eliminar los pedidos. Permite cambiarles es estado a “Cancelar” pero no borrarlos.

Para eso existen componentes que no permiten hacerlo.
Hemos probado la siguiente con resultados satisfactorios

http://www.magentocommerce.com/magento-connect/seamless-delete-order.html

Una vez instalado añade una nueva opción el las acciones de los pedidos.

Eliminar pedidos de prueba y clientes de prueba de Magento

0

Con Magento es normal hacer pruebas en una tienda que luego se pasa a producción.
Al haber configurado multiples parametros (metodos de envio, metodos de pago….) es indispensable pasar la base de datos de test a producción pasando también todas las pruebas.

Magento no lleva de serie un sistema para borrar pedidos. Aun así la manera mas fácil sería borrarlos de golpe mediante SQL.

Aquí tenemos el script necesario para eliminar los pedidos de prueba de Magento. Para las ordenes elegiremos el que necesitemos según nuestra base de datos

/* reset orders 1 */
TRUNCATE `sales_order`;
TRUNCATE `sales_order_datetime`;
TRUNCATE `sales_order_decimal`;
TRUNCATE `sales_order_entity`;
TRUNCATE `sales_order_entity_datetime`;
TRUNCATE `sales_order_entity_decimal`;
TRUNCATE `sales_order_entity_int`;
TRUNCATE `sales_order_entity_text`;
TRUNCATE `sales_order_entity_varchar`;
TRUNCATE `sales_order_int`;
TRUNCATE `sales_order_text`;
TRUNCATE `sales_order_varchar`;
TRUNCATE `sales_quote`;
TRUNCATE `sales_quote_address`;
TRUNCATE `sales_quote_address_decimal`;
TRUNCATE `sales_quote_address_int`;
TRUNCATE `sales_quote_address_text`;
TRUNCATE `sales_quote_address_varchar`;
TRUNCATE `sales_quote_decimal`;
TRUNCATE `sales_quote_entity`;
TRUNCATE `sales_quote_entity_datetime`;
TRUNCATE `sales_quote_entity_decimal`;
TRUNCATE `sales_quote_entity_int`;
TRUNCATE `sales_quote_entity_text`;
TRUNCATE `sales_quote_entity_varchar`;
TRUNCATE `sales_quote_int`;
TRUNCATE `sales_quote_item`;
TRUNCATE `sales_quote_item_decimal`;
TRUNCATE `sales_quote_item_int`;
TRUNCATE `sales_quote_item_text`;
TRUNCATE `sales_quote_item_varchar`;
TRUNCATE `sales_quote_rule`;
TRUNCATE `sales_quote_text`;
TRUNCATE `sales_quote_varchar`;
TRUNCATE `sendfriend_log`;
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
TRUNCATE `tag_summary`;
TRUNCATE `wishlist`;
TRUNCATE `log_quote`;
TRUNCATE `report_event`;

ALTER TABLE `sales_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_address_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_address_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_address_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_address_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_item_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_item_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_item_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_item_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_rule` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_quote_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1;
ALTER TABLE `tag` AUTO_INCREMENT=1;
ALTER TABLE `tag_relation` AUTO_INCREMENT=1;
ALTER TABLE `tag_summary` AUTO_INCREMENT=1;
ALTER TABLE `wishlist` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
ALTER TABLE `report_event` AUTO_INCREMENT=1;

/* reset orders 2*/
SET FOREIGN_KEY_CHECKS=0;

TRUNCATE `sales_flat_creditmemo`;
TRUNCATE `sales_flat_creditmemo_comment`;
TRUNCATE `sales_flat_creditmemo_grid`;
TRUNCATE `sales_flat_creditmemo_item`;
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_comment`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
TRUNCATE `sales_flat_shipment`;
TRUNCATE `sales_flat_shipment_comment`;
TRUNCATE `sales_flat_shipment_grid`;
TRUNCATE `sales_flat_shipment_item`;
TRUNCATE `sales_flat_shipment_track`;
TRUNCATE `sales_invoiced_aggregated`;            # ??
TRUNCATE `sales_invoiced_aggregated_order`;        # ??
TRUNCATE `log_quote`;
 
ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;

/* reset customers */
TRUNCATE `customer_address_entity`;
TRUNCATE `customer_address_entity_datetime`;
TRUNCATE `customer_address_entity_decimal`;
TRUNCATE `customer_address_entity_int`;
TRUNCATE `customer_address_entity_text`;
TRUNCATE `customer_address_entity_varchar`;
TRUNCATE `customer_entity`;
TRUNCATE `customer_entity_datetime`;
TRUNCATE `customer_entity_decimal`;
TRUNCATE `customer_entity_int`;
TRUNCATE `customer_entity_text`;
TRUNCATE `customer_entity_varchar`;
TRUNCATE `log_customer`;
TRUNCATE `log_visitor`;
TRUNCATE `log_visitor_info`;

ALTER TABLE `customer_address_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;

-- Reset all ID counters
TRUNCATE `eav_entity_store`;
ALTER TABLE  `eav_entity_store` AUTO_INCREMENT=1;

Exportación de contactos de MailEnable a RoundCube

0

MailEnable permite la importación de contactos a partir de un fichero CSV, pero no así la exportación, de forma que lo que el usuario introduce no tiene forma de extraerlo posteriormente. A no ser que sea el administrador, claro, en cuyo caso lo puede hacer a partir de los ficheros vCard que se encuentran en C:\plesk\Mail Servers\Mail Enable\Postoffices\dominio.tld\MAILROOT\usuario en el caso de un servidor con Plesk 9.

Estos ficheros requieren algo de procesamiento para poder dejarlos al gusto de RoundCube, ya que éste es capaz de importar un único fichero vCard con todos los contactos juntos, en UTF-8 sin utilizar codificación QP. Así, pues, mediante las siguientes líneas de Python y un par de comandos, lo podemos dejar correctamente.

# This Python file uses the following encoding: utf-8
'''
qputf8: Elimina el quoted printable UTF-8 de un fichero
Created on 17/10/2011
@author: Vicente Monroig (Digital Disseny)
'''

import os
import sys

# Obtenemos la ruta donde se está ejecutando el archivo
ruta = os.path.dirname(os.path.abspath(__file__)) + '/'
# Recogemos los parámetros de entrada o mostramos la ayuda
if (len(sys.argv) > 1):
    entrada = sys.argv[1]
    if (len(sys.argv) > 2):
        salida = sys.argv[2]
    else:
        salida = entrada + '.OK'
    print "Procesando fichero " + entrada + "..."
    fentrada = open(ruta + entrada, "r")
    fsalida = open(ruta + salida, "w")
    lista = []
    while True:
        linorig = fentrada.readline()
        if not linorig: break
        # Si hay una cadena UTF-8, la procesamos
        lin = linorig.replace('=?UTF-8?Q?', '')
        if (lin != linorig):
            lin = lin.replace('=C3=80', 'À')
            lin = lin.replace('=C3=81', 'Á')
            lin = lin.replace('=C3=88', 'È')
            lin = lin.replace('=C3=89', 'É')
            lin = lin.replace('=C3=8C', 'Ì')
            lin = lin.replace('=C3=8D', 'Í')
            lin = lin.replace('=C3=92', 'Ò')
            lin = lin.replace('=C3=93', 'Ó')
            lin = lin.replace('=C3=99', 'Ù')
            lin = lin.replace('=C3=9A', 'Ú')
            lin = lin.replace('=C3=87', 'Ç')
            lin = lin.replace('=C3=91', 'Ñ')
            lin = lin.replace('=C3=A0', 'à')
            lin = lin.replace('=C3=A1', 'á')
            lin = lin.replace('=C3=A8', 'è')
            lin = lin.replace('=C3=A9', 'é')
            lin = lin.replace('=C3=AC', 'ì')
            lin = lin.replace('=C3=AD', 'í')
            lin = lin.replace('=C3=B2', 'ò')
            lin = lin.replace('=C3=B3', 'ó')
            lin = lin.replace('=C3=B9', 'ù')
            lin = lin.replace('=C3=BA', 'ú')
            lin = lin.replace('=C3=A7', 'ç')
            lin = lin.replace('=C3=B1', 'ñ')
            lin = lin.replace('=C2=AA', 'ª')
            lin = lin.replace('=C2=BA', 'º')
            lin = lin.replace('?=', '')
        # De paso, cambiamos los _ por espacios, con cuidado con las direcciones de e-mail
        if (not '@' in lin):
            lin = lin.replace('_', ' ')
        if (lin != linorig):
            print "Sustituída la línea " + linorig + " por " + lin + "."
        fsalida.write(lin)
    fentrada.close()
    fsalida.close()
    print("Fichero " + salida + " generado en %s." % ruta)
else:
    print """
Información:
    qputf8 es una pequeña utilidad que busca y elimina las cadenas codificadas como quoted printable en UTF-8
    dentro de un fichero de texto, transformándolo a su equivalente de texto "normal". Así, por ejemplo:
        ?UTF-8?Q?G=C3=B3mez_Domin=C3=B3?=;
    pasa a ser
        Gómez Dominó;
Uso:
    qputf8.py  []
       """

Con los siguientes comandos ejecutamos la utilidad en todos los ficheros y después creamos un único vCard:

find contactos/*.VCF -exec python qputf8.py {} \;
cat contactos/*.VCF.OK > todos.VCF

En cuanto a los grupos, no he encontrado nada, aunque tampoco le he dedicado mucho tiempo, así que cualquier sugerencia es bienvenida.

Uso de Apache::ASP en servidores Linux

0

A raíz de la migración de nuestro antiguo servidor Windows a uno nuevo con Ubuntu, y la necesidad de seguir alojando ciertas aplicaciones desarrolladas en ASP clásico, nos hemos visto en la necesidad de intentar que Apache procese correctamente estas páginas. Para ello, en Plesk 10 disponemos de la posibilidad de activar Apache::ASP.

Antes de que nadie se haga ilusiones, sólo sirve para pequeños desarrollos en ASP clásico. Si se utilizan scripts complejos en el servidor o si utilizamos componentes de terceros, como Persits AspEmail, ya nos podemos ir olvidando.

Si aun así te interesa probarlo, un par de apuntes al respecto:

  • Distingue mayúsculas de minúsculas. Mucho ojo con esto, porque tanto las directivas SSI, realizadas con <!--#include file="fichero" --> como el nombre del fichero, deben estar en minúsculas en el código, y en el caso del fichero de forma exacta a como esté en el disco.
  • El documento raíz (default.asp en un servidor Windows), hay que configurarlo, ya que si no te encontrarás con que sigue buscando index.htm o index.html únicamente. Así, con un fichero .htaccess con el siguiente contenido es suficiente:
DirectoryIndex index.asp
  • Sólo soporta scripting en Perl, que es como está desarrolado el módulo. No hemos encontrado solución a esto, de forma que el código tendrá que ser transformado desde VBScript o JScript. Había soluciones bastante prometedoras, como mod_VB o el servidor específico de ChiliSoft! -> Sun ASP One -> Oracle (?), pero hace tiempo que se dejó de invertir en ellas.

Así pues, si alguien se encuentra en esta situación, es momento de considerar muy seriamente un cambio de página web, que esto en 10 años cambia totalmente y ahora hay CMS de código abierto maravillosos. Si no es posible esto, pues quizá un cambio de ASP a PHP podría resultar suficiente, y quizá ASP2PHP pueda resultar de ayuda.

Tienda multi idioma con Magento

6

Si una tienda quiere ser realmente competitiva en internet es recomendable que sea multi-idioma con, como minimo, el idioma nativo e inglés.

Magento trae de serí un fantastico sistema de traducción.
Lo primero es tener claro el concepto “Vista de una tienda”. Mediante las vistas de una tienda se puede controlar lo que se muestra según la vista, pudiendo por ejemplo mostrar unos productos u otros según la opción. De todos modos el potencial y su uso real suele ser para las traducciones.

Para generar una nueva vista los pasos son

  1. Ir al menú Sistema/Configuración de tiendas
  2. Pulsar sobre el botón “Crear una vista de tienda”

Al pulsar sobre esta opción seremos redirigidos a una nueva ventana donde se nos pedira:

  1. Tienda: Magento es también multi-tieda. Tendremos que seleccionar la tienda sobre la que queremos hacer la vista. Lo normal es tener solo una
  2. Nombre: Nombre de la vista. Es lo que se mostrará en el desplegable de idiomas. Para nuestro ejemplo pondremos English.
  3. Código: Codigo interno para saber en que vista estamos. Está bien seguir una nomenclatura tipo nombretienda_idioma (p.e. tienda_en)
  4. Estado: Indica si se activa o no esa vista en el frontend
  5. Ordenar: Es el orden el que se quiere mostrar en el combo de idiomas

 

Una vez completado guardamos los cambios.

Ya tenemos creada la vista pero ¡no le hemos dicho nada del idioma!,  ¿donde se especifica?

Para especificar el idioma de la vista hay que hacer lo siguiente:

  1. Ir al menú Sistema/Configuración
  2. En el combo “Alcance de la configuración actual” situado a la izquierda, seleccionar la vista que queremos
  3. En el menu de la izquierda “General/General” seleccionar la opción “Locale Options” y cambiar el idioma en la opción “Local”. Por defecto hereda la de la tienda. Habra que quitar el check “Use Website” y cambiar al deseado.

Este mismo paso lo podemos realizar para cualquier otra configuración, como por ejemplo para el pais por defecto.

Solo nos queda guardar los cambios y si todo está habilitado nos aparecerá el nuevo idioma en el frontend.

 

Comentar que para traducir tanto, productos, como categorias, como CMS todo se basa en la elección de la vista.

 

Instalación del webmail Roundcube en Plesk 10

5

La versión 10 de Plesk incluye en su versión Linux dos posibles webmail. Una es Horde, que si bien está bastante avanzada, tiene un skin que le da un toque viejuno bastante desagradable para los usuarios. La otra es Atmail, que si bien mejor algo, cuando quieres ponerle temas personalizables tienes que apoquinar más de $600, según la cantidad de dominios a gestionar. Así pues, buscando otras opciones, decidimos probar Roundcube, que resultó ser el más agradable, fácil de configurar, ligero y con un interfaz AJAX bien majete.

El tema es que a partir de la versión 10.2 de Plesk, han incorporado un sistema para añadir webmails externos, pero o bien somos extremadamente torpes, o simplemente no funciona correctamente. Y como ya conocemos a los amigos de Parallels, casi que me inclino por lo segundo. Además, tengo pruebas.

Sin embargo, es posible instalarlo, o bien como reemplazo de alguno de los webmails existentes, cosa que no termino de recomendar ya que en alguna actualización de Plesk volará todo, o bien desinstalando los dos existentes y dejando como única opción para los clientes el nuevo, cosa que tenemos instalada en producción.

Así pues, empezamos desinstalando los webmails existentes:

apt-get remove psa-horde psa-atmail

Después se descomprime el webmail, en /var/www/roundcube, por ejemplo.

wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail-beta/0.5-RC/roundcubemail-0.5-rc.tar.gz
tar xvfz roundcubemail-0.5-rc.tar.gz
mkdir /var/www/roundcube
mv /roundcubemail-0.5-rc/* /var/www/roundcube

Como alternativa a utilizar el instalador que incorpora el webmail, también se puede seguir este post, lo que otorga mayor control sobre lo que se está haciendo, aunque está algo desfasado, ya que en las últimas versiones se pueden utilizar variables de reemplazo para acceder al domino actual, o al del servidor IMAP. No olvidarse de hacer desaparecer el directorio installer al terminar, para evitar posibles problemas.

Por último, ya que hemos eliminado los webmails conocidos para Plesk, éste no interferirá con el subdomino webmail, así que creamos un VirtualHost común a todos nuestros dominios, creando un fichero roundcube.conf en el directorio /etc/apache2/conf.d, con el siguiente contenido:

<VirtualHost 192.168.0.250:80>
    ServerName webmail
    ServerAlias webmail.*
    DocumentRoot /var/www/roundcube
    <Directory "/var/www/roundcube">
        allow from all
        php_flag magic_quotes_gpc Off
        php_flag register_globals Off
        php_flag include_path /usr/share/awl/inc
    </Directory>
</VirtualHost>

Por supuesto, hay que cambiar la IP por la que toque, así como las rutas, si no son las correctas. Tras un reinicio del Apache podremos acceder al webmail si teníamos los DNS configurados.

service apache2 restart

Por cierto, gracias a Florian Moker por su inestimable ayuda en esto.

Añadir toplink personalizado en Magento

0

Los toplinks son los menús que normalmente aparecen en la cabecera de toda tienda Magento.
Este menu es generado automáticamente a partir de las definiciones de los diferentes layouts.
Es desde los ficheros de layout desde donde habilitaremos o deshabilitaresmos estas opciones.

Partiendo de esto la manera mas elegante para añadir un nuevo item de menu es añadirlo manualmente en un fichero de layout. Lo normal es ponerlo en page.xml dentro del block root, aunque se puede poner en cualquiera según las necesidades.

Para poner un item nuevo se escribiría lo siguiente

<reference name="top.links">
	   <action method="addLink" translate="label title">
                    <label>Condiciones de compra</label>
                    <url>condiciones-compra-cestas-lotes-navidad</url>  <!-- can use full url also -->
                    <title>Condiciones de compra</title>
                    <prepare>true</prepare> <!-- set true if adding base url param -->
                    <urlParams helper="core/url/getHomeUrl"/> <!-- base url - thanks @Russ! -->
                    <!-- there are a few param you can send to do different things in <urlParams> 
                             dig into app/code/core/Mage/Core/Model/Url.php, around line 803 -->                   
 
                    <!-- below adds #add-fragment to the end of your url -->
                    <!-- <urlParams><_fragment>add-fragment</_fragment></urlParams> -->
 
                    <!-- below adds ?add-query to the end of your url -->
                    <!-- <urlParams><_query>add-fragment</_query></urlParams> -->
 
                    <!-- below gives you a new session id (i think...)-->
                    <!-- <urlParams><_nosid>true</_nosid></urlParams> -->
 
                    <!-- below replaces double quotes, single quotes, greater than, and less than signs 
                             to their respective url escaped replacements (%22, %27, %3E, %3C) -->
                    <!-- <urlParams><_escape>i'm-a-blog-url</_escape></urlParams> -->
 
                    <position>100</position>
                    <liParams/>
                    <aParams>class=""</aParams>
                    <beforeText></beforeText>
                    <afterText></afterText>
                </action>
 </reference>

Cambiar estado del pedido en magento

0

Desde magento no se puede cambiar el estado del pendido directamente.
Mientras busco una extensión he tenido que cambiar a mano las tablas
magentosales_flat_order
magentosales_flat_order_status_history
magentosales_flat_order_grid

En teoria con cambiar magentosales_flat_order es suficiente pero cambiamos tambien el resto para dejarlo bonito, sobre todo la última tabla ya que es lo que se muestra en la rejilla.

Un ejemplo para cambiar los estado de un producto con id 307 sería

update magentosales_flat_order set status=’processing’ where entity_id in
(Select order_id from magentosales_flat_order_item where product_id=307) and status=’pending’

update magentosales_flat_order_status_history set status=’processing’ where parent_id in
(Select order_id from magentosales_flat_order_item where product_id=307) and status=’pending’

update magentosales_flat_order_grid set status=’processing’ where entity_id in
(Select order_id from magentosales_flat_order_item where product_id=307) and status=’pending’

Activación de mod_proxy en Plesk

0

Ahora que disponemos de un servidor Linux y las páginas son servidas por Apache, podemos disfrutar de algunos módulos que se podían echar de menos en un IIS con Windows, como son mod_rewrite y mod_proxy. Sin embargo, el primero viene activado con la instalación estándar de Plesk, pero el segundo no, de forma que al escribir ciertas reglas en el fichero .htaccess obtendremos mensajes de error.

Así, el siguiente .htaccess:

RewriteEngine on
Options +FollowSymlinks

RewriteCond %{HTTP_HOST} url\.original\.com
RewriteRule (.*)$ http://otroserver.com/undircualquiera/$1 [P,L]

Que lo que busca es la redirección “neutra”, mediante un proxy, de una URL a otro sitio (por la directiva [P]), genera el siguiente error:

[Mon Sep 19 13:33:04 2011] [alert] [client x.x.x.x] /var/www/vhosts/dominio.com/subdominio/.htaccess: Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration.

Bien, esto lo que nos indica es que el módulo no está activado, ya que instalado sí está en Plesk, así que procedemos a su activación con a2enmod proxy. Tras esto, nos podemos encontrar con otro error:

[Mon Sep 19 13:57:08 2011] [warn] proxy: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Esto es debido a que el módulo mod_proxy por si solo no funciona, así que instalaremos otros dos módulos, con a2enmod proxy_balancer y a2enmod proxy_http, y reiniciaremos apache con service apache2 restart.

Tras esto, ya deberíamos tener mod_proxy redirigiendo correctamente las peticiones, sin que cambie la URL que el cliente ve en su navegador.

Si en lugar de utilizar .htaccess preferimos definir las reglas en vhosts.conf, conviene recordar que la carpeta adecuada es /var/www/vhosts/dominio.com/conf, que luego Plesk ya generará el fichero vhosts.conf completo.

Bonus: mod_rewrite en IIS

Si por lo que sea —jugando a adivinar, por mantener ASP.NET en un servidor IIS 6— necesitamos mantener el Internet Information Server, pero queremos disfrutar de mod_rewrite, permitiendo así tener URLs amigables, disponemos de una estupenda solución: Helicon Ape.

Es gratuito hasta tres dominios, y si se necesitan más, tiene un precio muy interesante. Como se puede ver, soporta no sólo mod_rewrite, sino casi cualquier módulo que se te ocurra de Apache.

Go to Top