Manual de OsCommerce

34
Manual de OsCommerce ¿Qué es OsCommerce? En el 2000 nació osCommerce, una aplicación web de código abierto (OpenSource) que te permite montar una tienda virtual en cuestión de minutos para vender en Internet. Consta de dos partes principalmente el front y el back-end, es decir, la parte que vemos todo el mundo, la tienda virtual en si, y la parte de administración, donde podrás mantener tu propia tienda virtual, actualizando productos, insertando nuevas ofertas, categorías, idiomas, monedas, consultar los pedidos, los clientes.. y sin coste ninguno por parte del vendedor y sin necesidad ninguna de saber programación. Front o Página Principal Back End o Administración de la Tienda

Transcript of Manual de OsCommerce

Page 1: Manual de OsCommerce

Manual de OsCommerce

¿Qué es OsCommerce?

En el 2000 nació osCommerce, una aplicación web de código abierto (OpenSource) que te permite montar una tienda virtual en cuestión de minutos para vender en Internet. Consta de dos partes principalmente el front y el back-end, es decir, la parte que vemos todo el mundo, la tienda virtual en si, y la parte de administración, donde podrás mantener tu propia tienda virtual, actualizando productos, insertando nuevas ofertas, categorías, idiomas, monedas, consultar los pedidos, los clientes.. y sin coste ninguno por parte del vendedor y sin necesidad ninguna de saber programación.

Front o Página Principal

Back End o Administración de la Tienda

Page 2: Manual de OsCommerce

Uno de los beneficios de ser código abierto, es que está siendo diariamente actualizada por su comunidad, añadiendo contribuciones de todo tipo. Módulos de pago, de envío, contribuciones para el diseño, como templates, así como nuevas funcionalidades, noticias, lector de rss…

osCommerce es de las mejores soluciones de código abierto existentes para la creación de tiendas virtuales, además de ser gratuita y sencilla de administrar. Programada en lenguaje PHP trabaja sobre un servidor Apache y usa MySQL como servidor de base de datos.

Actualmente casi todas las empresas de Hosting ofrecen una solución con OsCommerce ya instalada, aunque es realmente fácil instalar en cuestión de 5 clicks con el “install” que lleva incorporado.

El único pero que le podemos poner es que hay pocas contribuciones en español, casi todas en el universal inglés, aunque tenemos un buen soporte en la web española http://oscommerce.qadram.com

OsCommerce Contribuciones, addons…

Caracteristicas principales de OsCommerce

La instalación básica de oscommerce, tiene unas características por defecto, que luego podemos modificar bien por administración o con ayuda de contribuciones, como nuevos módulos de pago (e-pagado), de envío (Seur), etc…

Estas son las características principales de la instalación de Oscommerce:

Generales

Page 3: Manual de OsCommerce

Los pedidos, clientes y productos se almacenan en una base de datos de fácil consulta via administración-web.

Los clientes podrán comprobar el histórico y el estado de sus pedidos una vez registrados

Los clientes pueden cambiar sus datos de perfil de usuario desde su apartado cliente.

Múltiples direcciones de envío por usuario, para regalos por ejemplo Búsqueda de productos. Posibilidad de permitir a los usuarios valorar los productos comprados, además

de comentarlos. Posibilidad de implementar un sevidor seguro (SSL). Puede mostrar el número de productos en cada una de las categorías. Lista global o por categoría de los productos más vendidos y más vistos. Fácil e intuitiva navegación por categorías. Plataforma multi-idiomas, por defecto estarán disponibles el español, inglés y

alemán.

Producto

Relaciones dinámicas entre productos. Descripciones de productos basadas en HTML. Generación automática de productos especiales. Controla la posibilidad de mostrar o no en la tienda virtual los productos

agotados. Posibilidad de ofrecer a los usuarios la suscripción a una newsletter de

novedades.

Pagos

Medios de pago offline (transferencias, cheques, ingresos, etc.). Muchos medios de pago online (E-Pagado, PayPal, TPV virtual, etc.). Posibilidad de deshabilitar algunos medios de pago según la zona geográfica del

usuario. Posibilidad de añadir el IVA por zonas geográficas y por productos, ya que por

ejmplo Nigeria no tienen IVA

Envíos

Precios de envío por peso, destino y precio. Precios reales disponibles en tiempo real para algunos operadores (UPS, FedEx). Envío gratuito según importe del pedido y destino Posibilidad de deshabilitar determinados servicios de envío en función de zonas

geográficas.

Nota:Más adelante publicaremos nuevos artículos en los que profundizaremos más sobre el OsCommerce.

¿Qué son las contribuciones de OsCommerce?

Son algunas de las preguntas que surgen cuando instalas una tienda Oscommerce, ya que por necesidad vamos a echar mano de alguna contribución para nuestra tienda on-

Page 4: Manual de OsCommerce

line.

Hay contribuciones de todo tipo, que sirven para modificar y/o ampliar el código php original para adaptar la tienda a nuestras necesidades. Por ejemplo, si necesitas además de los 3 idiomas que viene por defecto o necesitas alguno más como catalán… O si quieres cambiar el aspecto de las Infoboxes o quieres que la cabecera cambie aleatoriamente de imagen, o quieres grabar el trazado de los usuarios de tu web durante su visitias… son muchas las mejoras, ampliaciones o cambios que se le pueden hacer a tu tienda en Oscommerce.

Todas están en la comunidad de Oscommerce, anímate a subir la tuya. Las contribuciones son de uso a tu propio riesgo, es decir, debes de hacer backups de todos tus archivos ya que no te garnatizan que vayan del todo bien, o que junto a otras contribuciones puedan dar problemas, prúebalas antes de usarlas. Backups, backups, backups..

Todas las contribuciones… Además de los foros de OsCommerce que nos puede venir muy bien .. Foro OsCommerce.

Las contribuciones las dividimos en 12 categorías

Módulos de Envío ¿Necesitas enviar cosas al extranjero? ¿Sólo a tu país?Me cobran más si envío a Palma de Mallorca que a Barcelona, ¿qué hago? Añade el módulo necesario, los hay incluso de UPS, Seur… ya creados, otros por tarifas de producto, o por cantidades, por Códigos Postales, o no cobrar si llega el pedido a un importe.. Adapta tu Oscommerce a tus necesidades.

Módulos de Pago Módulos para cobrar con tarjeta, o contra reembolso, o por transferencia bancaría, para cobrar en tu país o en otros, así como módulos para e-pagado, paypal y otras empresas de cobro por web..

Módulos de Pedidos Sirven para hacer descuentos a grupos, para hacer pedidos con un mínimo de euros, o para controlar si necesitas añadir IVA o otro impuesto

Módulos de Crédito Es el más amplio en cuanto a contribuciones, las hay de todo tipo, para administración, como control por niveles, o para la tienda, como agregar e-mails en los pedidos o aceptar condicones de compra… muy interesantes.

