• Desarrollar para el CCR
  • Cómo empezar
  • ¡Hola Mundo!
  • Tipos de programas
  • Proceso de producción
  • Precios
  • Programas para abrir archivos
  • Dudas y consultas
  • Lado Cliente
  • CSS
  • Javascript
  • Funciones
  • Usuario
  • Datos del Usuario
  • Datos de la Empresa
  • Seguridad
  • Guardar contraseña
  • Recuperar contraseña
  • Actualizar contraseña
  • Eliminar contraseña
  • Archivos
  • Listar archivos
  • Nuevo drive
  • Crear archivo
  • Crear carpeta
  • Renombrar archivo
  • Abrir archivo
  • Recuperar archivo
  • Guardar archivo
  • Eliminar archivo
  • Sistema
  • Abrir contenido
  • Alerta
  • Confirmar
  • Geolocalización
  • Compra
  • Eventos
  • Teclas
  • Pulsa Tecla
  • Presiona Tecla
  • Suelta Tecla
  • Ratón
  • Ratón sale
  • Ratón click
  • Navegador
  • Desfocusea el navegador
  • Archivos
  • Actualización
  • Lado Servidor
  • Variables POST y GET
  • Servidor PHP
  • Workflow
  • Sistema de carpetas
  • Objetos y variables
  • Servidor NodeJS
  • Sistema de carpetas
  • Objetos y variables
Precios
Todos los programas

Todos los programas tendrán un coste para el desarrollador por el espacio usado en el CCR. Los primeros 20GB son gratuitos. Puedes alojar tu programa en tus servidores y aquí solo alojar el html y comunicarte con tu servidor haciendo uso de javascript

Espacio Programa Open Source
Hasta 20GB GRATIS GRATIS
Cada 20GB extra 5€ 2.5€
Open Source

Porque nos gusta apoyar a la comunidad open source para mejorar el futuro, llevamos a cabo un 50% de descuento al coste del alojamiento de los programas open source. Para que se te aplique este descuento, libera tu código fuente y mándanos un correo a contacto@rigovi.com con los datos de tu programa, la licencia bajo la que has liberado tu código y dónde puede encontrarlo la comunidad.

Programas de pago en la tienda

Los programas que se publiquen y se vendan a través de la tienda del CCR, tendrán una comisión del 15%.

Programas privados

Los programas que no se publiquen en la tienda del CCR y solo se distribuya de manera privada, tendrán un coste extra de 5€ al mes por usuario que lo tenga a partir del 3er usuario.

Eventos de archivos (cliente / javascript)

Estos eventos sirven para detectar eventos relacionados con los archivos del usuario.

Existen los siguientes eventos:

  • Actualización
Actualización "actualizacion"

El evento actualizacion() se activa cuando se ha llevado a cabo un cambio en el sistema de archivos del usuario.

Se activa de la siguiente manera:

ccr_eventos.archivos.actualizacion.activar( callback() )

Descripción de las variables:

callback ( idDrive , idArchivo , padres ) - La función actualizacion llamará a esta función cuando se haya producido un cambio en el sistema de archivos del usuario. Sus variables y descripciónes en este orden son:

idDrive - El id del Drive al que pertenece el archivo actualizado. 'root' si es los drives conectados

idArchivo - El id del archivo donde se ha producido el cambio. 'root' si pertenece al root del drive

padres - Array con los ids de los padres del archivo donde se ha producido el cambio

Se desactiva de la siguiente manera:

ccr_eventos.archivos.actualizacion.desactivar( )

Ejemplos:
Eventos Javascript (cliente)

Los programas no pueden salirse del espectro de su programa/ventana pero existen eventos que el programa quiere escuchar y se hace escuchando el o el . Para aislar las acciones en el exterior del programa se deberán hacer uso de estos eventos.

Los siguientes eventos son accesibles desde el javascript de los programas en el lado del cliente.

Existen varios tipos de eventos (teclas, archivos...) los cuales enumeramos aquí y detallamos en sus secciones.

  • Teclas
  • Archivos

Para comenzar a escuchar los eventos se hará añadiendo .activar tras el nombre de la función. Ej: 'ccr_eventos.teclas.sueltaTecla.activar()'. Y para dejar de escuchar el evento se hará añadiendo .desactivar tras el nombre de la función. Ej: 'ccr_eventos.teclas.sueltaTecla.desactivar()'.

Eventos en el navegador (cliente / javascript)

Estos eventos sirven para detectar ciertos eventos en el navegador.

Existen los siguientes eventos:

  • Desfocusea el navegador
El usuario cambia a otro programa

El evento desfocusea() se activa cuando el usuario cambia a otro programa en su ordenador dejando de estar focuseado el navegador.

Se activa de la siguiente manera:

ccr_eventos.navegador.desfocusea.activar( callback() )

Descripción de las variables:

callback ( evento ) - La función desfocusea llamará a esta función cuando el usuario cambia de programa. Su variable y descripción es:

evento - Los datos del evento generado por window.onblur

Se desactiva de la siguiente manera:

ccr_eventos.navegador.desfocusea.desactivar( )

Ejemplos:
Eventos del ratón (cliente / javascript)

Estos eventos sirven para detectar cuando el usuario mueve el ratón realizando alguna acción en particular.

Existen los siguientes eventos:

  • Ratón sale
  • Ratón click
El ratón sale del navagador

El evento sale() se activa cuando el usuario mueve el ratón fuera del navegador.

Se activa de la siguiente manera:

ccr_eventos.raton.sale.activar( callback() )

Descripción de las variables:

callback ( evento ) - La función sale llamará a esta función cuando el usuario mueva el ratón fuera del navegador. Su variable y descripción es:

evento - Los datos del evento generado por .on('mouseleave')

Se desactiva de la siguiente manera:

ccr_eventos.raton.sale.desactivar( )

Ejemplos:
El ratón hace click en el navagador

El evento click() se activa cuando el usuario hace click con los botones del ratón.

Se activa de la siguiente manera:

ccr_eventos.raton.click.activar( lugar, callback() )

Descripción de las variables:

click - Objeto de jquery con la localización sobre lo que quiere escuchar el click. Ej. $('localizacion')

callback ( evento ) - La función click llamará a esta función cuando el usuario haga click sobre el elemento lugar. Su variable y descripción es:

evento - Los datos del evento generado por window.addEventListener('click', function(e) {})

Se desactiva de la siguiente manera:

ccr_eventos.raton.click.desactivar( )

Ejemplos:
Eventos de teclas (cliente / javascript)

Estos eventos sirven para detectar cuando el usuario presiona alguna tecla.

Existen los siguientes eventos:

  • Pulsa Tecla
  • Presiona Tecla
  • Suelta Tecla
Pulsa tecla "pulsaTecla"

El evento pulsaTecla() se activa cuando el usuario pulsa una tecla del teclado. Es el equivalente al evento 'keypress'.

Se activa de la siguiente manera:

ccr_eventos.teclas.pulsaTecla.activar( callback() )

Descripción de las variables:

callback ( evento ) - La función pulsaTecla llamará a esta función cuando se haya pulsado una tecla. Su variable y descripción es:

evento - Los datos del evento generado por .on('keypress')

Se desactiva de la siguiente manera:

ccr_eventos.teclas.pulsaTecla.desactivar( )

Ejemplos:
Presiona tecla "presionaTecla"

El evento presionaTecla() se activa cuando el usuario presiona una tecla del teclado. Es el equivalente al evento 'keydown'.

Se activa de la siguiente manera:

ccr_eventos.teclas.presionaTecla.activar( callback() )

Descripción de las variables:

callback ( evento ) - La función presionaTecla llamará a esta función cuando se haya presionado una tecla. Su variable y descripción es:

evento - Los datos del evento generado por .on('keydown')

Se desactiva de la siguiente manera:

ccr_eventos.teclas.presionaTecla.desactivar( )

Ejemplos:
Suelta tecla "sueltaTecla"

El evento sueltaTecla() se activa cuando el usuario suelta la tecla presionada. Es el equivalente al evento 'keyup'.

Se activa de la siguiente manera:

ccr_eventos.teclas.sueltaTecla.activar( callback() )

Descripción de las variables:

callback ( evento ) - La función sueltaTecla llamará a esta función cuando se haya levantado la tecla presionada. Su variable y descripción es:

evento - Los datos del evento generado por .on('keyup')

Se desactiva de la siguiente manera:

ccr_eventos.teclas.sueltaTecla.desactivar( )

Ejemplos:
Funciones de sistema (cliente / javascript)

Existen funciones especiales que los programas pueden usar.

Existen las siguientes funciones:

  • Abrir contenido
  • Alerta
  • Confirmar
  • Geolocalización
  • Compra
Abrir contenido "abrirContenido"

La función abrirContenido() abre el contenido de un archivo a partir de una variable. Por ejemplo, en el programa de RigoviFTP, este solicita un archivo json del ftp, lo abre haciendo uso de esta función, el usuario lo modifica y al guardar le devuelve el nuevo contenido al programa para que actualice el archivo en el servidor FTP.

Esta es la función con sus parámetros para solicitar al CCR la lista de archivos y carpetas:

ccr_funciones.sistema.abrirContenido( nombre , mime , contenido , opciones , callbackAlAbrir() , callbackAlCerrar() , callbackAlModificarse() )

Descripción de las variables:

nombre - Nombre del 'archivo'.

mime - Mime del 'archivo'. Puede ser null.

contenido - El contenido a abrir. Si es una imagen a abrirse con el visor de imágenes y pones el link en opciones, no es necesario.

opciones - Opciones extra. Dependen del programa con el que se abra el contenido.

{

link : link, (OPCIONAL. Link al archivo. Si se abre el archivo/contenido con el visor de imagenes, se usará el link en vez de el contenido)

}

callbackAlAbrir ( error , callbackParaCerrar() ) - La función abrirContenido llamará a esta función cuando se haya abierto el programa. Sus variables y descripción son en este orden:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario ha descargado el contenido (no se ha abierto el programa)

4 - El usuario ha canclado la apertura del contenido

callbackParaCerrar() - El programa que hace uso de la función abrirContenido puede mediante esta función cerrar el programa que ha abierto.

callbackAlCerrar ( ) - La función abrirContenido notificará al programa mediante esta función cuando se haya cerrado el archivo abierto. Sus variables y descripción son en este orden:

callbackAlModificarse ( nuevoContenido , callbackRespuesta() ) - La función abrirContenido notificará al programa mediante esta función cuando se haya modificado el archivo abierto. Sus variables y descripción son en este orden:

nuevoContenido - El nuevo contenido del archivo

callbackRespuesta(res) - Función para devolver información al programa que tiene abierto el código. El parámetro a devolver contendrá:

{

resultado : true | false, (Devolver true, si se ha podido guardar correctamente. False e.o.c.)

}

Ejemplos:
Mensaje de alerta

La función alerta() lleva a cabo una función similar a la función alert de javascript que se adapta a si el usuario se encuentra en la App o en el escritorio, da más funcionalidades y se adapta al diseño de la plataforma.

Esta es la función con sus parámetros para crear la alerta en el CCR:

ccr_funciones.sistema.alerta( titulo , mensaje , boton , callback() )

Descripción de las variables:

titulo - Titulo de la alerta.

mensaje - Mensaje a mostrar.

boton - Nombre del botón a mostrar.

callback () - La función alerta llamará a esta función cuando el usuario haya cerrado el mensaje de alerta.

Ejemplos:
Mensaje de confirmación

La función confirmar() lleva a cabo una función similar a la función confirm de javascript que se adapta a si el usuario se encuentra en la App o en el escritorio, da más funcionalidades y se adapta al diseño de la plataforma.

Esta es la función con sus parámetros para crear el mensaje de confirmación en el CCR:

ccr_funciones.sistema.confirmar( titulo , mensaje , botones , callback() )

Descripción de las variables:

titulo - Titulo de la alerta.

mensaje - Mensaje a mostrar.

botones - Array de strings con el contenido de los botones. Opcional. Si null se ponen los botones 'Aceptar' y 'Cancelar'.

callback ( error , localizacion ) - La función confirmar llamará a esta función cuando el usuario pulse el botón de una de las opciones. Sus variables y descripción son en este orden:

error - Sus códigos de eror son:

-1 - Localización no soportada. El usuario se encuentra usando el CCR en un dispositivo del que no se puede recuperar una localización

-2 - El usuario no tiene activado el GPS

localizacion - JSON con los datos de su localización. El JSON contendrá:

{

latitud : Latitud de su localización

longitud : Longitud de su localización

precision : Precisión de su localización

precisionAltura : Precisión de la altura de su localización

altitud : Altura de su localización

direccion : Direción del usuario

velocidad : Velocidad del usuario

fecha : Fecha de la geolocalización

}

Ejemplos:
Geolocalización del usuario

La función geolocalizacion() solicita al usuario su localización adaptándose a si el usuario se encutra en la App o en el escritorio.

Esta es la función con sus parámetros para recuperar la localización del usuario:

ccr_funciones.sistema.confirmar( altaPrecision , tiempoEspera , edadMaxima , callback() )

Descripción de las variables:

altaPrecision - Precisión que se solicita. True si alta, False si no es necesario.

tiempoEspera - Milisegundos máximo de espera.

edadMaxima - Edad máxima de la localización si el usuario lo tuviera cacheado en milisegundos

callback ( numBoton ) - La función confirmar llamará a esta función cuando el usuario pulse el botón de una de las opciones. Sus variables y descripción son en este orden:

numBoton - El número de botón presionado. Ej. Si se llama a la función pasando el parámetro botones como ['Aceptar', 'Cancelar'] si el usuario pulsa aceptar devolvería 1.

Ejemplos:
Compra

Si tu programa tiene compras integradas con esta función podrás ofrecer un método sencillo para cobrarlos. Cuando se lleva a cabo el pago, junto con la respuesta en el callback, se lleva a cabo una llamada POST a tu programa en /www/ajax.php con los datos más abajo descritos.