Idiomas Traducciones de la tienda tanto el apartado de administración como la tienda en si, bulgaro, koreano, turco, ruso, que idiomas necesitas?

Imágenes Principalmente botones en idiomas que no vienen por defecto en nustro Oscommerce, así como el tratamiento de las imágenes, como creación de Thumbnails de las fotos de tus procducots, iconos de todo tipo..

Informes Contribuciones que te informan cuando un cliente se ha dado de alta, o de las ventas mensuales de la tienda, editar pedidos, clientes, informes del catálogo en PDF, etc..

Zonas Contribuciones que sirven para determinar las ciudades, capitales, y regiones de países en concreto.

Info Boxes Añade cajas o infoboxes en las columnas laterales con nuevas funcionalidades o

Page 5: Manual de OsCommerce

modificaciones de estas, como el betsellers con imágenes o la caja de Login mejorada, lector de rss, publicidad, etc..

Plantillas o Templates Botones, iconos, y estructuras para modificar tu tienda facilmente en aspecto gráfico. Los PSDS o archivos de Photoshop para modificar los botones de la tienda..

Mejoras o Features Las hay de todo tipo, para mejorar la página de producto, más fotos, más opciones de compra, mejoras en cuanto a funcionalidades de la tienda Oscommerce, nuevos menús, comprar sin necesidad de crear cuenta d usuario,etc..

Otros De todo tipo sin clasificar, como crear la página 404 o como poner Flash en el catálogo, ...

Normalmente las contribuciones te las descargas en formato .zip o .rar y suelen ser archivos que debes reemplazar por los originales, o código que debes añadir a tus archivos. De todas formas, haz backup de todos tus archivos, ya que pueden no funcionar correctamente todas, o podemos tener algún error al editar nuestros archivos.

Obligaciones empresariales con OsCommerce en España

La Protección de Datos de Carácter Personal es una materia que preocupa a todas las empresas, principalmente por las fuertes sanciones económicas que impone la Agencia Española de Protección de Datos en caso de incumplimiento.

El deber de las empresas en esta materia no sólo debe consistir en la adaptación a la normativa vigente, sino también en la aplicación práctica de los principios de protección de datos en el seno de la empresa, dentro de cada uno de los departamentos, involucrando a todo el personal… Las consecuencias del incumplimiento de la normativa no se quedan sólo en las sanciones de la Agencia, sino que van más allá y afectan a todos.

El cumplimiento de lo establecido en la LOPD (LO 15/1999 de Protección de Datos de Carácter Personal) y su normativa de desarrollo (RD 994/1999, Reglamento de Medidas de Seguridad de los Ficheros Automatizados que contengan datos de carácter personal) pasa no sólo por la legalización, legitimación y protección de los ficheros de datos de carácter personal, sino también por su aplicación práctica en el seno de las organizaciones, es decir, la incorporación a la dinámica de la empresa de los principios rectores de la Protección de Datos de Carácter Personal.

La incorporación a la dinámica de la empresa de los principios rectores de la Protección de Datos de Carácter Personal, adquiere una gran importancia desde el momento en que las consecuencias de su incumplimiento conllevan grandes responsabilidades tanto para la Organización como para el personal que trata o accede a los datos de carácter personal, es decir, las sanciones ya no sólo son administrativas y dirigidas a la Organización en sí, sino que además de ellas se pueden derivar responsabilidades civiles, penales y laborales.

Administrativas: Sanciones contempladas en la LOPD y que son impuestas por la Agencia Española de Protección de Datos en el ejercicio de sus funciones, ya sea por inspección de oficio o abierta a instancia de parte. Estas sanciones son de carácter económico y su cuantía está entre 601,01 y 601.012,10 Euros.

Page 6: Manual de OsCommerce

Civiles: Artículos del Código Civil relativos a la Responsabilidad Contractual y Extracontractual (arts. 1902 y 1903 CC). Así cuando determinado servicio es contratado a un tercero ajeno a la propia organización e implique un acceso a los ficheros de datos de carácter personal, deberá estar precedido del correspondiente contrato de acceso a datos en el que se limiten las facultades del tercero en cuanto al tratamiento de los datos de carácter personal, se especifiquen las medidas de seguridad que deberán ser implantadas o cumplidas por el tercero para la protección del fichero, y se determinen las responsabilidades derivadas del incumplimiento de la LOPD o de lo establecido en el contrato.

Penales: El Código Penal tipifica los delitos contra la intimidad y concretamente el descubrimiento y revelación de secretos en los artículos 197 y siguientes. En este sentido, ha sido condenado recientemente un funcionario de la Seguridad Social, a cinco años y tres meses de prisión, una multa de 330.556 Euros y la inhabilitación especial de 11 años para empleo o cargo público, por vender datos personales de cotizantes a una empresa privada.

Laborales: La fuga de datos, un tratamiento inadecuado de los ficheros de datos de carácter personal, un acceso no autorizado a los datos del fichero, una protección inadecuada de los ficheros, pueden venir derivadas de cualquier puesto laboral dentro del seno de la Organización. Cuando una cadena de fallos deriva en la imposición de una sanción a la Organización, es frecuente que además se deriven responsabilidades laborales.

En consecuencia, se hace absolutamente necesario el establecimiento de una serie de medidas adicionales para la correcta aplicación de la Ley de Protección de Datos en las empresas, tendentes principalmente a informar y formar al personal que trata los datos, independientemente de su cargo o función.

Como principales acciones adicionales encaminadas a informar y formar al personal sobre los principios del tratamiento de datos de carácter personal encontramos las siguientes:

1. Establecimiento de una Política de Tratamiento de Datos en la Organización. Esta Política de Tratamiento de Datos deberá entregarse a cada uno de los empleados que entre sus funciones esté el tratamiento de datos de carácter personal, quién deberá firmarla tras su conocimiento. En esta Política se suele informar sobre el carácter y finalidad de la LOPD y su normativa de desarrollo, las obligaciones básicas impuestas, así como los diferentes principios, acciones y procedimientos a adoptar en la gestión diaria de la empresa. Igualmente, se puede informar al empleado sobre otras medidas o políticas de seguridad de los sistemas de información implementados por la Organización, así como de las responsabilidades que se pueden derivar de su incumplimiento.

2. Formación en materia de Protección de Datos. El establecimiento de seminarios, conferencias o jornadas de formación en materia de protección de datos en el seno de las Organizaciones es otra de las medidas que se pueden adoptar. Como principales ventajas de la formación encontramos: -Información y Formación para el empleado. -Formación personalizada para cada empresa. Se analizaran los casos concretos de cada organización y su problemática particular. -Mayor participación de los empleados. Podrán consultar y comentar las particularidades de cada puesto.

Page 7: Manual de OsCommerce

Cómo instalar OsCommerce

Vamos a hacer la instalación de una nueva tienda en un servidor , en la carpeta /tienda de cualquier dominio, es decir www.tudominio.com/tienda para acceder a la tienda, con lo que quedará www.tudominio.com/tienda/admin para el apartado de Administración.

Vamos allá, lo primero que tenemos que hacer es descargarnos el paquete desde http://www.oscommerce.com/solutions/downloads en el formato que necesitéis, .zip o .tar/gz .

Descomprimimos y subimos al servidor mediante FTP , modo ASCII y no binario, las carpetas catalog (renombraremos por /tienda) y admin. Linux, MySql y PHP recuerda..

Una vez subidos los archivos debemos dar permisos de escritura y/o lectura a otros…

Permisos totales (777) a los siguientes archivos: /tienda/includes/configure.php y /tienda/admin/includes/configure.php y la carpeta de las imágenes /tienda/images en mod 777 también.

Permisos 755 a las siguientes carpetas: /admin/includes /tienda/includes

Una vez subidos todos los archivos y asegurados de haber creado una base de datos y un usuario en nuestro dominio, estamos preparados para ejecutar el script “install”. Accediendo a www.tudominio.com/tienda/ empezaremos con la instalación, OsCommerce autodetectará si necesitas la instalación si no está realizada y te redireccionará a la carpeta /install.

La primera pantaala que veremos , damos a install

Después tenemos que ticar las 2 casillas, importar catálogo y configuración automática y continue

Page 8: Manual de OsCommerce

Después tenemos que rellenar la siguiente información. Database server: localhost .Aunque puedes poner una IP o dirección web, normalmente localhost funciona bien. Username: el nombre de usuario que hemos creado para la base de datos (usuario en nuestro caso) Password: la clave elegida para la base de datos Database: El nombre de la base de datos que hemos creado , en nuestro caso tubase Después dejamos en blanco la casilla de Persistent connections y le decimos que nos guarde las sesiones en la base de datos, como en el gráfico que viene ahora, y Continue…

A continuación te pedirá que importes el catálogo que viene por defecto… continue

Page 9: Manual de OsCommerce

Esta pantalla nos informa de que ha sido importada la base de datos correctamente… continue

Ahora revisamos toda la información del servidor, para las rutas principales.. continue

Page 10: Manual de OsCommerce

Segunda parte del resumen de la instalación.. continue

Y si todo ha ido bien, llegaremos a la pantalla para ir al catálogo o a la administración de nuestra nueva tienda…

Page 11: Manual de OsCommerce

Una vez instalada debemos borrar la carpeta /install del servidor y guardar con contraseña y usuario la carpeta /admin

Y volveremos a dejar los archivos configure.php con los permisos 644. /admin/includes/configure.php y /tienda/includes/configure.php

Por último crearemos una carpeta backups dentro de admin y le daremos permisos 777 /admin/backups

Y hemos terminado nuestra instalación…

Características principales de OsCommerce

Estas son las características principales de la instalación de Oscommerce:

Generales

Los pedidos, clientes y productos se almacenan en una base de datos de fácil consulta via administración-web.

Los clientes podrán comprobar el histórico y el estado de sus pedidos una vez registrados

Los clientes pueden cambiar sus datos de perfil de usuario desde su apartado cliente.

Múltiples direcciones de envío por usuario, para regalos por ejemplo Búsqueda de productos. Posibilidad de permitir a los usuarios valorar los productos comprados, además

de comentarlos. Posibilidad de implementar un sevidor seguro (SSL). Puede mostrar el número de productos en cada una de las categorías. Lista global o por categoría de los productos más vendidos y más vistos. Fácil e intuitiva navegación por categorías. Plataforma multi-idiomas, por defecto estarán disponibles el español, inglés y

alemán.

Producto

Page 12: Manual de OsCommerce

Relaciones dinámicas entre productos. Descripciones de productos basadas en HTML. Generación automática de productos especiales. Controla la posibilidad de mostrar o no en la tienda virtual los productos

agotados. Posibilidad de ofrecer a los usuarios la suscripción a una newsletter de

novedades.

Pagos

Medios de pago offline (transferencias, cheques, ingresos, etc.). Muchos medios de pago online (E-Pagado, PayPal, TPV virtual, etc.). Posibilidad de deshabilitar algunos medios de pago según la zona geográfica del

usuario. Posibilidad de añadir el IVA por zonas geográficas y por productos, ya que por

ejemplo Nigeria no tienen IVA

Envíos

Precios de envío por peso, destino y precio. Precios reales disponibles en tiempo real para algunos operadores (UPS, FedEx). Envío gratuito según importe del pedido y destino Posibilidad de deshabilitar determinados servicios de envío en función de zonas

geográficas.

Cambios a las caracteristicas generales de OsCommerce

Producto anterior y siguiente

Empezamos nuestro listado de contribuciones con una muy poco usada pero que yo uso bastante. Esta contribución nos permite navegar por los productos mediante los botones siguiente y anterior, en producto_info.php , sin necesidad de volver a la categoría y ver el listado de productos, como viene por defecto.

Échale un vistazo en los productos de www.regaletes.com

Descárgate la última versión desde aquí

Muy fácil de usar.

1. Sube products_next_previous.php al directorio /includes/

2. Añade a /includes/languages/english.php

// previous next product (english) define('PREV_NEXT_PRODUCT', 'Product '); define('PREV_NEXT_FROM', 'from ');

/includes/languages/espanol.php

En Español…

// previous next product (espanol)

Page 13: Manual de OsCommerce

define('PREV_NEXT_PRODUCT', ' Producto'); define('PREV_NEXT_FROM', 'de ');

3. Abre product_info.php**

**Busca:

<!-- body_text //--> <td width="100%" valign="top"><?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params(array('action')) . 'action="add_product')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">

**Añade debajo:

< ?php if ($product_check['total'] >= 1) { include (DIR_WS_INCLUDES . 'products_next_previous.php'); } ?>

4. **Sube los botones a:

/includes/languages/english/images/buttons/ /includes/languages/espanol/images/buttons/

Productos aleatorios en portada

Este es un sencillo truco para que en la portada, en Productos nuevos de este mes… En vez de mostranos los últimos añadidos, nos muestre productos aleatoriso, dando un cambio visual cada vez que entras a la tienda, además es bueno para los buscadores…

abre /includes/modules/new_products.php

y reemplaza el siguiente código :

$new_products_query = tep_db_query("select p.products_id, p.products_image, p.products_tax_class_id, if(s.status, s.specials_new_products_price, p.products_price) as products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where products_status = '1' order by p.products_date_added desc limit " . MAX_DISPLAY_NEW_PRODUCTS);

por:

$new_products_query = tep_db_query("select p.products_id, p.products_image, p.products_tax_class_id, if(s.status, s.specials_new_products_price, p.products_price) as products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where products_status = '1' order by RAND() limit " . MAX_DISPLAY_NEW_PRODUCTS);

Fíjate que realmetne lo qe cambia es order by p.products_date_added desc por order by RAND

Puedes ver un ejemplo en Regaletes.com

SEO URL´s para OsCommerce

Esta contribución de Chemo , es de las que más útiles que he encontrado.