Esta es la función con sus parámetros para solicitar al CCR cobrar el producto/servicio:

ccr_funciones.sistema.comprar( entradas , identificador , aceptarDevoluciones , callbackAlFinalizar() )

Descripción de las variables:

entradas - Un array con los datos de la compra. Por ejemplo:

{

descripcion : descripción del producto

precioUnitario : precio unitario con el iva incluido (máximo 2 decimales)

iva : (OPCIONAL. 21 por defecto) iva del producto. Un número mayor que 0.

descuento : (OPCIONAL. 0 por defecto) porcentaje de descuento del precio entre 0 y 100

cantidad : (OPCIONAL. 1 por defecto) cantidad de artículos

}

identificador - Identificador de la compra.

aceptarDevoluciones - La compra acepta devolución.

callback ( error , respuesta ) - La descripción de las variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - Una variable en los parámetros de la llamada de esta función no es válido

3 - Un dato en el parámetro de entradas de producto no es válido

4 - El usuario ha cancelado el pago

respuesta - Un json con los datos del pago:

{

identificador : el identificador de la compra introducido en la llamada

total : el total del pago

}

Descripción de los datos enviados mediante post a /www/ajax.php como confirmación:

accion = 'pagoRealizado'

cantidad = cantidad pagada

identificador = identificador introducido en la llamada de esta función

idPersona = identificador de la persona que ha realizado la compra

Ejemplos:
Funciones de archivos (cliente / javascript)

En el CCR, los usuarios cuentan con un sistema de archivos y carpetas a través de terceros como son onedrive, dropbox o google drive. Los programas podrán acceder (si tienen los permisos necesarios) al sistema de archivos del usuario.

Para hacer uso de estas funciones se necesitará que el usuario conceda los permisos necesarios

Existen las siguientes funciones:

  • Listar archivos
  • Nuevo drive
  • Crear archivo
  • Crear carpeta
  • Renombrar archivo
  • Abrir archivo
  • Recuperar archivo
  • Guardar archivo
  • Eliminar archivo
Funcionamiento en detalle

Todo parte de la carpeta root. Dentro de esta carpeta se encontrarán los drives que el usuario tenga conectado. Cada drive conectado tiene un nombre que el usuario le haya dado pero cada uno se representa con un número.

Dentro de cada drive se encontrarán las carpetas y archivos que este tenga.

Atención:

- Puesto que cada sistema drive hace uso de diferentes métodos en su forma de trabajar con los archivos, en las funciones se deberá pasar tanto la ruta como el id del archivo sobre el que se quiere trabajar puesto que algunos drives hacen uso del id y otros hacen uso de la ruta.

- A la hora de crear archivos o carpetas, de renombrar... algunos drives permiten múltiples archivos con el mismo nombre en la misma ruta, otros no permiten ni tener una carpeta y un archivo con el mismo nombre. Siempre se deberá comprobar con el id.

Listar archivos "listar"

La función listar() devolverá al programa un listado con las carpetas y archivo que este contenga.

Esta es la función con sus parámetros para solicitar al CCR la lista de archivos y carpetas:

ccr_funciones.archivos.listar ( ruta , idCarpeta , callback() )

Debido a que cada sistema drive funciona de manera diferente, para recuperar el listado con los archivos de una carpeta, se ha de pasar tanto la ruta al archivo como su id.

Descripción de las variables:

ruta - Ruta de la carpeta de la que quiere su contenido. '/' si se quiere la lista de los drives conectados. La ruta a una carpeta deberá ser de la siguiente manera: '/<id del drive>/<ruta de la carpeta>'.

idCarpeta - Id de la carpeta de la que quiere su contenido.

callback ( error , archivos ) - La función listar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

archivos - Puede devolver dos resultados:

- False si el sistema todavía no ha cargado los archivos. En este caso, escuchar el evento 'ccr_eventos.archivos.actualizacion.activar' para ser notificado cuando se hayan cargado. Solo puede ser devuelto al solicitar el listado de los drives conectados en root (/).

- Un array con el listado de los archivos. (Máximo 500 archivos). Cada archivo se compone de un JSON que contendrá:

{

id : id, (Id del archivo)

nombre : nombre (Nombre del archivo)

icono : icono (URL de la imagen de su icono)

esCarpeta : esCarpeta (true si es una carpeta)

ruta : ruta (Ruta completa al archivo)

}

Ejemplos:
Conectar nuevo drive "nuevo"

La función nuevo() pedirá al usuario que tipo de drive quiere conectar y solicitará los permisos de acceso correspondientes.

Esta es la función con sus parámetros:

ccr_funciones.archivos.nuevo( callback() )

Descripción de las variables:

callback ( error , idNuevoDrive ) - La función nuevo devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario ha cancelado el proceso.

idNuevoDrive - El id del nuevo drive conectado

Ejemplos:
Crear archivo "crearArchivo"

La función crearArchivo() creará un archivo vacío en la ruta especificada.

Esta es la función con sus parámetros:

ccr_funciones.archivos.crearArchivo( ruta , idCarpeta , nombreDelNuevoArchivo , callback() )

Debido a que cada sistema drive funciona de manera diferente, para llevar a cabo esta función, se ha de pasar tanto la ruta de la carpeta como su id.

Descripción de las variables:

ruta - Ruta de la carpeta donde se quiere crear el archivo. ( '///' )

idCarpeta - Id de la carpeta donde se quiere crear el archivo.

nombreDelNuevoArchivo - Nombre del archivo que se quiere crear. Atención: el nombre final puede variar si ya existe un archivo con ese nombre.

callback ( error , datosDelNuevoArchivo ) - La función listar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No existen los permisos para crear el archivo donde se ha especificado.

5 - Ya existe un archivo con ese nombre. Atención: según la configuración del usuario, puede llevarse a cabo esta función correctamente pero con otro nombre. Ej. 'nombre (1).jpg'.

datosDelNuevoArchivo - Un JSON con los datos del archivo:

{

id : id, (Id del archivo)

nombre : nombre, (Nombre final del archivo. No necesariamente será el pasado por parámetro)

icono : icono,

esCarpeta : false,

ruta : ruta (Ruta completa del archivo)

}

Ejemplos:
Crear carpeta "crearCarpeta"

La función crearCarpeta() creará una carpeta en la ruta especificada.

Esta es la función con sus parámetros:

ccr_funciones.archivos.crearCarpeta( ruta , idCarpeta , nombreDeLaNuevaCarpeta , callback() )

Debido a que cada sistema drive funciona de manera diferente, para llevar a cabo esta función, se ha de pasar tanto la ruta de la carpeta como su id.

Descripción de las variables:

ruta - Ruta de la carpeta donde se quiere crear la carpeta. ( '/<idDriveConectado>/<ruta a la carpeta padre>/' )

idCarpeta - Id de la carpeta donde se quiere crear la carpeta. 'root' si se quiere crear en el root de un drive

nombreDeLaNuevaCarpeta - Nombre de la carpeta que se quiere crear. Atención: el nombre final puede variar si ya existe un archivo con ese nombre.

callback ( error , datosDeLaNuevaCarpeta ) - La función listar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No existen los permisos para crear la carpeta donde se ha especificado.