Modifica las direcciones web por defecto de OsCommerce por páginas terminadas en .html y con el nombre del producto, es decir, sustituye el http://www.tudominio.com/product_info.php?products_id=207 por

Page 14: Manual de OsCommerce

http://www.tudominio.com/tijerasdepunta.html

Esto hace que tu tienda se indexe mejor en los buscadores.

Primero que nada descargamos la última versión de la contribución ,SEO URL´s y descomprimimos.

Luego tenemos que subir a nuestro servidor los archivos siguientes:

includes/classes/seo.class.php y admin/includes/reset_seo_cache.php

Editamos includes/application_top.php

Justo después de este código :

// include the language translations

require(DIR_WS_LANGUAGES . $language . '.php');

Añadimos: // Ultimate SEO URLs v2.1

include_once(DIR_WS_CLASSES . 'seo.class.php'); if ( !is_object($seo_urls) ){    $seo_urls = new SEO_URL($languages_id); }

Ahora editamos includes/functions/html_output.php y reemplazamos el siguiente código :

//// // The HTML href link wrapper function

function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {     global $request_type, $session_started, $SID;    if (!tep_not_null($page)) {       die('<br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine the page link!<br><br>');     }    if ($connection 'NONSSL') {        $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;     } elseif ($connection ‘SSL’) {        if (ENABLE_SSL true) {           $link = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;        } else {           $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;       }     } else {        die('<br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL</b><br><br>');     }    if (tep_not_null($parameters)) {       $link .= $page . '?' . tep_output_string($parameters);        $separator = '&';     } else {       $link .= $page; $separator = '?';     }    while ( (substr($link, -1) ‘&’) || (substr($link, -1) '?') )     $link = substr($link, 0, -1); // Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined

if ( ($add_session_id true) &&($session_started true) && (SESSION_FORCE_COOKIE_USE ‘False’) ) {     if (tep_not_null($SID)) {        $_sid = $SID;

Page 15: Manual de OsCommerce

    } elseif ( ( ($request_type 'NONSSL') && ($connection ‘SSL’) && (ENABLE_SSL true) ) || ( ($request_type ‘SSL’) && ($connection 'NONSSL') ) ) {        if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {           $_sid = tep_session_name() . '=' . tep_session_id();       }     } } if ( (SEARCH_ENGINE_FRIENDLY_URLS ‘true’) && ($search_engine_safe == true) ) {    while (strstr($link, ‘&&’))       $link = str_replace(‘&&’, ‘&’, $link);       $link = str_replace(‘?’, ‘/’, $link);        $link = str_replace(‘&’, ‘/’, $link);       $link = str_replace(‘=’, ‘/’, $link);       $separator = ‘?’; } if (isset($_sid)) {    $link .= $separator . $_sid; } return $link; } por

//// // Ultimate SEO URLs v2.1 // The HTML href link wrapper function

function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) { global $seo_urls; if ( !is_object($seo_urls) ){ if ( !class_exists('SEO_URL') ){ include_once(DIR_WS_CLASSES . 'seo.class.php'); } global $languages_id; $seo_urls = new SEO_URL($languages_id); }

return $seo_urls->href_link($page, $parameters, $connection, $add_session_id);

}

Ahora editamos admin/categories.php Justo después del código:

$action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');

Añadir lo siguiente:

// Ultimate SEO URLs v2.1 // If the action will affect the cache entries

if ( eregi("(insert|update|setflag)", $action) ) include_once('includes/reset_seo_cache.php');

Casi terminando ya, editamos admin/includes/functions/general.php y justo antes del último ?> pegamos el siguiente código:

// Function to reset SEO URLs database cache entries // Ultimate SEO URLs v2.1 function tep_reset_cache_data_seo_urls($action){ switch ($action){ case 'reset': tep_db_query("DELETE FROM cache WHERE cache_name LIKE '%seo_urls%'"); tep_db_query("UPDATE configuration SET configuration_value='false' WHERE configuration_key='SEO_URLS_CACHE_RESET'"); break; default: break;

Page 16: Manual de OsCommerce

}

return 'false'; }

Ahora nos queda editar y/o crear el archivo .htacces Editamos el .htacces, y si tenemos la tienda en un subdirectorio, es decir tudominio.com/directorio . Sustituye /directorio/ por el nombre de tu carpeta. Y pegamos:

Options +FollowSymLinks RewriteEngine On RewriteBase /directorio/

RewriteRule ^(.*)-p-(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-c-(.*).html$ index.php?cPath=$2&%{QUERY_STRING} RewriteRule ^(.*)-m-(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pi-(.*).html$ popup_image.php?pID=$2&%{QUERY_STRING} RewriteRule ^(.*)-t-(.*).html$ articles.php?tPath=$2&%{QUERY_STRING} RewriteRule ^(.*)-a-(.*).html$ article_info.php?articles_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pr-(.*).html$ product_reviews.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pri-(.*).html$ product_reviews_info.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-i-(.*).html$ information.php?info_id=$2&%{QUERY_STRING}

Si tu tienda está en el directorio raíz, es decir tudominio.com, tenemos que pgar lo siguiente.

Options +FollowSymLinks RewriteEngine On RewriteBase /

RewriteRule ^(.*)-p-(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-c-(.*).html$ index.php?cPath=$2&%{QUERY_STRING} RewriteRule ^(.*)-m-(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pi-(.*).html$ popup_image.php?pID=$2&%{QUERY_STRING} RewriteRule ^(.*)-t-(.*).html$ articles.php?tPath=$2&%{QUERY_STRING} RewriteRule ^(.*)-a-(.*).html$ article_info.php?articles_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pr-(.*).html$ product_reviews.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-pri-(.*).html$ product_reviews_info.php?products_id=$2&%{QUERY_STRING} RewriteRule ^(.*)-i-(.*).html$ information.php?info_id=$2&%{QUERY_STRING}

Ahora ya puedes poner en tu navegador preferido la dirección de tu tienda, el automáticamente se pondrá en marcha!

Desde la tienda, el menú Configuración aparecerá ahora un apartado llamado SEO URL´S donde podrás configurar varios parámetros, como la activación o desactivación de estos, por categorías, échale un vistazo…

Distintas versiones sobre OsCommerce

CreLoaded :

Es una versión de las más descargadas, van por su versión 6.15 y viene con más de 40 contribuciones instaladas y un sistema propio de templates, que lo hace más fácil de instalar, pero a la vez es más complicado para instalar nuevas contribuciones o addons, al tener un distinto sistema de archivos. Lo más destacable de esta versión es el módulo de Cupones descuento, las Faqs, las news, y el poder crear páginas adicionales sin problema ninguno. Problemas con el español, hay que repasar bastante código. Listado de contribuciones de Creloaded

Page 17: Manual de OsCommerce

mini-pocket.com funciona sobre CreLoaded v6.15

Zencart:

Es otra versión con sus propios módulos y algo distinta de manejar también. Lo más destacable su sistema de aceptar condiciones de compra, añadir múltiples imágenes como Creloaded y OsCdox de la que ahora hablamos. Zencart quizás es de la menos usada de las 3, aunque sencilla de usar, algo complicada de implementar, a mi gusto claro. Dice que es muy sencillo cambiar el aspecto con las .css e imágenes solamente, pero mmm Algunas de las contribuciones de Zencart

OscDox

Con su versión 1.7 MAX, es otra modificación de oscommerce con importantes contribuciones, y con algunos templates ya instalados, muy completo. Algo de problemas con el spanish también… Aquí todo para entenderlo, pero en inglés, lo mejor que le echéis otro vistazo…

Existen otras, pero estas son las más descargadas y usadas.

En keleke preferimos no usarlas, ya que siempre hemos preferido instalar el básico y añadir nuestras contribuciones, las que necesitemos realmente. Estas distintas versiones tiene sus propias contribuciones, foros, y son algo más tediosas de tratar, aún así las hemos utilizado por distintos motivos o contribuciones ya instaladas, repito que es dependiendo de las necesidades de cada tienda

Por último os mostramos la nueva revisión OsCommerce

Ya está disponible una nueva revisión de osCommerce desde el Download, con la nueva documentación, en inglés claro

Han corregido algunos bugs, pero lo mejor está en las versiones venideras MS3 y MS4… puedes echarle un vistazo desde aquí al trabajo que están desarrollando. Llevarán contribuciones como Comprar sin crear cuenta, Gift´s Voucher and Coupons.. etc.. pero

mejor que lo veas

Compatibilidad con PHP 5 Compatibilidad con MySQL 5 Arreglos en varios scripts del catálogo Arreglos en el header HTTP/E-Mail Modificaciones en la base de datos Arreglos en la copia de seguridad Arreglos en la página de resultados y clientes conectados (Split Page Result

class)

Revisión 051113 de OsCommerce

1/ customer_country_id en addressbook

Cuando el cliente actualiza su direccion en la pagina de Mi cuenta, el valor del pais esta guardada en una variable incorrecta que puede causar un valor de impuesto incorrecto

Page 18: Manual de OsCommerce

usado en el precio de los productos.

Solución:

Las siguientes lineas deben ser reemplazadas en catalog/address_book_process.php:

Linea 150, de:

$customer_country_id = $country_id; a: $customer_country_id = $country;

Linea 171, de:

$customer_country_id = $country_id; a: $customer_country_id = $country;

2/ Cannot re-assign $this

Fatal error: Cannot re-assign $this in /path/to/catalog/admin/includes/classes/upload.php on line 31

Solución:

Lineas 27-34 en catalog/admin/includes/classes/upload.php cambiar:

if ( ($this->parse() true) && ($this->save() true) ) { return true; } else { // self destruct $this = null; return false; } a: if ( ($this->parse() true) && ($this->save() true) ) { return true; } else { return false; }

3/ limit -20, 20

1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘-20, 20’ at line 1

Solución:

Linea 67 en catalog/includes/classes/split_page_results.php, cambiar:

$this->sql_query .= " limit " . $offset . ", " . $this->number_of_rows_per_page; a: $this->sql_query .= " limit " . max($offset, 0) . ", " . $this->number_of_rows_per_page;

Linea 38 en catalog/admin/includes/classes/split_page_results.php, cambiar:

$sql_query .= " limit " . $offset . ", " . $max_rows_per_page; a:

Page 19: Manual de OsCommerce

$sql_query .= " limit " . max($offset, 0) . ", " . $max_rows_per_page;

4/ Cambio en el Input de la Base de Datos

Problema:

Funciones de MySQL deben ser usadas con prioridad a la funcion addslashes(), para proteger debidamente los queries SQL en el servidor de base de datos.

Solución:

La siguiente función debe ser reemplazada en catalog/includes/functions/database.php.

Lineas 126-128, de:

function tep_db_input($string) { return addslashes($string); } a: function tep_db_input($string, $link = 'db_link') { global $$link; if (function_exists('mysql_real_escape_string')) { return mysql_real_escape_string($string, $$link); } elseif (function_exists('mysql_escape_string')) { return mysql_escape_string($string); } return addslashes($string); }

La siguiente funcion debe ser reemplazada en catalog/admin/includes/functions/database.php.

Lineas 130-132, de:

function tep_db_input($string) { return addslashes($string); } a: function tep_db_input($string, $link = 'db_link') { global $$link; if (function_exists('mysql_real_escape_string')) { return mysql_real_escape_string($string, $$link); } elseif (function_exists('mysql_escape_string')) { return mysql_escape_string($string); } return addslashes($string); }

5/ Agregar Productos inexistentes a la cesta

Es posible agregar un producto inexistente a la cesta que puede impedir que los clientes lo borren de sus productos en la cesta.

Solución:

Las siguiente funciones deben ser reemplazadas en catalog/includes/functions/general.php.

Lineas 912-921, de:

Page 20: Manual de OsCommerce

function tep_get_uprid($prid, $params) { $uprid = $prid; if ( (is_array($params)) && (!strstr($prid, '{')) ) { while (list($option, $value) = each($params)) { $uprid = $uprid . '{' . $option . '}' . $value; } } return $uprid; } a: function tep_get_uprid($prid, $params) { if (is_numeric($prid)) { $uprid = $prid; if (is_array($params) && (sizeof($params) > 0)) { $attributes_check = true; $attributes_ids = ''; reset($params); while (list($option, $value) = each($params)) { if (is_numeric($option) && is_numeric($value)) { $attributes_ids .= '{' . (int)$option . '}' . (int)$value; } else { $attributes_check = false; break; } } if ($attributes_check true) { $uprid .= $attributes_ids; } } } else { $uprid = tep_get_prid($prid); if (is_numeric($uprid)) { if (strpos($prid, '{') ! false) { $attributes_check = true; $attributes_ids = ‘’;

// strpos()+1 to remove up to and including the first { which would create an empty array element in explode() $attributes = explode(‘{‘, substr($prid, strpos($prid, ‘{‘)+1)); for ($i=0, $n=sizeof($attributes); $i<$n; $i++) { $pair = explode(‘}’, $attributes[$i]); if (is_numeric($pair[0]) && is_numeric($pair[1])) { $attributes_ids .= ‘{’ . (int)$pair[0] . ‘}’ . (int)$pair[1]; } else { $attributes_check = false; break; } } if ($attributes_check true) { $uprid .= $attributes_ids; } } } else { return false; } } return $uprid; }

Lineas 925-929, de:

function tep_get_prid($uprid) { $pieces = explode('{', $uprid); return $pieces[0]; } a: function tep_get_prid($uprid) { $pieces = explode('{', $uprid); if (is_numeric($pieces[0])) { return $pieces[0]; } else { return false; } }

Las siguientes funciones deben ser reemplazadas en catalog/includes/classes/shopping_cart.php.

Lineas 78-108, de:

function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) { global $new_products_id_in_cart, $customer_id; $products_id = tep_get_uprid($products_id, $attributes); if ($notify true) { $new_products_id_in_cart = $products_id; tep_session_register(‘new_products_id_in_cart’); } if ($this->in_cart($products_id)) { $this->update_quantity($products_id, $qty, $attributes); } else { $this->contents[] = array($products_id); $this->contents[$products_id] = array(‘qty’ => $qty); // insert into database if (tep_session_is_registered(‘customer_id’)) tep_db_query(“insert into ” . TABLE_CUSTOMERS_BASKET . ” (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values (‘” . (int)$customer_id . “’, ‘” . tep_db_input($products_id) . “’, ‘” . $qty . “’, ‘” . date(‘Ymd’) . “’)”); if (is_array($attributes)) { reset($attributes); while (list($option, $value) = each($attributes)) { $this->contents[$products_id][‘attributes’][$option] = $value; // insert into database if (tep_session_is_registered(‘customer_id’)) tep_db_query(“insert into ” . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . ”

Page 21: Manual de OsCommerce

(customers_id, products_id, products_options_id, products_options_value_id) values (‘” . (int)$customer_id . “’, ‘” . tep_db_input($products_id) . “’, ‘” . (int)$option . “’, ‘” . (int)$value . “’)”); } } } $this->cleanup();

// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure $this->cartID = $this->generate_cart_id(); } a: function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) { global $new_products_id_in_cart, $customer_id; $products_id_string = tep_get_uprid($products_id, $attributes); $products_id = tep_get_prid($products_id_string); if (is_numeric($products_id) && is_numeric($qty)) { $check_product_query = tep_db_query("select products_status from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'"); $check_product = tep_db_fetch_array($check_product_query); if (($check_product !== false) && ($check_product['products_status'] '1')) { if ($notify true) { $new_products_id_in_cart = $products_id; tep_session_register(‘new_products_id_in_cart’); } if ($this->in_cart($products_id_string)) { $this->update_quantity($products_id_string, $qty, $attributes); } else { $this->contents[$products_id_string] = array(‘qty’ => $qty); // insert into database if (tep_session_is_registered(‘customer_id’)) tep_db_query(“insert into ” . TABLE_CUSTOMERS_BASKET . ” (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values (‘” . (int)$customer_id . “’, ‘” . tep_db_input($products_id_string) . “’, ‘” . (int)$qty . “’, ‘” . date(‘Ymd’) . “’)”); if (is_array($attributes)) { reset($attributes); while (list($option, $value) = each($attributes)) { $this->contents[$products_id_string][‘attributes’][$option] = $value; // insert into database if (tep_session_is_registered(‘customer_id’)) tep_db_query(“insert into ” . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . ” (customers_id, products_id, products_options_id, products_options_value_id) values (‘” . (int)$customer_id . “’, ‘” . tep_db_input($products_id_string) . “’, ‘” . (int)$option . “’, ‘” . (int)$value . “’)”); } } } $this->cleanup();

// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure $this->cartID = $this->generate_cart_id(); } } }

Lineas 110-127, de:

function update_quantity($products_id, $quantity = '', $attributes = '') { global $customer_id; if (empty($quantity)) return true; // nothing needs to be updated if theres no quantity, so we return true.. $this->contents[$products_id] = array('qty' => $quantity); // update database if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . $quantity . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'"); if (is_array($attributes)) { reset($attributes); while (list($option, $value) = each($attributes)) { $this->contents[$products_id]['attributes'][$option] = $value; // update database if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " set products_options_value_id = '" . (int)$value . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "' and products_options_id = '" . (int)$option . "'"); } } }

Page 22: Manual de OsCommerce

a: function update_quantity($products_id, $quantity = '', $attributes = '') { global $customer_id; $products_id_string = tep_get_uprid($products_id, $attributes); $products_id = tep_get_prid($products_id_string); if (is_numeric($products_id) && isset($this->contents[$products_id_string]) && is_numeric($quantity)) { $this->contents[$products_id_string] = array('qty' => $quantity); // update database if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . (int)$quantity . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "'"); if (is_array($attributes)) { reset($attributes); while (list($option, $value) = each($attributes)) { $this->contents[$products_id_string]['attributes'][$option] = $value; // update database if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " set products_options_value_id = '" . (int)$value . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "' and products_options_id = '" . (int)$option . "'"); } } } }

6/ El Tema de Session ID XSS

El tema de cross site scripting existente con la mal formada session IDs usado en la funcion tep_href_link().

Solución:

Linea 66 ein catalog/includes/functions/html_output.php debe ser cambiada de:

$link .= $separator . $_sid; a: $link .= $separator . tep_output_string($_sid);

7/ Validar Session ID

Validar session ID y redireccionar a la portada cuando la una session ID invalida es llamada.

Solución:

La siguiente función debe ser reemplazada en catalog/includes/functions/sessions.php.

Lineas 66-68, de:

function tep_session_start() { return session_start(); } a: function tep_session_start() { global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS; $sane_session_id = true; if (isset($HTTP_GET_VARS[tep_session_name()])) { if (preg_match('/^[a-zA-Z0-9]+$/', $HTTP_GET_VARS[tep_session_name()]) false) { unset($HTTP_GET_VARS[tep_session_name()]); $sane_session_id = false; } } elseif (isset($HTTP_POST_VARS[tep_session_name()])) { if (preg_match('/^[a-zA-Z0-9]+$/', $HTTP_POST_VARS[tep_session_name()]) false) { unset($HTTP_POST_VARS[tep_session_name()]); $sane_session_id = false; } } elseif

Page 23: Manual de OsCommerce

(isset($HTTP_COOKIE_VARS[tep_session_name()])) { if (preg_match(‘/^[a-zA-Z0-9]+$/’, $HTTP_COOKIE_VARS[tep_session_name()]) false) { $session_data = session_get_cookie_params(); setcookie(tep_session_name(), '', time()-42000, $session_data['path'], $session_data['domain']); $sane_session_id = false; } } if ($sane_session_id false) { tep_redirect(tep_href_link(FILENAME_DEFAULT, ‘’, ‘NONSSL’, false)); } return session_start(); }

8/ Problema en la Herramienta de Ficheros

Errores de Parsing generan cuando salvas ficheros editados con la herramienta ficheros:

Linea 148 en catalog/admin/file_manager.php cambiar

$file_contents = htmlspecialchars(implode('', $file_array)); a: $file_contents = addslashes(implode('', $file_array));

Nota:Esta actualización requiere la actualización de El tema de XSS en el formulario Contactenos para funcionar debidamente.

9/ Inyección en la Cabecera HTTP

Usando datos malintencionados pueden hacer inyecciones de cabecera a los HTTP requests.

Solución:

La siguiente funcion debe ser reemplazada en catalog/includes/functions/general.php.

Lineas 22-32, de:

function tep_redirect($url) { if ( (ENABLE_SSL true) && (getenv('HTTPS') ‘on’) ) { // We are loading an SSL page if (substr($url, 0, strlen(HTTP_SERVER)) HTTP_SERVER) { // NONSSL url $url = HTTPS_SERVER . substr($url, strlen(HTTP_SERVER)); // Change it to SSL } } header('Location: ' . $url); tep_exit(); } a: function tep_redirect($url) { if ( (strstr($url, "n") != false) || (strstr($url, "r") != false) ) { tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false)); } if ( (ENABLE_SSL true) && (getenv(‘HTTPS’) 'on') ) { // We are loading an SSL page if (substr($url, 0, strlen(HTTP_SERVER)) HTTP_SERVER) { // NONSSL url $url = HTTPS_SERVER . substr($url, strlen(HTTP_SERVER)); // Change it to SSL } } header(‘Location: ’ . $url); tep_exit(); }

La siguiente funcion debe ser reemplazada en catalog/admin/includes/functions/general.php.

Lineas 15-26, de:

function tep_redirect($url) { global $logger; header('Location: ' . $url); if (STORE_PAGE_PARSE_TIME 'true') { if (!is_object($logger)) $logger = new logger; $logger->timer_stop(); } exit; } a: function tep_redirect($url) { global $logger; if ( (strstr($url, "n") != false) || (strstr($url, "r") != false) ) { tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false)); } header('Location: ' . $url); if

Page 24: Manual de OsCommerce

(STORE_PAGE_PARSE_TIME ‘true’) { if (!is_object($logger)) $logger = new logger; $logger->timer_stop(); } exit; }

10/ Inyeccion en la Cabecera de E-Mail Header

Usando datos malintencionados pueden hacer inyecciones de cabecera en los correos que envia el administrador de la tienda.

Solución:

La siguiente funcion debe ser reemplazada en catalog/includes/classes/email.php and catalog/admin/includes/classes/email.php.

Lineas 473-504, de:

function send($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = '') { $to = (($to_name != '') ? '"' . $to_name . '" <' . $to_addr . '>' : $to_addr); $from = (($from_name != '') ? '"' . $from_name . '" <' . $from_addr . '>' : $from_addr); if (is_string($headers)) { $headers = explode($this->lf, trim($headers)); } for ($i=0; $i<count($headers); $i++) { if (is_array($headers[$i])) { for ($j=0; $j<count($headers[$i]); $j++) { if ($headers[$i][$j] != '') { $xtra_headers[] = $headers[$i][$j]; } } } if ($headers[$i] != '') { $xtra_headers[] = $headers[$i]; } } if (!isset($xtra_headers)) { $xtra_headers = array(); } if (EMAIL_TRANSPORT 'smtp') { return mail($to_addr, $subject, $this->output, 'From: ' . $from . $this->lf . 'To: ' . $to . $this->lf . implode($this->lf, $this->headers) . $this->lf . implode($this->lf, $xtra_headers)); } else { return mail($to, $subject, $this->output, 'From: '.$from.$this->lf.implode($this->lf, $this->headers).$this->lf.implode($this->lf, $xtra_headers)); } } a: function send($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = '') { if ((strstr($to_name, "n") != false) || (strstr($to_name, "r") != false)) { return false; } if ((strstr($to_addr, "n") != false) || (strstr($to_addr, "r") != false)) { return false; } if ((strstr($subject, "n") != false) || (strstr($subject, "r") != false)) { return false; } if ((strstr($from_name, "n") != false) || (strstr($from_name, "r") != false)) { return false; } if ((strstr($from_addr, "n") != false) || (strstr($from_addr, "r") != false)) { return false; } $to = (($to_name != '') ? '"' . $to_name . '" <' . $to_addr . '>' : $to_addr); $from = (($from_name != '') ? '"' . $from_name . '" <' . $from_addr . '>' : $from_addr); if (is_string($headers)) { $headers = explode($this->lf, trim($headers)); } for ($i=0; $i<count($headers); $i++) { if (is_array($headers[$i])) { for ($j=0; $j<count($headers[$i]); $j++) { if ($headers[$i][$j] != '') { $xtra_headers[] = $headers[$i][$j]; } } } if ($headers[$i] != '') { $xtra_headers[] = $headers[$i]; } } if (!isset($xtra_headers)) { $xtra_headers = array(); } if (EMAIL_TRANSPORT ‘smtp’) { return mail($to_addr, $subject, $this->output, ‘From: ’ . $from . $this->lf . ‘To: ’ . $to . $this->lf . implode($this->lf, $this->headers) . $this->lf . implode($this->lf, $xtra_headers)); } else { return mail($to, $subject, $this->output, ‘From: ‘.$from.$this->lf.implode($this->lf, $this->headers).$this->lf.implode($this->lf, $xtra_headers)); } }

11/El tema de XSS en el formulario Contactenos

Usando datos malintencionados es posible inyecctar HTML en la pagina.

Solución:

Lineas 221-225 in catalog/includes/functions/html_output.php cambiar:

if ( (isset($GLOBALS[$name])) && ($reinsert_value true) ) { $field .= stripslashes($GLOBALS[$name]); } elseif (tep_not_null($text)) { $field .= $text; } a: if ( (isset($GLOBALS[$name])) && ($reinsert_value true) ) { $field .= tep_output_string_protected(stripslashes($GLOBALS[$name])); } elseif (tep_not_null($text)) { $field .= tep_output_string_protected($text); }

Lineas 244-248 in catalog/admin/includes/functions/html_output.php cambiar:

Page 25: Manual de OsCommerce

if ( (isset($GLOBALS[$name])) && ($reinsert_value true) ) { $field .= stripslashes($GLOBALS[$name]); } elseif (tep_not_null($text)) { $field .= $text; } a: if ( (isset($GLOBALS[$name])) && ($reinsert_value true) ) { $field .= tep_output_string_protected(stripslashes($GLOBALS[$name])); } elseif (tep_not_null($text)) { $field .= tep_output_string_protected($text); }

12/ Redireccionamiento Abierto

No existe ningún chequeo en la página de redirección, y permite fuentes externas usar la página como un redireccionamiento abierto.

Solución:

Lineas 27-29 in catalog/redirect.php cambiar:

if (isset($HTTP_GET_VARS['goto']) && tep_not_null($HTTP_GET_VARS['goto'])) { tep_redirect('http://' . $HTTP_GET_VARS['goto']); } a: if (isset($HTTP_GET_VARS['goto']) && tep_not_null($HTTP_GET_VARS['goto'])) { $check_query = tep_db_query("select products_url from " . TABLE_PRODUCTS_DESCRIPTION . " where products_url = '" . tep_db_input($HTTP_GET_VARS['goto']) . "' limit 1"); if (tep_db_num_rows($check_query)) { tep_redirect('http://' . $HTTP_GET_VARS['goto']); } }

13/ Barras Extras en Nuevos Productos

Cuando creas y producto, y previsualizas, al volver generaba unos errores con las barras

Solución:

Las siguientes lineas deben ser cambiadas en catalog/admin/categories.php:

Linea 504, de:

<td class="main"><?php echo tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('products_name[' . $languages[$i]['id'] . ']', (isset($products_name[$languages[$i]['id']]) ? $products_name[$languages[$i]['id']] : tep_get_products_name($pInfo->products_id, $languages[$i]['id']))); ?></td> a: <td class="main"><?php echo tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('products_name[' . $languages[$i]['id'] . ']', (isset($products_name[$languages[$i]['id']]) ? stripslashes($products_name[$languages[$i]['id']]) : tep_get_products_name($pInfo->products_id, $languages[$i]['id']))); ?></td>

Linea 538, de:

<td class="main"><?php echo tep_draw_textarea_field('products_description[' . $languages[$i]['id'] . ']', 'soft', '70', '15', (isset($products_description[$languages[$i]['id']]) ? $products_description[$languages[$i]['id']] : tep_get_products_description($pInfo->products_id, $languages[$i]['id']))); ?></td> a: <td class="main"><?php echo tep_draw_textarea_field('products_description[' . $languages[$i]['id'] . ']', 'soft', '70', '15', (isset($products_description[$languages[$i]['id']]) ? stripslashes($products_description[$languages[$i]['id']]) : tep_get_products_description($pInfo->products_id,

Page 26: Manual de OsCommerce

$languages[$i]['id']))); ?></td>

Linea 574, de:

>td class="main">>?php echo tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('products_url[' . $languages[$i]['id'] . ']', (isset($products_url[$languages[$i]['id']]) ? $products_url[$languages[$i]['id']] : tep_get_products_url($pInfo->products_id, $languages[$i]['id']))); ?>>/td> a: <td class="main"><?php echo tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('products_url[' . $languages[$i]['id'] . ']', (isset($products_url[$languages[$i]['id']]) ? stripslashes($products_url[$languages[$i]['id']]) : tep_get_products_url($pInfo->products_id, $languages[$i]['id']))); ?></td>

14/ Filtrando el Estado de Pedido

Después de cambiar el filtro de estado de pedidos en Administración -> Clientes -> Pedidos, seleccionando “Todos los Pedidos” mostrara una lista vacia de pedidos.

Solución:

Linea 357 in catalog/admin/orders.php cambiar:

} elseif (isset($HTTP_GET_VARS['status'])) { a: } elseif (isset($HTTP_GET_VARS['status']) && is_numeric($HTTP_GET_VARS['status']) && ($HTTP_GET_VARS['status'] > 0)) {

15/ Compatibilidad con MySQL 5.0

Hay ciertos queries de MySQL que no son compatibles y por lo tanto, no se pueden ejecutar en MySQL5.

Solución:

Linea 213-223 en catalog/advanced_search_result.php cambiar:

$from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c";

if ( (DISPLAY_PRICE_WITH_TAX 'true') && (tep_not_null($pfrom) || tep_not_null($pto)) ) { if (!tep_session_is_registered('customer_country_id')) { $customer_country_id = STORE_COUNTRY; $customer_zone_id = STORE_ZONE; } $from_str .= " left join " . TABLE_TAX_RATES . " tr on p.products_tax_class_id = tr.tax_class_id left join " . TABLE_ZONES_TO_GEO_ZONES . " gz on tr.tax_zone_id = gz.geo_zone_id and (gz.zone_country_id is null or gz.zone_country_id = '0' or gz.zone_country_id = '" . (int)$customer_country_id . "') and (gz.zone_id is null or gz.zone_id = '0' or gz.zone_id = '" . (int)$customer_zone_id . "')"; }

$where_str = " where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id "; a: $from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id";

if ( (DISPLAY_PRICE_WITH_TAX ‘true’) && (tep_not_null($pfrom) || tep_not_null($pto)) ) { if (!tep_session_is_registered(‘customer_country_id’)) { $customer_country_id = STORE_COUNTRY; $customer_zone_id = STORE_ZONE; } $from_str .= ” left join ” . TABLE_TAX_RATES . ” tr on p.products_tax_class_id = tr.tax_class_id left join ” . TABLE_ZONES_TO_GEO_ZONES . ” gz on tr.tax_zone_id = gz.geo_zone_id and (gz.zone_country_id is null or gz.zone_country_id = ‘0’ or gz.zone_country_id = ‘” . (int)

Page 27: Manual de OsCommerce

$customer_country_id . “’) and (gz.zone_id is null or gz.zone_id = ‘0’ or gz.zone_id = ‘” . (int)$customer_zone_id . “’)”; }

$from_str .= “, ” . TABLE_PRODUCTS_DESCRIPTION . ” pd, ” . TABLE_CATEGORIES . ” c, ” . TABLE_PRODUCTS_TO_CATEGORIES . ” p2c”;

$where_str = ” where p.products_status = ‘1’ and p.products_id = pd.products_id and pd.language_id = ‘” . (int)$languages_id . “’ and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id “;

Lsa siguientes lineas deben ser cambiadas en catalog/index.php:

Linea 175, de:

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'"; a: $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'";

Linea 178, de:

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'"; a: $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'";

Linea 184, de:

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'"; a: $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price,

Page 28: Manual de OsCommerce

IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";

Linea 187, de:

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'"; a: $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";

Linea 292 in catalog/admin/categories.php cambiar:

tep_db_query("insert into " . TABLE_PRODUCTS . " (products_quantity, products_model,products_image, products_price, products_date_added, products_date_available, products_weight, products_status, products_tax_class_id, manufacturers_id) values ('" . tep_db_input($product['products_quantity']) . "', '" . tep_db_input($product['products_model']) . "', '" . tep_db_input($product['products_image']) . "', '" . tep_db_input($product['products_price']) . "', now(), '" . tep_db_input($product['products_date_available']) . "', '" . tep_db_input($product['products_weight']) . "', '0', '" . (int)$product['products_tax_class_id'] . "', '" . (int)$product['manufacturers_id'] . "')"); a: tep_db_query("insert into " . TABLE_PRODUCTS . " (products_quantity, products_model,products_image, products_price, products_date_added, products_date_available, products_weight, products_status, products_tax_class_id, manufacturers_id) values ('" . tep_db_input($product['products_quantity']) . "', '" . tep_db_input($product['products_model']) . "', '" . tep_db_input($product['products_image']) . "', '" . tep_db_input($product['products_price']) . "', now(), " . (empty($product['products_date_available']) ? "null" : "'" . tep_db_input($product['products_date_available']) . "'") . ", '" . tep_db_input($product['products_weight']) . "', '0', '" . (int)$product['products_tax_class_id'] . "', '" . (int)$product['manufacturers_id'] . "')");

Los siguientes comandos MySQL deben ser ejecutados:

ALTER TABLE whos_online MODIFY COLUMN last_page_url VARCHAR(255) NOT NULL;

ALTER TABLE customers MODIFY COLUMN customers_default_address_id INTEGER;

ALTER TABLE customers_basket MODIFY COLUMN final_price DECIMAL(15,4);

Vía SmartOsc