5 - Ya existe un archivo con ese nombre. Atención: según la configuración del usuario, puede llevarse a cabo esta función correctamente pero con otro nombre. Ej. 'nombre (1)'.

datosDeLaNuevaCarpeta - Un JSON con el id, ruta y nombre final de la carpeta:

{

id : id, (Id de la carpeta)

nombre : nombre (Nombre final de la carpeta. No necesariamente será el pasado por parámetro)

icono : icono,

esCarpeta : true,

ruta : ruta (Ruta completa de la carpeta)

}

Ejemplos:
Renombrar archivo "renombrar"

La función renombrar() renombrará la carpeta o el archivo especificado.

Esta es la función con sus parámetros:

ccr_funciones.archivos.renombrar( ruta , idArchivo , nuevoNombre , callback() )

Debido a que cada sistema drive funciona de manera diferente, para llevar a cabo esta función, se ha de pasar tanto la ruta del archivo como su id.

Descripción de las variables:

ruta - Ruta completa al archivo (incluido el archivo al final de la ruta). '/' si es el nombre de un drive lo que se está cambiando

idArchivo - Id del archivo a renombrar.

nuevoNombre - Nuevo nombre que se le quiere dar. Atención: el nombre final puede variar si ya existe un archivo con ese nombre.

callback ( error , res ) - La función renombrar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No existen los permisos para crear la carpeta donde se ha especificado.

5 - Ya existe un archivo con ese nombre. Atención: según la configuración del usuario, puede llevarse a cabo esta función correctamente pero con otro nombre. Ej. 'nombre (1).jpg'.

res - Nombre final del archivo. No necesariamente será el pasado por parámetro

{

nombre : nombre (Nombre final del archivo. No necesariamente será el pasado por parámetro)

}

Ejemplos:
Abrir un archivo "abrir"

La función abrir() abrirá un archivo en el CCR. Si el usuario tiene un programa por defecto que abrir el tipo archivo lo lanzará. Si no, le preguntará al usuario con qué programa abrirlo.

Esta es la función con sus parámetros:

ccr_funciones.archivos.abrir( ruta , idArchivo , programa , callbackAlAbrir() , callbackAlCerrar() , callbackAlModificarse() )

Descripción de las variables:

ruta - Ruta completa al archivo (incluido el archivo al final de la ruta).

idArchivo - Id del archivo.

programa - Programa con el que abrir el archivo. De momento 'seleccionar' si se quiere forzar al usuario el seleccionar el programa con el que abrir el archivo o 'auto' para que el CCR se lo abra con el programa por defecto si es posible.

callbackAlAbrir ( error , callbackParaCerrar ) - La función abrir llamará a esta función cuando se haya abierto el programa. Sus variables y descripción son en este orden:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No existen los permisos para abrir el archivo.

5 - No es un archivo.

callbackParaCerrar - El programa que hace uso de la función abrir puede mediante esta función cerrar el programa que ha abierto.

callbackAlCerrar ( ) - La función abrir notificará al programa mediante esta función cuando se haya cerrado el archivo abierto. Sus variables y descripción son en este orden:

callbackAlModificarse ( ) - La función abrir notificará al programa mediante esta función cuando se haya modificado el archivo abierto. Sus variables y descripción son en este orden:

{

resultado : ok | error,

nuevoContenido : contenido

}

Ejemplos:
Recupera el contenido de un archivo "recuperar"

La función recuperar() devolverá el contenido del archivo solicitado.

Esta es la función con sus parámetros:

ccr_funciones.archivos.recuperar( ruta , idArchivo , callback() )

Descripción de las variables:

ruta - Ruta completa al archivo (incluido el archivo al final de la ruta).

idArchivo - Id del archivo.

callback ( error , contenido ) - La función recuperar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No se ha podido acceder al archivo especificado.

contenido - JSON con datos y contenido del archivo

{

contenido : contenido, (contenido del archivo)

link : link (link al archivo)

}

Ejemplos:
Guardar datos en un archivo "guardar"

La función guardar() guadará los datos que el programa le pase a la función en el archivo especificado. Si existe lo sobreescribirá

Esta es la función con sus parámetros:

ccr_funciones.archivos.guardar( ruta , idCarpetaPadre , idArchivo , contenido , callback() , progreso() )

Descripción de las variables:

ruta - Ruta completa al archivo (incluido el archivo al final de la ruta).

idCarpetaPadre - Id de la carpeta que contiene el archivo. Solo es necesario si se está creando un nuevo archivo. 'root' si es en la carpeta root del drive conectado.

idArchivo - Id del archivo. null si es un archivo nuevo.

contenido - El contenido a guardar. Puede ser un string o un Blob/File

callback ( error , datosDelArchivo ) - La función guardar devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No se ha podido modificar al archivo especificado.

5 - No se ha podido crear al archivo especificado.

datosDelArchivo - JSON con los datos del archivo conteniendo:

{

archivo : archivo, (Datos del archivo)

idDrive : idDrive, (Id del drive donde se encuentra)

ruta : ruta (Ruta completa del archivo. Incluido el archivo al final de la ruta)

}

progreso ( res ) - La función guardar devolverá el progreso de la subida mediante este método. Devuelve:

{

porcentaje : porcentaje, (Porcentaje de la subida realizada)

total : total (Total de bytes subiendo)

subido : subido (Total de bytes subidos)

}

Ejemplos:
Guardar datos en un archivo "eliminar"

La función eliminar() mandará a la 'basura' los archivos especificados. También usado para eliminar un drive del usuario. Los drives solo se pueden eliminar de uno en uno

Esta es la función con sus parámetros:

ccr_funciones.archivos.eliminar( arrayArchivos , callback() )

Descripción de las variables:

arrayArchivos - Array con los archivos a eliminar. Cada archivo en el array será un JSON de la siguiente forma:

{

id : id, (Id del archivo)

idPadre : idCarpetaPadre, (Id de la carpeta padre. 'root' si es un drive)

ruta : ruta (Ruta completa del archivo. Incluido el archivo al final de la ruta. '/' si es un drive)

}

callback ( error , datosDelArchivo ) - La función eliminar devolverá la confirmación mediante este método. Llamará a esta función por cada archivo en el array. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El programa no tiene permiso para hacer uso de esta función

3 - El usuario necesita renovar los permisos de acceso del CCR al drive y ha rechazado hacerlo.

4 - No se ha podido eliminar el archivo especificado.

5 - No se ha encontrado el archivo especificado.

6 - El usuario no ha confirmado la eliminación de los archivos.

datosDelArchivo - Los datos del archivo de la confirmación. Se haya realizado o no correctamente esta variable contendrá los datos del mismo.

Ejemplos:
Desarrollar para el CCR
Programa una vez, disponible donde quieras

El CCR se ha creado para ofrecer a los usuarios los programas, funcionalidades y sus datos esté donde esté. Programa tu aplicación de manera responsive y los usuarios podrán acceder y hacer uso de la aplicación tanto desde cualquier ordenador, tablet o móvil, ya sea iOS o Android.

Alcanza nuevos clientes

Podrás ofrecer sin costes extras el acceso a tu programa desde el móvil con la App del CCR, pudiendo acceder y hacer uso de funcionalidades del móvil.

También consigue nuevos clientes que ya se encuentren en el CCR y necesiten de tus soluciones.

Total libertad

El CCR está diseñado para adaptarse a las aplicaciones web y no a la inversa. Sin mucho esfuerzo ni grandes modificaciones puedes publicar tu programa web en el CCR, y de la misma forma lo puedes sacar y publicar donde quieras de manera independiente.

Olvídate de servidores

Crea un programa, alójalo en nuestros servidores y olvídate de hostings, mantenimiento, alquiler de servidores... Solo pagarás por el almacenamiento que utilice tu programa a partir de los 20GB y el servidor se adaptará a tus necesidades o si bien lo prefieres utiliza tus propios servidores.

Ofrece a tus clientes un nivel extra

Accede a los archivos del usuario y guárdale los pdf que generas, interacciona con otros programas y haz tu programa más enriquecido y atractivo para tus clientes.

Cómo empezar

Para hacerte desarrollador solo necesitas dos cosas:

Identifícate

Inicia sesión si no lo has hecho ya haciendo click en el botón 'Identificarse' (Si pone 'Acceder al CCR' es que ya estás identificado) arriba a la derecha o hazte una cuenta en el CCR haciendo click aquí.

Date de alta como desarrollador

Haz click sobre el botón 'quiero ser desarrollador' para darte de alta como desarrollador y poder empezar a crear tus programas. En el momento que lo hagas, aparecerá el programa 'desarrolladores' en tu escritorio para crear y controlar los programas que crees.

Inicialmente serás desarrollador gratuito y podrás trabajar en tu primer programa y conocer el funcionamiento del CCR. Cuando quieras publicarlo o quieras crear un segundo programa se te solicitará darte de alta como desarrollador profesional. El precio para ser desarrollador profesional y poder publicar y trabajar en todos los programas que quieras es de 10€ al año.

Quiero ser desarrollador
Siguiente
¡Hola Mundo!
Anterior
Cómo empezar
Siguiente
Programar ¡Hola Mundo!
Creando tu primer programa

En este pequeño tutorial podrás ver lo rápido y sencillo que es desarrollar un programa para el CCR. En unos minutos tendrás tu primer programa corriendo y funcionando tanto para navegadores como para móviles.

Paso 1: Abrir el programa Desarrolladores

Una vez que te hayas dado de alta como desarrollador en el apartado anterior 'Cómo empezar', te aparecerá en el escritorio el programa Desarrolladores:

Siendo esta su interfaz:

Paso 2: Crear un nuevo programa

Haz click en el botón superior de la izquierda 'Crear nuevo programa'. Te saltará el siguiente pop up:

Rellena los datos del nuevo programa:

Nombre - El nombre que le quieras dar al programa

Tipo de programa - Selecciona si va a ser un programa orientado a Empresas o para uso personal. Para más información haz click aquí

Descripción - Escribe una descripción del programa

Para el programa que estamos haciendo '¡Hola Mundo!' lo rellenamos con los datos que aparecen en la imagen anterior y pulsa continuar

Paso 3: Seleccionando servidor

Para terminar de crear el programa rellena el siguiente popUp con la siguiente información:

Cuando creas un programa en el CCR, tienes la libertad de escoger tus necesidades específicas para el proyecto.

Servidor - Actualmente tenemos disponible los lenguajes de programación PHP 5.5, PHP 7.0 y muy próximamente NodeJS.

Base de datos - Por ahora ofrecemos bases de datos mysql.

Si tu programa hace uso de otras tecnologías o hace uso de varias ponte en contacto con nosotros sin ningún compromiso.

Paso 4: Datos de acceso a los servidores

Según crees el programa, aparecerán las contraseñas de acceso FTP al servidor y la contraseña de acceso a la base de datos. Guarda estas contraseñas porque no las podrás recuperar, solo las podrás cambiar.

¡Ya has creado tu primer programa! ¡Ahora toca programarlo!

Anterior
Cómo empezar
Siguiente
Programar ¡Hola Mundo!
Anterior
¡Hola Mundo!
Programando ¡Hola Mundo!
Conectando al servidor FTP

Una vez creado el programa, te aparecerán todos los datos acerca del mismo y bajo el apartado 'Servidores del programa' el dominio del servidor y el usuario. Junto con la contraseña que has recibido al crear el programa conéctate mediante el uso del FTP

Según te conectes verás dos carpetas. Para más información acerca del sistema de carpetas accede en el menú lateral de la izquierda a "Lado Servidor" -> "Servidor PHP" -> "Sistema de carpetas"

Programando ¡Hola Mundo!

Modifica el archivo /www/index.php e introduce dentro del div con id "zonaUtil" el siguiente código:

<div class="fila">
<div class="mensajeHolaMundo">¡Hola Mundo!</div>
</div>

Modifica el archivo /www/css/style.css y añade el siguiente código al final:

.mensajeHolaMundo {
width: 150px;
text-align: center;
margin: 30px auto;
padding: 10px 0;
background-color: #E2F4FF;
font-size: 18px;
border: 1px solid #83A6BC;
}

Una vez que has realizado los cambios dirígete a tu escritorio en el CCR y abre la carpeta de "Programas En Desarrollo". Ahí encontrarás el programa en el que estás trabajando.

¡Ábrelo y verás los resultados de lo que has hecho!

Trabajando con las carpetas del usuario

En esta sección vamos a listar los archivos del usuario en el CCR. Para ello deberás tener al menos un drive sincronizado. Si no lo tienes, abre tu carpeta "Mis drives" en el escritorio y sincroniza tu Dropbox, tu Google Drive o tu OneDrive. También puedes crear un botón en tu programa "¡Hola Mundo!" que al hacer click llame a la función ccr_funciones.archivos.nuevo (más información en el menú lateral "Lado Cliente" -> "Javascript" -> "Funciones" -> "Archivos" -> "Nuevo drive".

A continuación vuelve a tu cliente FTP, modifica el archivo /www/js/script.js y añade lo siguiente:

ccr_funciones.archivos.listar('/', '', function(err, archivos) {
if (err) {
ccr_funciones.sistema.alerta('', 'Error en la recuperación de drives');
}
else {
for (var i = 0; i < archivos.length; i++) {
var esCarpetaClass = '';
if (archivos[i].esCarpeta) {
esCarpetaClass = ' esCarpeta'
}
$('.listadoDeArchivos').append('\
<div class="fila filaArchivo'+esCarpetaClass+'" id="'+archivos[i].id+'" ruta="'+archivos[i].ruta+'">\
<img src="'+archivos[i].icono+'">\
<div class="nombre">'+archivos[i].nombre+'</div>\
</div>\
');
}
}
});

Modifica también el archivo /www/index.php y añade lo siguiente después de cerrar el div con clase fila del mensaje hola mundo:

<div class="fila zonaListadoDeArchivos">
<div class="listadoDeArchivos"></div>
</div>

Y añade en el archivo /www/css/style.css al final:

.zonaListadoDeArchivos {
text-align: center;
}
.listadoDeArchivos {
max-width: 400px;
margin: auto;
width: 90%;
max-height: 300px;
min-height: 200px;
border: 1px solid #9f9f9f;
overflow: auto;
}
.listadoDeArchivos .filaArchivo {
border-bottom: 1px solid #9f9f9f;
}
.listadoDeArchivos .filaArchivo.esCarpeta {
cursor: pointer;
}
.listadoDeArchivos .filaArchivo:hover {
background-color: #E2F4FF;
}
.listadoDeArchivos img {
float: left;
width: 50px;
margin-top: 5px;
margin-left: 10px;
margin-right: 10px;
}
.listadoDeArchivos .nombre {
line-height: 60px;
font-size: 18px;
text-align: left;
overflow: hidden;
}

Una vez realizados los cambios vuelve a tu programa "¡Hola mundo!" y haz click en el botón R que se encuentra a la derecha en la barra superior de tu programa junto al botón de minimizar y verás un listado de los drives que tengas conectados.

Vamos a programarlo para poder navegar por las carpetas

Añadimos en el archivo /archivosweb/js/script.js al finalizar el for de la función ccr_funciones.archivos.listar lo siguiente:

navegarPorCarpetas()

Y tras cerrar la función ccr_funciones.archivos.listar lo siguiente:

function navegarPorCarpetas() {
$('.listadoDeArchivos .esCarpeta').off('click')
$('.listadoDeArchivos .esCarpeta').on('click', function() {
var idCarpeta = $(this).attr('id');
var ruta = $(this).attr('ruta');
ccr_funciones.archivos.listar(ruta, idCarpeta, function(err, archivos) {
if (err) {
ccr_funciones.sistema.alerta('', 'Error en la recuperación de archivos');
}
else {
$('.listadoDeArchivos').html('');
for (var i = 0; i < archivos.length; i++) {
var esCarpetaClass = '';
if (archivos[i].esCarpeta) {
esCarpetaClass = ' esCarpeta'
}
$('.listadoDeArchivos').append('\
<div class="fila filaArchivo'+esCarpetaClass+'" id="'+archivos[i].id+'" ruta="'+archivos[i].ruta+'">\
<img src="'+archivos[i].icono+'">\
<div class="nombre">'+archivos[i].nombre+'</div>\
</div>\
');
}
navegarPorCarpetas();
}
});
});
}

Ya puedes navegar por las carpetas, solo faltaría poder volver a la carpeta superior (con la misma función) y abrir los archivos (con la función ccr_funciones.archivos.abrir) pero os lo dejamos a vosotros.

Guardar contraseñas

Aquí haremos un ejemplo donde guardamos una contraseña "en claro" del usuario.

Para ello modificaremos el archivo /www/index.php y añadimos lo siguiente después de cerrar el div con la lista de archivos:

<div class="fila">
<form class="zonaPassword">
<input type="password" name="password" autocomplete="off">
<input type="text" class="ocultar">
<div class="zonaBotonesPassword">
<button type="button" class="boton gris ocultarPassword ocultar">Ocultar</button>
<button type="button" class="boton gris verEnClaro">Ver</button>
<input type="submit" value="Guardar">
</div>
</form>
</div>

En el css /www/css/style.css añadimos al final:

.zonaPassword {
width: 90%;
max-width: 400px;
margin: 30px auto 0;
}
.ocultar {
display: none;
}
.zonaPassword [name="password"],
.zonaPassword [type="text"] {
float: left;
width: calc(100% - 160px);
}
.zonaBotonesPassword {
float: right;
}
.zonaBotonesPassword button {
margin-right: 10px;
}

En el js /www/js/script.js añadimos tras la función navegarPorCarpetas() lo siguiente:

var passwordGuardada = false;
$.ajax({
type: "POST",
url: urlPrograma+'ajax.php',
data: "accion=recuperarPassword",
xhrFields: {
withCredentials: true
},
success: function (response) {
passwordGuardada = response;
}
});
$('.zonaPassword').off('submit');
$('.zonaPassword').on('submit', function(e) {
e.preventDefault();
var password = $(this).find('[name="password"]').val();
if (password.length == 0) {
ccr_funciones.sistema.alerta('', 'No has escrito una contraseña')
}
else {
ccr_funciones.seguridad.guardarPassword(password, function (err, codigo) {
if (err) {
ccr_funciones.sistema.alerta('', 'No se ha podido guardar la contraseña en el CCR')
}
else {
$.ajax({
type: "POST",
url: urlPrograma+'ajax.php',
data: "accion=guardarPassword&codigoPassword="+codigo,
xhrFields: {
withCredentials: true
},
success: function (response) {
ccr_funciones.sistema.alerta('', 'Guardado correctamente');
passwordGuardada = response;
}
});
}
});
}
});
$('.ocultarPassword').off('click');
$('.ocultarPassword').on('click', function() {
$('.zonaBotonesPassword > *').show();
$('.zonaBotonesPassword .ocultarPassword').hide();
$('.zonaPassword [name="password"]').show();
$('.zonaPassword [type="text"]').hide();
});
$('.verEnClaro').off('click');
$('.verEnClaro').on('click', function() {
if (passwordGuardada === false) {
ccr_funciones.sistema.alerta('', 'Todavía no hemos recibido la contraseña de la base de datos.');
}
else if (passwordGuardada.length == 0) {
ccr_funciones.sistema.alerta('', 'Todavía no has guardado ninguna contraseña.');
}
else {
ccr_funciones.seguridad.recuperarPassword(passwordGuardada, function (err, password) {
if (err) {
ccr_funciones.sistema.alerta('', 'Se ha producido un error al recuperar la contraseña')
}
else {
$('.zonaBotonesPassword > *').hide();
$('.zonaBotonesPassword .ocultarPassword').show();
$('.zonaPassword [type="text"]').val(password);
$('.zonaPassword [name="password"]').hide();
$('.zonaPassword [type="text"]').show();
}
});
}
});

Ahora prepararemos el lado del servidor. Modifica el archivo /www/ajax.php y añade al final antes de cerrar el php ( ?> ) lo siguiente:

if (empty($_POST['accion'])) {
die();
}
$accion = $_POST['accion'];
if ($accion == 'guardarPassword') {
$codigoPassword = $_POST['codigoPassword'];
$q = "SELECT id FROM Password WHERE idUsuario='".$GLOBALS['visitantePersona']->getIdPersona()."'";
$result = mysqli_query($GLOBALS['link'], $q);
if ($result === FALSE) {
$q = "CREATE TABLE Password (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, idUsuario INT NOT NULL, codigoPassword VARCHAR(90) NOT NULL)";
mysqli_query($GLOBALS['link'], $q);
}
if ($result === FALSE || mysqli_num_rows($result) == 0) {
$q = "INSERT INTO Password (idUsuario, codigoPassword) VALUES ('".$GLOBALS['visitantePersona']->getIdPersona()."', '".$codigoPassword."')";
}
else {
$row = mysqli_fetch_assoc($result);
$q = "UPDATE Password SET codigoPassword='".$codigoPassword."' WHERE id='".$row['id']."'";
}
mysqli_query($GLOBALS['link'], $q);
echo $codigoPassword;
}
else if ($accion == 'recuperarPassword') {
$q = "SELECT codigoPassword FROM Password WHERE idUsuario='".$GLOBALS['visitantePersona']->getIdPersona()."'";
$result = mysqli_query($GLOBALS['link'], $q);
if ($result === FALSE || mysqli_num_rows($result) == 0) {
echo '';
die();
}
$row = mysqli_fetch_assoc($result);
echo $row['codigoPassword'];
}
Anterior
Cómo empezar
Tipos de programa

Recuerda: Puedes crear tu programa para que sea usado tanto de manera personal como para empresas

Programas Personales

Los programas personales son aquellos que son usados por los usuarios donde ellos y solo ellos (salvo que el programa en sí tenga la capacidad particular) de controlar el programa, instalarlo, desintalarlo y solo ellos (salvo que el programa tengo otras particularidades) tienen acceso a sus propios datos.

Programas para Empresas

Los programas para empresas tienen la capacidad de pertenecer a una empresa. Todas las empresas tienen al menos un administrador que tendrá acceso siempre al programa y estos tienen el poder de dar acceso a diferentes trabajadores. Si tu programa es para empresas recibirá un identificador de la emrpesa y el identificador de usuario del trabajador. Estos programas estarán enfocados para que todos los trabajadores de la empresa que tengan acceso compartan los datos.

Proceso de producción

Cuando se publica un nuevo programa o una nueva versión se llevan a cabo varias modificaciones tanto en los .js como en los .css de tu programa. Recordar que estas modificaciones se llevan a cabo en el programa en producción, el código de tu programa de desarrollo no sufrirá ninguna modificación

Archivos .js

- Eliminar comentarios

Se eliminan los comentarios.

- Rodeo con try/catch

Se añade try y catches cubriendo todo tu programa y en el interior de todas las funciones, de esta manera, si tu javascript sufre un error, solo afectará a tu programa y se registra el error. Podrás acceder a los errores que se hayan producido en tu programa desarrolladores.

- Minificación

Los archivos js son minificados.

Archivos .css

- Eliminar comentarios

Se eliminan los comentarios contenidos en el css.

- Adición de identificador en selectores

Tu código css nunca debe salir de tu programa, para ello se añade el id # delante de todos los selectores. No debería de influir a tu programa, solo recuerda nunca usar en el selector nada por encima de #.

- Minificación

El código en el css es minificado.

Programas para abrir archivos

Actualmente estamos trabajando en automatizar la publicación de programas diseñados para abrir, modificar/editar y guardar archivos. Mientras tanto, ponte en contacto con nosotros si estás interesado en crear un programa de este tipo.

Dudas y consultas

Si tienes cualquier duda, consulta o necesitas acceso a algún recurso o función, ponte en contacto con nosotros por cualquiera de los medios disponibles.

Lado Cliente

En este apartado encontrarás toda la información relacionada con la programación en el lado cliente. Esto incluyen los apartados de css y javascript.

Lado Servidor

En este apartado encontrarás toda la información relacionada con la programación en el lado servidor.

Variables POST y GET

Por seguridad, las variables POST y GET son saneadas. Los siguientes caracteres ( ; , & , " , \ , < , > , : , ( , ) , \ , [ , ] ) son traducidos a su código html ( ej: ; -> ; ). Si quieres desanear una variable puedes hacer uso de la función delimpiarDeCaracteresEspeciales( $string ).

Servidor PHP

En este apartado encontrarás toda la información relacionada con la programación en el servidor PHP.

Workflow

Aquí explicaremos cómo se carga tu programa y el funcionamiento del servidor PHP

Carga del programa

Cuando el usuario abre inicialmente tu programa desde el escritorio, se carga el /www/index.php. El index.php debe tener tanto head como body. Cuando se carga el index.php se extrae de la zona de head los css y los js y los carga y se introduce el contenido de body en la ventana del programa.

Carga de recursos

Todo el contenido dentro de la carpeta /www será accesible desde la url: https://<dominioDondeSeEncuentraElServidor>/programa/<codigoDeTuPrograma>/. (Por ejemplo, si tuvieras el fichero prueba.php en /www accederías al mismo en https://<dominioDondeSeEncuentraElServidor>/programa/<codigoDeTuPrograma>/prueba.php).

Recordar que las carpetas /www/js, /www/css, /www/imagenes y /www/publico son accesibles por usuarios identificados en el CCR aunque no tengan acceso a tu programa.

Todos los demás archivos solo serán accesibles por usuarios que tengan contratado e instalado el programa.

Si el recurso no existe, se cargará el archivo /archivosweb/recurso.php. Atención: A este recurso podrán acceder usuarios identificados tengan o no contratado/instalado el programa.

Objetos y variables

Aquí explicaremos los objetos y las variables accesibles desde el servidor PHP

Variables

$GLOBALS['tieneAccesoAlPrograma'] - 1 si el usuario tiene instalado/contratado, 0 si no.

$GLOBALS['visitantePersona'] - Objeto de clase Persona con los datos del usuario identificado

$GLOBALS['visitanteMirandoEmpresa'] - Si el usuario está accediendo al programa directamente y no en nombre de una empresa devolverá false. En otro caso, objeto de clase Empresa con los datos de la empresa

Objetos

- Objeto Persona

getIdPersona() - Devuelve el id del usuario

getNombre() - Devuelve el nombre del usuario

getApellidos() - Devuelve los apellidos del usuario

getIdPersona() - Devuelve el id del usuario

- Objeto Empresa

getCodEmpresa() - El id de la empresa

getNombreEmpresa() - El nombre de la empresa

Sistema de carpetas

En la carpeta raíz encontrarás dos carpetas: /archivosweb y /www. A continuación explicaremos cada carpeta.

/archivosweb

A los archivos de esta carpeta no se podrán acceder directamente de manera pública (salvo /archivosweb/recurso.php el cual tiene 'cualidades' especiales). Los archivos especiales que se encuentran en esta carpeta son:

/archivosweb/recurso.php - Cualquier llamada a tu programa que trate de acceder a un recurso que no exista, se incluirá este archivo. Atención: A este archivo también se puede acceder aunque un usuario no esté registrado o identificado en el CCR. De esta manera se tiene la libertad de mostrar archivos de manera totalmente pública o gestionar tu propio sistema de url friendly.

/www

Cualquier usuario identificado y con acceso al programa podrá acceder a cualquier archivo de esta carpeta. Esta carpeta contiene por defecto tiene 3 carpetas: 'css', 'js' e 'imagenes'. Estas carpetas se crean automáticamente para ayudarte a organizarte pero salvo la carpeta imagenes (a continuación explicamos por qué) no son obligatorias. Aún así, existen 4 nombres de carpetas que tienen la propiedad de ser accedidas de manera pública si un usuario está identificado en el CCR pero no necesariamente tiene acceso al programa. Estos son: /www/css, /www/js, /www/publico y /www/imagenes.

A continuación explicamos los archivos especiales en la carpeta /www

/www/imagenes/logo.png - Este será el logo de tu programa. Te recomendamos un png de tamaño 200px por 200px

/www/index.php - Este es el archivo que se carga al abrir tu programa. Explicamos más detalles acerca de su funcionamiento en Lado Servidor -> Servidor PHP -> Proceso de carga

/www/ajax.php - Este es el archivo al que el sistema CCR hace llamadas como por ejemplo para confirmar una compra.

Javascript

En este apartado encontrarás toda la información relacionada con el javascript de tu programa. Tanto las variables, funciones y eventos específicos del CCR.

CSS

Aquí encontrarás todo el CSS que heredará tu programa para hacer más fácil y se adapte mejor tu programa al estilo del CCR. Actualmente no existen temas pero en un futuro pueden existir y puedes los usuario preferirán que se adapte a su diseño deseado.

Funciones de Usuario

Con las siguientes funciones podrás recuperar los datos del usuario que está accediendo a tu programas. Existen las siguientes funciones:

  • Datos del usuario
  • Datos de la empresa
Datos del usuario "recuperarUsuario"

Con esta función puedes recuperar los datos del usuario:

ccr_funciones.usuario.recuperarUsuario()

Es una función síncrona que devolverá un json con los siguientes datos:

id - El id del usuario

nombre - El nombre del usuario

apellidos - Los apellidos del usuario

Ejemplos:
Datos de la empresa "recuperarEmpresa"

Si el usuario está accediendo a tu programa como parte de una empresa esta función devolverá los datos de la empresa. Si no es así, devolverá false.

ccr_funciones.usuario.recuperarEmpresa()

Es una función síncrona que devolverá un json con los siguientes datos:

id - El id de la empresa

nombre - El nombre de la empresa

Ejemplos:
Funciones Javascript

Las siguientes funciones son accesibles desde el javascript de los programas en el lado del cliente.

Existen varios tipos de funciones (seguridad, archivos, sistema...) los cuales enumeramos aquí y detallamos en sus secciones.

  • Seguridad
  • Archivos
  • Sistema

Todas las funciones son asíncronas y se devolverá la respuesta en un callback en una variable de la llamada a la función. Las funciones callback devolverán las siguientes variables y en este orden salvo especificado:

error - null si se ha podido resolver correctamente la llamada a la función. Un JSON en otro caso. El JSON en caso de error será de la siguiente forma:

{

codigo : numero, (Un número que representará el error producido. Cada función especifica el significado de sus códigos de error)

mensaje : frase (Una frase sencilla explicativa del error que se ha producido)

}

resultado - La respuesta de la función

Funciones de seguridad

Si tu programa necesita guardar y hacer uso de contraseñas en claro de los usuarios, deberás hacer uso de las siguientes funciones: ccr_funciones.seguridad.recuperarPassword y ccr_funciones.seguridad.guardarPassword.

En el CCR, buscamos proteger lo máximo posible a los usuarios. Para ello, cuenta con un sistema para almacenar de manera independiente y segura las contraseñas que necesiten guardar los programas.

Funcionamiento en detalle

Cuando un programa necesita guardar una contraseña, deberá llamar a la función ccr_funciones.seguridad.guardarPassword pasando al sistema la contraseña a guardar como variable. En ese momento, el sistema pedirá al usuario que introduzca su clave de acceso al CCR para cifrar la contraseña que el programa desea guardar, de esta manera, la contraseña nunca llegará a nuestros servidores en claro.

Esta llamada devolverá un código que representará la contraseña y será lo que almacene el programa en su base de datos. De esta manera, los usuarios estarán tranquilos sabiendo que ningún programa rebelde podrá hacer uso de sus contraseñas sin su consentimiento.

Cuando el programa necesite hacer uso de la contraseña, deberá llamar a la función ccr_funciones.seguridad.recuperarPassword pasando como variable el código de representación de la contraseña y se le solicitará que introduzca su clave de acceso para descifrarla.

*No se requerirá al usuario que introduzca su clave de acceso al CCR para cifrar o descifrar la contraseña si ya lo ha hecho en los últimos cinco minutos.

Guardar contraseña "guardarPassword"

Con esta función puedes solicitar al CCR que guarde una contraseña del usuario:

ccr_funciones.seguridad.guardarPassword( password , callback() )

Descripción de las variables:

password - La contraseña del usuario que el programa quiere guardar

callback ( error , codigo ) - La función guardarPassword devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El usuario ha rechazado escribir su clave de acceso al CCR para poder cifrar la contraseña.

codigo - Código que representará la contraseña y será lo que el programa deba guardar para poder recuperar la contraseña del usuario

Ejemplos:
Recuperar contraseña "recuperarPassword"

Esta función sirve para recuperar la contraseña en claro que hayas guardado anteriormente con "guardarPass". Así funciona:

ccr_funciones.seguridad.recuperarPassword( codigo , callback() )

Descripción de las variables:

codigo - Código que se le devolvió cuando llamó a la función guardarPassword

callback ( error , password ) - La función recuperarPassword devolverá la respuesta mediante este método. La descripción de sus variables son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El usuario ha rechazado escribir su clave de acceso al CCR para poder cifrar la contraseña.

3 - El usuario ha solicitado cambiar su clave de acceso al CCR mediante el método de 'no recuerdo la clave de acceso' y por tanto, no puede descifrar la contraseña. En este caso, todas las contraseñas que el programa tuviera guardadas, no podrán ser recuperadas.

4 - No existe contraseña para ese código

password - La contraseña del usuario

Ejemplos:
Actualizar contraseña "actualizarPassword"

Cambia la contraseña guardada anteriormente con "guardarPass". Así funciona:

ccr_funciones.seguridad.actualizarPassword( contraseña , codigo , callback() )

Descripción de las variables:

contraseña - Nueva contraseña en claro a guardar

codigo - Código que se le devolvió cuando llamó a la función guardarPassword inicialmente y se quiere modificar

callback ( error ) - La función actualizarPassword devolverá la respuesta mediante este método. La descripción de su variable es:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

2 - El usuario ha rechazado escribir su clave de acceso al CCR para poder cifrar la nueva contraseña.

3 - El usuario ha solicitado cambiar su clave de acceso al CCR mediante el método de 'no recuerdo la clave de acceso' y por tanto, no puede descifrar la contraseña. En este caso, todas las contraseñas que el programa tuviera guardadas, no podrán ser recuperadas.

4 - No existe contraseña para ese código

Ejemplos:
Recuperar contraseñas "eliminarPassword"

Esta función sirve para eliminar una contraseña guardada anteriormente con "guardarPass". Así funciona:

ccr_funciones.seguridad.eliminarPassword( codigo , callback() )

Descripción de las variables:

codigo - Código que se le devolvió cuando llamó a la función guardarPassword

callback ( error ) - La función recuperarPassword devolverá la respuesta mediante este método. La descripción de su variable son:

error - Sus códigos de eror son:

1 - Se ha producido un error genérico

4 - No existe contraseña para ese código

Ejemplos: