La propiedad $action del "Device Control" es utilizada para acceder a las características hardware o servicios en un teléfono móvil, tales como hacer una llamada, pero (como ya sabemos) dicha propiedad sólo estaba disponible cuando la aplicación es ejecutada en modo autónomo o "sin-conexión".
Sin embargo la última versión de Omnis Studio, nos permite utilizar el correo electrónico, las llamadas telefónicas y los mensajes SMS (Email, Call y SMS) a modo de una aplicación que fuese ejecutada sobre un navegador y no bajo el "wrapper" o aplicación instalada, es decir que será el navegador instalado por defecto en el dispositivo quien ejecute la acción correspondiente, en lugar de nuestra aplicación. Dichas acciones se corresponden con las siguientes constantes de la propiedad $action: kJSDeviceActionSendEmail, kJSDeviceActionMakeCall, y kJSDeviceActionSendSms. Naturalmente el resto de acciones ya conocidas deberán seguir siendo ejecutadas desde dentro del "wrapper".
Cuando es el navegador quien ejecuta la acción de enviar un SMS, se enviará un único mensaje y para el número especificado bajo la propiedad $communicationaddress del "Device Control", el texto del mensaje deberá figurar bajo la propiedad $communicationdata. Consulte el manual "Creating Web & Mobile Apps" para obtener más información sobre cómo utilizar "Device Control" en la construcción de aplicaciones para dispositivos móviles.
Por cierto, me estoy planteando la posibilidad de traducir al castellano el manual al que hacemos referencia en el párrafo anterior ;-)
Etiqueta
Home » Entradas. #AULAOMNIS
Mostrando entradas con la etiqueta #AULAOMNIS. Mostrar todas las entradas
Mostrando entradas con la etiqueta #AULAOMNIS. Mostrar todas las entradas
25 de febrero de 2016
3 de febrero de 2016
Paso de parámetros por URL a una "Remote Task" (Antes y después de la 6.1)
Desde la versión 6.1 Omnis puede capturar para nosotros los parámetros adicionales incluidos en la URL de llamada a la página web, donde indicamos la carga del "remote form". Éstos parámetros se hacen disponibles directamente desde la variable de parámetro "row" del método $construct, ya conocido por todos nosotros. Su funcionamiento es el siguiente:
Suponiendo la siguiente URL: http://127.0.0.1:5988/jschtml/rfSetCurField.htm?x=y&a=b
La tecnología jsClient agregará los parámetros indicados en una columna adicional de la variable parámetro "row" denominada "URLparams". Los datos de la "URLparams" se encuentran codificados en formato JSON, en nuestro ejemplo, x = y & a = b, la cadena JSON resultante sería: {"x": "y", "a": "b"}. Pero no nos preocupemos, pues podemos hacer uso de la nueva función "OJSON" para convertir esto a formato "row", del siguiente modo:
Do OJSON.$jsontolistorrow(pRow.URLparams) Returns lRow
...donde "lRow" es una variable "row", tendremos que lRow.x='y' y lRow.a='b'.
Pero... y antes de la versión 6.1, ¿Cómo podríamos capturar los parámetros de la URL? ¿Sería posible hacerlo con JavaScrip? Pues la respuesta es, si.
Tan sólo deberemos incluir en la sección "head" de nuestra página web, la siguiente función:
<script>
function gup( name ){
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp ( regexS );
var tmpURL = window.location.href;
var results = regex.exec( tmpURL );
if( results == null )
return"";
else
return results[1];
}
<script>
Con esta función podemos obtener cualquiera de los parámetros incluidos en la URL, simplemente pasándole en su llamada a al misma, el nombre del parámetro a obtener, por ejemplo:
<script>
var x=document.getElementById("omnisobject1");
x.dataset.param1=gup('x');
x.dataset.param2=gup('a’);
<script>
El ejemplo anterior, pasaría el valor 'y' a la columna "param1" y el valor 'b' a la columna "param2" de la variable parámetro "row", tan sólo deberemos tener en cuanta colocar éste ultimo script, detrás del div donde invocamos al "remote form".
NOTA: Si trabajamos con versiones de Onnis Studio anteriores a la 6, deberemos usar la notación x.attributes.param1.value=gup('x') en lugar de x.dataset.param1=gup('x').
Suponiendo la siguiente URL: http://127.0.0.1:5988/jschtml/rfSetCurField.htm?x=y&a=b
La tecnología jsClient agregará los parámetros indicados en una columna adicional de la variable parámetro "row" denominada "URLparams". Los datos de la "URLparams" se encuentran codificados en formato JSON, en nuestro ejemplo, x = y & a = b, la cadena JSON resultante sería: {"x": "y", "a": "b"}. Pero no nos preocupemos, pues podemos hacer uso de la nueva función "OJSON" para convertir esto a formato "row", del siguiente modo:
Do OJSON.$jsontolistorrow(pRow.URLparams) Returns lRow
...donde "lRow" es una variable "row", tendremos que lRow.x='y' y lRow.a='b'.
Pero... y antes de la versión 6.1, ¿Cómo podríamos capturar los parámetros de la URL? ¿Sería posible hacerlo con JavaScrip? Pues la respuesta es, si.
Tan sólo deberemos incluir en la sección "head" de nuestra página web, la siguiente función:
<script>
function gup( name ){
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp ( regexS );
var tmpURL = window.location.href;
var results = regex.exec( tmpURL );
if( results == null )
return"";
else
return results[1];
}
<script>
Con esta función podemos obtener cualquiera de los parámetros incluidos en la URL, simplemente pasándole en su llamada a al misma, el nombre del parámetro a obtener, por ejemplo:
<script>
var x=document.getElementById("omnisobject1");
x.dataset.param1=gup('x');
x.dataset.param2=gup('a’);
<script>
El ejemplo anterior, pasaría el valor 'y' a la columna "param1" y el valor 'b' a la columna "param2" de la variable parámetro "row", tan sólo deberemos tener en cuanta colocar éste ultimo script, detrás del div donde invocamos al "remote form".
NOTA: Si trabajamos con versiones de Onnis Studio anteriores a la 6, deberemos usar la notación x.attributes.param1.value=gup('x') en lugar de x.dataset.param1=gup('x').
27 de enero de 2016
Uso de las funciones strpbrk() y strspn()
Encuentro especialmente útil su uso para comprobar si los valores almacenados en una variable cumplen con un determinado patrón.
Devuelve una subcadena de cadena1, desde el punto en que cualquiera de los caracteres de cadena2 sea localizado en cadena1. Si ninguno de los caracteres de cadena2 coincide con los de cadena1, la función nos devolverá una cadena vacía.
Veamos un ejemplo:
Supongamos que disponemos de un campo de entrada en el que sólo deseamos permitir el uso de letras no acentuadas, números y comas, es decir sin caracteres especiales. Un modo de impedirlo sería mediante el método siguiente:
On evKey
If len(strpbrk(upp(pKey),'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,'))=0&len(pKey)>0
Quit event handler (Discard event)
End If
Si pKey contiene (por ejemplo) el caracter #, la función strpbrk() anterior devolvería una cadena vacía, ya que el caracter # no está contenido la cadena: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,
El uso de "Quit event handler (Discard event)" anulará la introducción del caracter #. La comparación "len(pKey)>0" se ha añadido para evitar el uso de "SystemKey events" o dicho de otro modo, la generación de eventos del sistema mediante el teclado.
Devuelve el índice del primer carácter de cadena1, no coincidente con los contenidos en cadena2. Si todos los caracteres son coincidentes, la función devolverá el valor correspondiente al "len(cadena1)+1", es decir la longitud de cadena1 más uno.
Si (por ejemplo) quisiéramos comprobar que todos los caracteres contenidos en una determinada cadena coincidan con los permitidos, podríamos usar lo siguiente:
If strspn(upp(NumeroDeTelefono),'0123456789() -/')>len(NumeroDeTelefono)
; Todos los caracteres de variable NumeroDeTelefono
; pertenecen o están contenidos en el grupo 0123456789() -/
End If
Suponiendo que NumeroDeTelefono="01\5551234", la función strspn() anterior devolvería '3', ya que el tercer carácter no está entre el grupo de los permitidos, pero si su valor fuera NumeroDeTelefono="01/5551234" la función strspn() devolvería '11', ya que su longitud es '10'.
El formato de la primera función es strpbrk(cadena1,cadena2), ¿Qué hace?
Devuelve una subcadena de cadena1, desde el punto en que cualquiera de los caracteres de cadena2 sea localizado en cadena1. Si ninguno de los caracteres de cadena2 coincide con los de cadena1, la función nos devolverá una cadena vacía.
Veamos un ejemplo:
Supongamos que disponemos de un campo de entrada en el que sólo deseamos permitir el uso de letras no acentuadas, números y comas, es decir sin caracteres especiales. Un modo de impedirlo sería mediante el método siguiente:
On evKey
If len(strpbrk(upp(pKey),'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,'))=0&len(pKey)>0
Quit event handler (Discard event)
End If
Si pKey contiene (por ejemplo) el caracter #, la función strpbrk() anterior devolvería una cadena vacía, ya que el caracter # no está contenido la cadena: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,
El uso de "Quit event handler (Discard event)" anulará la introducción del caracter #. La comparación "len(pKey)>0" se ha añadido para evitar el uso de "SystemKey events" o dicho de otro modo, la generación de eventos del sistema mediante el teclado.
El formato de la segunda es strspn(cadena1,cadena2), ¿Qué hace?
Devuelve el índice del primer carácter de cadena1, no coincidente con los contenidos en cadena2. Si todos los caracteres son coincidentes, la función devolverá el valor correspondiente al "len(cadena1)+1", es decir la longitud de cadena1 más uno.
Si (por ejemplo) quisiéramos comprobar que todos los caracteres contenidos en una determinada cadena coincidan con los permitidos, podríamos usar lo siguiente:
If strspn(upp(NumeroDeTelefono),'0123456789() -/')>len(NumeroDeTelefono)
; Todos los caracteres de variable NumeroDeTelefono
; pertenecen o están contenidos en el grupo 0123456789() -/
End If
Suponiendo que NumeroDeTelefono="01\5551234", la función strspn() anterior devolvería '3', ya que el tercer carácter no está entre el grupo de los permitidos, pero si su valor fuera NumeroDeTelefono="01/5551234" la función strspn() devolvería '11', ya que su longitud es '10'.
20 de enero de 2016
Como abrir documentos en Mac OS y en Windows, desde Omnis.
Abrir documentos en Mac OS.
Calculate applescript as con('property target_URL : "', lvpath,'"',kCr,'open location target_URL')
Do method $doApplescript (applescript,results) Returns #F
Si lvpath es 'file://pathtofile') --≥ abre un archivo
Si lvpath es 'http://www.myurl.org/path.html' --≥ abre el navegador
Si lvpath es 'mailto:name@email.com' --≥ abre el cliente e-mail
Si lvpath es 'feed:rssfeed path' --≥ abre el lector de rss
Abrir documentos en Windows.
Calculate lvPath as 'C:\Users\Tom\Downloads\demo\demo.html'
Register DLL ("SHELL32.DLL","ShellExecuteW","JJCCCCJ")
Call DLL ("SHELL32.DLL","ShellExecuteW",0,"open",lvPath,"","",0) Returns lvHandle
13 de enero de 2016
Tabla de componentes externos
Bajo el directorio "xcomp" del raíz de instalación Omnis, podemos observar una larga lista de al menos 120 componentes, pero... ¿Donde pueden usarse y con qué propósito?
A continuación os dejo una tabla que he confeccionado, donde indico, donde puede ser usado un determinado componente y cual es su propósito, para conocer detalles específicos sobre su uso les recomiendo que utilicen el "Interface Manager".
NOMBRE | NO-VISUALES | VENTANAS | INFORMES | WEB | IOS | USO |
Accordion Library | X | Presenta una lista de opciones hipervínculo, que se expandne para mostrar más información. | ||||
AMAZONDAM | X | Acceso base de datos AMAZON. | ||||
BlowFish Library | X | Permite cifrar y descifrar contraseñas. | ||||
Calendar Library | X | X | Presenta el mes en curso y la fecha de actual, en un formato de calendario estándar. | |||
Clock Library | X | Permite visualizar la hora actual, teniendo en cuenta la zona horaria actual del cliente. | ||||
Cool DropList Library | X | Permite listas desplegable de iconos, estilos de líneas, y otros. | ||||
Document Viewer Library | X | X | Visor de documentos Omnis | |||
FadePict Library | X | Permite aplicar un efecto de fundido a una imagen mientras se carga, dispone de más de 30 estilos diferentes. | ||||
FileList Library | X | Pueden mostrar el contenido de una carpeta, ya sea en un formato de lista estándar o como una lista desplegable | ||||
FileOps | X | Permite gestionar archivos. | ||||
FishEye Library | X | Muestra una fila o columna con iconos clicables. | ||||
Flic Library | X | Permite cargar y presentar archivos de películas de tipo “flc” y "fli”. | ||||
FontOps | X | Permite gestionar fuentes. | ||||
FORMROLL Library | X | Botón gráfico, que se pone de relieve cuando el usuario pasa el ratón sobre él. | ||||
Gif Library | X | X | Utilizado para guardar y mostrar archivos “GIF” animados o estáticos. | |||
Graph2 Library | X | X | X | Programación de gráficas. | ||
Help utilities | X | Gestión de textos y documentos de ayuda. | ||||
HOTPICT Library | X | Permite crear áreas "clicables" sobre fotos, mapas e ilustraciones. | ||||
HTML Device | X | Permite visualizar documentos HTML. | ||||
HYPLINKS Library | X | Permite crear hipervínculos al estilo de la web. | ||||
iActivity | X | Componente para iOS | ||||
iButton | X | Componente para iOS | ||||
IconArray Library | X | Permite mostrar listas de elementos, identificados mediante iconos. | ||||
iDateTime | X | Componente para iOS | ||||
iImageView | X | Componente para iOS | ||||
iLabel | X | Componente para iOS | ||||
iMap | X | Componente para iOS | ||||
iNavigationbar | X | Componente para iOS | ||||
iPage | X | Componente para iOS | ||||
iProgress | X | Componente para iOS | ||||
iSearchBar | X | Componente para iOS | ||||
iSegmented | X | Componente para iOS | ||||
iSlider | X | Componente para iOS | ||||
iSwitch | X | Componente para iOS | ||||
iTabbar | X | Componente para iOS | ||||
iTable | X | Componente para iOS | ||||
iTextField | X | Componente para iOS | ||||
iTextView | X | Componente para iOS | ||||
iWebView | X | Componente para iOS | ||||
JavaCore | X | Motor java de Omnis | ||||
JavaObjs Library | X | Objetos Java | ||||
JDBCDAM | X | Acceso base de datos mediante JDBC. | ||||
JPEG Library | X | X | Permite guardar y mostrar gráficos en formato JPEG. | |||
jsActivity | X | Componente JavaScript. | ||||
jsBack | X | Componente JavaScript. | ||||
jsButton | X | Componente JavaScript. | ||||
jsCheckbox | X | Componente JavaScript. | ||||
jschrt1 | X | Componente JavaScript. | ||||
jschrt2 | X | Componente JavaScript. | ||||
jsComboBox | X | Componente JavaScript. | ||||
jsDatePicker | X | Componente JavaScript. | ||||
jsDevice | X | Componente JavaScript. | ||||
jsDgrd | X | Componente JavaScript. | ||||
jsDropList | X | Componente JavaScript. | ||||
jsEdit | X | Componente JavaScript. | ||||
jsFile | X | Componente JavaScript. | ||||
jsHtml | X | Componente JavaScript. | ||||
jsHypl | X | Componente JavaScript. | ||||
jsLabel | X | Componente JavaScript. | ||||
jsList | X | Componente JavaScript. | ||||
jsmap | X | Componente JavaScript. | ||||
jsNativeList | X | Componente JavaScript. | ||||
jsNativeSlider | X | Componente JavaScript. | ||||
jsNativeSwitch | X | Componente JavaScript. | ||||
jsNavbar | X | Componente JavaScript. | ||||
jsNavMenu | X | Componente JavaScript. | ||||
jsPage | X | Componente JavaScript. | ||||
jsPict | X | Componente JavaScript. | ||||
jsPopm | X | Componente JavaScript. | ||||
jsProg | X | Componente JavaScript. | ||||
jsRadioGroup | X | Componente JavaScript. | ||||
jsRich | X | Componente JavaScript. | ||||
jsSlider | X | Componente JavaScript. | ||||
jsSwitch | X | Componente JavaScript. | ||||
jsTabs | X | Componente JavaScript. | ||||
jsTimer | X | Componente JavaScript. | ||||
jsTrans | X | Componente JavaScript. | ||||
jsTree | X | Componente JavaScript. | ||||
jsVideo | X | Componente JavaScript. | ||||
Marquee Library | X | Permite la visualización en desplazamiento continuo áreas de texto. | ||||
MYSQLDAM | X | Acceso base de datos MYSQL. | ||||
Navigation Menu Library | X | Permite crear menús en cascada interactivos. | ||||
NPAPI Library | X | Componenete NPAPI | ||||
ODBCDAM | X | Acceso base de datos mediante ODBC. | ||||
OJSON | X | Gestión de documentos JSON | ||||
Omnis PDF Device | X | Gestión de documentos PDF | ||||
OmnisIcn Library | X | Permite mostrar cualquier icono de los existentes en “OmnisPIC”, “USERPIC”, o “#ICONS”. | ||||
OMSQLDAM | X | Acceso base de datos df1 mediante SQL. | ||||
ORACLE8DAM | X | Acceso base de datos ORACLE. | ||||
OWEB | X | Implemetación del protocolo HTML | ||||
OXML | X | Gestión de documentos XML | ||||
PCX Library | X | X | Permite visualizar imágenes PCX. | |||
PGSQLDAM | X | Acceso base de datos POSTGRE. | ||||
PicList Library | X | Permite mostrar cualquier icono de los existentes en “OmnisPIC”, “USERPIC”, o “#ICONS”. | ||||
PortProfile | X | Configuración de puertos de comunicación. | ||||
Progress Library | X | Permite visualizar una barra de progreso | ||||
QuickTime3 Library | X | Gestión de documentos Quick Time. | ||||
RegAdmin | X | Permite el acceso al registro del sistema. | ||||
Report Lists Library | X | Muestra una variable de tipo "list" en un informe. | ||||
Report Object Library | X | Permite incrustar clases "report" en ventanas. | ||||
RTF Device | X | Permite mostrar archivos RTF. | ||||
Sidebar Library | X | Permite visualizar una serie de iconos o botones en una barra vertical. | ||||
Slider Library | X | Proporciona un deslizador gráfico graduado, que el usuario podrá modificar. | ||||
SpreadSheet Grid Library | X | Funciona como una hoja de cálculo de sólo lectura, con los datos contenidos en una variable de tipo "list". | ||||
SQLITEDAM | X | Acceso base de datos SQLITE. | ||||
Stix Library | X | Control Stix | ||||
StringTable | X | X | X | Permite la localización de etiquetas en diferentes idiomas. | ||
SYBASEDAM | X | Acceso base de datos SYBASE. | ||||
TabBar Library | X | Presenta una serie de “thumb tabs” o pestañas, sobre las que el usuario podrá hacer clic. | ||||
Tile Library | X | Permite mostrar un icono que se propagará, sobre toda la zona. | ||||
Timer Library | X | X | Proporciona un temporizador de segundos o milisegundos. | |||
ToolPal Library | X | Control tool pal | ||||
Tooltip Library | X | Control de tool tip's | ||||
TransButton Library | X | Implementa un “rollover” de tipo botón. | ||||
Transform Library | X | Permite efectos de animación y transformación. | ||||
Tree Library | X | Proporciona una forma gráfica de mostrar elementos u opciones dispuestos en forma de árbol. | ||||
Wash Library | X | Permite añadir un efecto de degradado de color, sobre toda la zona. | ||||
WAV Library | X | X | Permite cargar y reproducir archivos de sonido en formato “WAV”. | |||
WBMP Library | X | Permite cargar y reproducir archivos de imagen en formato “WBMP”. | ||||
Zoom Library | X | Permite ampliar áreas de la pantalla. |
6 de enero de 2016
Creación dinámica de formularios Web
Éste artículo es una traducción del proporcionado por Kris Geerts (desarrollador Omnis www.it8-projects.com) de los Países Bajos, la librería ejemplo mencionada (LOGIN.zip), puede ser descargada desde Aula Omnis.
Como ya sabemos el formulario web JavaScript que genera automáticamente Omnis para llamar a nuestros “remote form”, pueden integrarse fácilmente en cualquier sitio web ya existente. Pero me parecen interesantes los apuntes que hace Kris en su artículo sobre la integración de Omnis Web con un sitio Web ya construido, por esa razón me he permitido la licencia de tomar sus notas y publicar éste artículo.
Lo que Kris propone, es un modelo para la integración en un sitio web ya existente, con nuestros “remote forms” jsClient de forma dinámica. El escenario propuesto también podría resultar útil cuando se desea tener diferentes librerías (diferentes versiones) que a su vez conectan con diferentes bases de datos atendidas desde un solo proceso Omnis/MySQL (escenario habitual para los desarrollos en la “nube”). Como resultado de esto, podríamos llegar a tener librerías casi idénticas, con incluso nombres iguales para sus “remote forms”, bajo tales circunstancias podría resultar muy difícil su mantenimiento. De hay la propuesta de creación dinámica de “remote forms”, aunque seguramente podrían encontrarse otras razones para justificar el enfoque propuesto por Kris.
En primer lugar deberemos asegurarnos de que nuestra solución Web funcione correctamente. Podemos realizar pruebas con la página HTML que Omnis genera automáticamente desde nuestro “remote form”, con la versión Omnis de desarrollo (127.0.0.1/jshtml/≤nombredelremoteform≥.htm). Sin embargo, cuando tengamos que portar la solución a un servidor web real, deberemos asegurarnos de contar con todos los archivos necesarios, páginas HTML en el directorio correcto y de que todo este funcionando correctamente. Para IIS (Windows), deberemos disponer de los siguientes directorios y archivos:
Inetpub (normalmente en c:\inetpub)
Como ya sabemos el formulario web JavaScript que genera automáticamente Omnis para llamar a nuestros “remote form”, pueden integrarse fácilmente en cualquier sitio web ya existente. Pero me parecen interesantes los apuntes que hace Kris en su artículo sobre la integración de Omnis Web con un sitio Web ya construido, por esa razón me he permitido la licencia de tomar sus notas y publicar éste artículo.
Lo que Kris propone, es un modelo para la integración en un sitio web ya existente, con nuestros “remote forms” jsClient de forma dinámica. El escenario propuesto también podría resultar útil cuando se desea tener diferentes librerías (diferentes versiones) que a su vez conectan con diferentes bases de datos atendidas desde un solo proceso Omnis/MySQL (escenario habitual para los desarrollos en la “nube”). Como resultado de esto, podríamos llegar a tener librerías casi idénticas, con incluso nombres iguales para sus “remote forms”, bajo tales circunstancias podría resultar muy difícil su mantenimiento. De hay la propuesta de creación dinámica de “remote forms”, aunque seguramente podrían encontrarse otras razones para justificar el enfoque propuesto por Kris.
En primer lugar deberemos asegurarnos de que nuestra solución Web funcione correctamente. Podemos realizar pruebas con la página HTML que Omnis genera automáticamente desde nuestro “remote form”, con la versión Omnis de desarrollo (127.0.0.1/jshtml/≤nombredelremoteform≥.htm). Sin embargo, cuando tengamos que portar la solución a un servidor web real, deberemos asegurarnos de contar con todos los archivos necesarios, páginas HTML en el directorio correcto y de que todo este funcionando correctamente. Para IIS (Windows), deberemos disponer de los siguientes directorios y archivos:
Inetpub (normalmente en c:\inetpub)
Cgi-bin
omnisapi.dll
nph-omniscgi.exe
……
omnisapi.dll
nph-omniscgi.exe
……
Scripts
nph-omniscgi.exe
nph-owscgi.exe
wwwroot
nph-omniscgi.exe
nph-owscgi.exe
wwwroot
scripts
omjqclnt.js
pie.htc
…
Css
Omn_menu.css
…
Smoothness
Jquery -ui-…
Images
Header-columns-bg.gif
omjqclnt.js
pie.htc
…
Css
Omn_menu.css
…
Smoothness
Jquery -ui-…
Images
Header-columns-bg.gif
Para portar la solución al servidor Web, tendremos que copiar el contenido de la carpeta de “HTML” desde el directorio raíz de instalación de la versión Omnis para desarrollo, al raíz del servidor web. También debemos comprobar que estemos utilizando las últimas versiones del omnisapi.dll (o nphomniscgi.exe) y de los scripts. Una vez que el servidor esté funcionando correctamente, estaremos dispuestos para el paso siguiente.
Ahora vamos a realizar pruebas con la librería de demostración (LOGIN.lbs) que seguramente ya ha descargado desde Aula Omnis, ábrala con el Omnis Runtime Server. Pegue la siguiente URL en un navegador, sustituyendo los valores indicados entre ≤≥ por la dirección IP y número de puerto correctos:
http://≤IPServidorWeb≥/cgi-bin/omnisapi.dll?OmnisClass=rtDir&OmnisLibrary=LOGIN&OmnisServer=≤IPServidorOmnis≥:≤PuertoOmnis≥¶m1=CompanyName
Ahora vamos a realizar pruebas con la librería de demostración (LOGIN.lbs) que seguramente ya ha descargado desde Aula Omnis, ábrala con el Omnis Runtime Server. Pegue la siguiente URL en un navegador, sustituyendo los valores indicados entre ≤≥ por la dirección IP y número de puerto correctos:
http://≤IPServidorWeb≥/cgi-bin/omnisapi.dll?OmnisClass=rtDir&OmnisLibrary=LOGIN&OmnisServer=≤IPServidorOmnis≥:≤PuertoOmnis≥¶m1=CompanyName
Nota: En la demo proporcionada por Kris, se hace uso de un solo parámetro, pero, por supuesto, nada impide añadir otros parámetros (param2 = loquequiera, etc.). El modelo generado automáticamente puede hacer uso de hasta cuatro parámetros, pero pueden añadires más. Si se desea utilizar un formulario HTML aún más simple para acceder a la pantalla de inicio de sesión, consulte la entrada “statical-Submitexample” que encontrará en la “Remote Task” de nombre “rtDir” de la librería. Esto proporciona un inicio de sesión más cómodo para el usuario.
Cuando introduzca la URL anterior, la clase “Remote Task” “rtDir” generará automáticamente una página HTML con el Omnis JavaScript (observe el método “$CreateDynam” de la “Remote Task” “rtDir”). De éste modo tendremos la ventaja de poder abrir otra librería, incluso estando ubicada en otro servidor, o cualquier otro formulario Web donde incluir lo que necesitamos para que funcione. La librería demo proporcionada se llama de nuevo a la misma librería mediante el formulario “rlogin”, por lo que (si queremos hacer un uso práctico de la solución propuesta) tendríamos que cambiar éste comportamiento.
Como podrá observar en la librería ejemplo, se han codificado las rutas hacia las carpetas css y otros directorios, la ruta hacia la página HTML generada por la “Remote Task” es relativa al directorio “cgi-bin” y no al “wwwroot”. Esto significa que en lugar de “http://servidor/≤fichero≥.htm” la ruta URL siguiente será: “http://servidor/cgi-bin/≤fichero≥.htm”
Tenga en cuenta que se usan rutas pre-codificadas para las carpetas css y otras, usadas en la creación de la página HTML dinámica, con sus propios parámetros ya rellenados, listo para que el usuario haga simplemente clic en “login'”.
Cuando introduzca la URL anterior, la clase “Remote Task” “rtDir” generará automáticamente una página HTML con el Omnis JavaScript (observe el método “$CreateDynam” de la “Remote Task” “rtDir”). De éste modo tendremos la ventaja de poder abrir otra librería, incluso estando ubicada en otro servidor, o cualquier otro formulario Web donde incluir lo que necesitamos para que funcione. La librería demo proporcionada se llama de nuevo a la misma librería mediante el formulario “rlogin”, por lo que (si queremos hacer un uso práctico de la solución propuesta) tendríamos que cambiar éste comportamiento.
Como podrá observar en la librería ejemplo, se han codificado las rutas hacia las carpetas css y otros directorios, la ruta hacia la página HTML generada por la “Remote Task” es relativa al directorio “cgi-bin” y no al “wwwroot”. Esto significa que en lugar de “http://servidor/≤fichero≥.htm” la ruta URL siguiente será: “http://servidor/cgi-bin/≤fichero≥.htm”
Tenga en cuenta que se usan rutas pre-codificadas para las carpetas css y otras, usadas en la creación de la página HTML dinámica, con sus propios parámetros ya rellenados, listo para que el usuario haga simplemente clic en “login'”.
30 de diciembre de 2015
Uso del cliente JavaScript (jsClient) con PHP
Toda la documentación, ficheros referenciados y la librería de ejemplo indicados en éste artículo, podrá descargarse desde la web de Aula Omnis, archivo denominado “DynamicWebPages.zip”. Una página HTML de jsClient típica, contiene algo como lo siguiente:
≤html≥
≤head≥
≤title≥Studio 5.2 Test≤/title≥
≤meta http-equiv="Content-Type" content="text/html; charset=utf-8"≥
≤!-- This makes mobile device support work --≥
≤meta name="viewport" content="width=device-width"≥
≤!-- The style sheets must be present in the directory /css/ --≥
≤link type="text/css" href="/css/omn_dlg.css" rel="stylesheet" media="print,screen" /≥
≤link type="text/css" href="/css/omn_menu.css" rel="stylesheet" media="print, screen" /≥
≤link type="text/css" href="/css/smoothness/jquery-ui-1.8.15.custom.css" rel="stylesheet" /≥
≤link type="text/css" href="/css/slick.grid.css" rel="stylesheet" /≥
≤link type="text/css" href="/css/slick.columnpicker.css" rel="stylesheet"/≥
≤link type="text/css" href="/css/slick.pager.css" rel="stylesheet" /≥
≤!-- Must occur after other stylesheets e.g. jquery-ui 1.8.15.custom.css, as it overrides values --≥
≤link type="text/css" href="/css/omnis.css" rel="stylesheet"/≥
≤!-- Omnis Studio JavaScript client scripts, must be present in the directory /scripts/ --≥
≤script type="text/javascript" src="/scripts/omjsclnt.js"≥≤/script≥
≤script type="text/javascript" src="/scripts/omjqclnt.js"≥≤/script≥
≤/head≥
≤body onload="jOmnis.onLoad()" onunload="jOmnis.onUnload()" style="margin:0;"≥
≤h1≥Test JavaScript Client Studio 5.2≤/h1≥
≤div id="omnisobject1" WebServerUrl="http://192.168.0.4/omnis_apache" OmnisServerAndPort="192.168.0.8:5914" OmnisLibrary="ScriptClient52_Test" OmnisClass="rfTest" param1="A1" param2="B1" param3="C1" param4="D1"≥≤/div≥
≤/body≥
≤/html≥
Si queremos hacer lo mismo desde PHP, modificaríamos la página para obtener algo como lo indicado a continuación. Para el ejemplo localizado en Aula Omnis, se hace uso de un fichero de configuración denominado “webclient.ini”, para componer la pagina “webclient.php”
≤html≥
≤head≥
≤title≥Studio 5.2 Test≤/title≥
≤meta http-equiv="Content-Type" content="text/html; charset=utf-8"≥
≤?php
$phplib = dirname(__FILE ) . '/../phpsub'
set_include_path(get_include_path() . PATH_SEPARATOR . $phplib); require_once('OmnisWebClass.php');
$x = new OmnisWebClass('ScriptClient52_Test.ini', 'rfTest');
$params = array ("A1", "B1", "C1", "D1");
$x->set_additional_params($params);
$x->display_header_body_omnis_js('/css','/scripts','margin:0;');
?≥
≤h1≥Test JavaScript Client Studio 5.2≤/h1≥
≤?php
$x->display_client_omnis_js();
?≥
≤/body≥
≤/html≥
Por supuesto existen muchas otras opciones y parámetros que pueden usarse a la hora de crear el modelo PHP, el ejemplo que hallará en Aula Omnis “OmnisWebClass.php” constituye una buena muestra de ello.
Cómo ya hemos mencionado, para nuestro ejemplo hacemos uso del fichero de configuración denominado “webclient.ini”, así, si (por ejemplo) queremos modificar el ancho “width” del “remote form”, sólo tendremos que cambiar el parámetro adecuado en éste archivo. Permitiendo además su correcta construcción dependiendo del navegador en uso: Internet Explorer, Netscape, Firefox, etc.
Del mismo modo, cuando sea el caso que estemos realizando pruebas con la versión Omnis para desarrollo, en las que se suele usar nuestro mismo PC. Podemos comentar la línea “OmnisServer = XXX”, ya que si no se encuentra en el archivo “.ini”, una dirección IP, PHP usará la dirección del cliente
Los parámetros “OmnisXXX “del archivo “.ini”, tales como el nombre de la librería o el de la clase remota, son ajustados después de los parámetros “cgi”. Por lo tanto, si se introduce la URL:
http://192.168.0.2/test/webclient.php?lib=TEST&class=rfTest_2&width=200
El servidor PHP compondrá una página web con éstos parámetros Omnis, de modo que el “remote form” “rfTest2” sea mostrado con una anchura de 200 píxeles. Todos los parámetros no presentes en la URL serán tomados del archivo “.ini”. Todo esto podrá encontrarlo perfectamente documentado dentro del propio archivo “OmnisWebClass.php”.
Al analizarse la petición HTTP, PHP puede recuperar otros parámetros de la cabecera HTTP, como (por ejemplo) el navegador que está usando el cliente. Esto también podría pasarse como parámetro adicional al “remote form” Omnis. Para ello sería necesario añadir a la página HTML el siguiente código:
; para Internet-Explorer
≤paramname = "Param1" value="myParameter = myValue"≥
; para Netscape y otros
Param1 = "myParameter=myValue"
Para incluir el uso de parámetros en el caso de la clase “OmnisWebClass.php”. Después de crearse la instancias del objeto PHP, e inmediatamente antes de la línea “$x-≥display_plugin()”; será necesario crear una matriz y llenarla con la información que se pasará a la instancia:
$params = array ();
$params['myParam'] = 'myValue';
$params['Browser']=
$_SERVER['HTTP_USER_AGENT'];
// insert here further parameters, see below
$X-≥set_additional_params($params);
Si el acceso a la página web está protegido con “htaccess”, podremos incluso obtener el nombre de usuario y su contraseña, para pasársela como parámetros a Omnis. El código PHP necesario es el siguiente:
if (isset($_SERVER['REMOTE_USER']))
$params['User1'] = $_SERVER['REMOTE_USER'];
if (isset($_SERVER['PHP_AUTH_USER']))
$params['User2'] = $_SERVER['PHP_AUTH_USER'];
if (isset($_SERVER['PHP_AUTH_PW']))
$params['Password'] = $_SERVER['PHP_AUTH_PW'];
Pero debemos tener en cuenta que, (para que esto funcione) el servidor PHP, deberá permitir ciertas restricciones de seguridad, consulte las “safe mode restrictions”.
Un “Omnis App Server” suele ser muy estable, pero aún así es necesario hacer algo de mantenimiento de vez en cuando. De modo que puede ser inevitable que debido a que el servidor esté en modo “off-line” y le llegue una solicitud de “remote form” desde un navegador, el navegador se congela durante varios minutos, terminando por ofrecer como respuesta "'Error reading the response from the WEB server”.
Pero ésto se puede ser evitado fácilmente, mediante el uso de la clase “OmnisWebClass.php” y añadiendo algunas enmiendas a la librería Omnis. En este caso, el “Omnis App Server” deberá poseer permisos de escritura sobre el sistema de archivos del servidor web. Además, deberán rebajarse algunas de las normas de seguridad impuestas en PHP. De éste modo, el “Omnis App Server” podría, (inmediatamente después de abrir la librería) crear un archivo, (por ejemplo, con el nombre “Semaphore_WEBCLIENT.txt”) bajo el mismo directorio donde se encuentra “webclient.php”, el cual sería eliminado tras cerrarse la librería.
La idea es, que la instancia de “OmnisWebClass.php” pueda comprobar la existencia o no, de este archivo. Si no existe, en lugar de mostrarse el código de error, mostrar algo como “≤h3≥Omnis App. Server, cumple tareas de mantenimiento≤/h3≥”. El texto exacto es configurable. Para implementar este comportamiento, tan sólo sería necesario ñadir una línea más al archivo “webclient.php” informando a la instancia sobre el nombre del archivo a crear, del modo siguiente:
$x-≥set_semaphore('Semaphore_WEBCLIENT.txt');
≤html≥
≤head≥
≤title≥Studio 5.2 Test≤/title≥
≤meta http-equiv="Content-Type" content="text/html; charset=utf-8"≥
≤!-- This makes mobile device support work --≥
≤meta name="viewport" content="width=device-width"≥
≤!-- The style sheets must be present in the directory /css/ --≥
≤link type="text/css" href="/css/omn_dlg.css" rel="stylesheet" media="print,screen" /≥
≤link type="text/css" href="/css/omn_menu.css" rel="stylesheet" media="print, screen" /≥
≤link type="text/css" href="/css/smoothness/jquery-ui-1.8.15.custom.css" rel="stylesheet" /≥
≤link type="text/css" href="/css/slick.grid.css" rel="stylesheet" /≥
≤link type="text/css" href="/css/slick.columnpicker.css" rel="stylesheet"/≥
≤link type="text/css" href="/css/slick.pager.css" rel="stylesheet" /≥
≤!-- Must occur after other stylesheets e.g. jquery-ui 1.8.15.custom.css, as it overrides values --≥
≤link type="text/css" href="/css/omnis.css" rel="stylesheet"/≥
≤!-- Omnis Studio JavaScript client scripts, must be present in the directory /scripts/ --≥
≤script type="text/javascript" src="/scripts/omjsclnt.js"≥≤/script≥
≤script type="text/javascript" src="/scripts/omjqclnt.js"≥≤/script≥
≤/head≥
≤body onload="jOmnis.onLoad()" onunload="jOmnis.onUnload()" style="margin:0;"≥
≤h1≥Test JavaScript Client Studio 5.2≤/h1≥
≤div id="omnisobject1" WebServerUrl="http://192.168.0.4/omnis_apache" OmnisServerAndPort="192.168.0.8:5914" OmnisLibrary="ScriptClient52_Test" OmnisClass="rfTest" param1="A1" param2="B1" param3="C1" param4="D1"≥≤/div≥
≤/body≥
≤/html≥
Si queremos hacer lo mismo desde PHP, modificaríamos la página para obtener algo como lo indicado a continuación. Para el ejemplo localizado en Aula Omnis, se hace uso de un fichero de configuración denominado “webclient.ini”, para componer la pagina “webclient.php”
≤html≥
≤head≥
≤title≥Studio 5.2 Test≤/title≥
≤meta http-equiv="Content-Type" content="text/html; charset=utf-8"≥
≤?php
$phplib = dirname(__FILE ) . '/../phpsub'
set_include_path(get_include_path() . PATH_SEPARATOR . $phplib); require_once('OmnisWebClass.php');
$x = new OmnisWebClass('ScriptClient52_Test.ini', 'rfTest');
$params = array ("A1", "B1", "C1", "D1");
$x->set_additional_params($params);
$x->display_header_body_omnis_js('/css','/scripts','margin:0;');
?≥
≤h1≥Test JavaScript Client Studio 5.2≤/h1≥
≤?php
$x->display_client_omnis_js();
?≥
≤/body≥
≤/html≥
Por supuesto existen muchas otras opciones y parámetros que pueden usarse a la hora de crear el modelo PHP, el ejemplo que hallará en Aula Omnis “OmnisWebClass.php” constituye una buena muestra de ello.
Una reconfiguración mas cómoda
Cómo ya hemos mencionado, para nuestro ejemplo hacemos uso del fichero de configuración denominado “webclient.ini”, así, si (por ejemplo) queremos modificar el ancho “width” del “remote form”, sólo tendremos que cambiar el parámetro adecuado en éste archivo. Permitiendo además su correcta construcción dependiendo del navegador en uso: Internet Explorer, Netscape, Firefox, etc.
Del mismo modo, cuando sea el caso que estemos realizando pruebas con la versión Omnis para desarrollo, en las que se suele usar nuestro mismo PC. Podemos comentar la línea “OmnisServer = XXX”, ya que si no se encuentra en el archivo “.ini”, una dirección IP, PHP usará la dirección del cliente
Los parámetros “OmnisXXX “del archivo “.ini”, tales como el nombre de la librería o el de la clase remota, son ajustados después de los parámetros “cgi”. Por lo tanto, si se introduce la URL:
http://192.168.0.2/test/webclient.php?lib=TEST&class=rfTest_2&width=200
El servidor PHP compondrá una página web con éstos parámetros Omnis, de modo que el “remote form” “rfTest2” sea mostrado con una anchura de 200 píxeles. Todos los parámetros no presentes en la URL serán tomados del archivo “.ini”. Todo esto podrá encontrarlo perfectamente documentado dentro del propio archivo “OmnisWebClass.php”.
Parámetros HTTP
Al analizarse la petición HTTP, PHP puede recuperar otros parámetros de la cabecera HTTP, como (por ejemplo) el navegador que está usando el cliente. Esto también podría pasarse como parámetro adicional al “remote form” Omnis. Para ello sería necesario añadir a la página HTML el siguiente código:
; para Internet-Explorer
≤paramname = "Param1" value="myParameter = myValue"≥
; para Netscape y otros
Param1 = "myParameter=myValue"
Para incluir el uso de parámetros en el caso de la clase “OmnisWebClass.php”. Después de crearse la instancias del objeto PHP, e inmediatamente antes de la línea “$x-≥display_plugin()”; será necesario crear una matriz y llenarla con la información que se pasará a la instancia:
$params = array ();
$params['myParam'] = 'myValue';
$params['Browser']=
$_SERVER['HTTP_USER_AGENT'];
// insert here further parameters, see below
$X-≥set_additional_params($params);
Si el acceso a la página web está protegido con “htaccess”, podremos incluso obtener el nombre de usuario y su contraseña, para pasársela como parámetros a Omnis. El código PHP necesario es el siguiente:
if (isset($_SERVER['REMOTE_USER']))
$params['User1'] = $_SERVER['REMOTE_USER'];
if (isset($_SERVER['PHP_AUTH_USER']))
$params['User2'] = $_SERVER['PHP_AUTH_USER'];
if (isset($_SERVER['PHP_AUTH_PW']))
$params['Password'] = $_SERVER['PHP_AUTH_PW'];
Pero debemos tener en cuenta que, (para que esto funcione) el servidor PHP, deberá permitir ciertas restricciones de seguridad, consulte las “safe mode restrictions”.
Reconocimiento del servicio “Off-Line”
Un “Omnis App Server” suele ser muy estable, pero aún así es necesario hacer algo de mantenimiento de vez en cuando. De modo que puede ser inevitable que debido a que el servidor esté en modo “off-line” y le llegue una solicitud de “remote form” desde un navegador, el navegador se congela durante varios minutos, terminando por ofrecer como respuesta "'Error reading the response from the WEB server”.
Pero ésto se puede ser evitado fácilmente, mediante el uso de la clase “OmnisWebClass.php” y añadiendo algunas enmiendas a la librería Omnis. En este caso, el “Omnis App Server” deberá poseer permisos de escritura sobre el sistema de archivos del servidor web. Además, deberán rebajarse algunas de las normas de seguridad impuestas en PHP. De éste modo, el “Omnis App Server” podría, (inmediatamente después de abrir la librería) crear un archivo, (por ejemplo, con el nombre “Semaphore_WEBCLIENT.txt”) bajo el mismo directorio donde se encuentra “webclient.php”, el cual sería eliminado tras cerrarse la librería.
La idea es, que la instancia de “OmnisWebClass.php” pueda comprobar la existencia o no, de este archivo. Si no existe, en lugar de mostrarse el código de error, mostrar algo como “≤h3≥Omnis App. Server, cumple tareas de mantenimiento≤/h3≥”. El texto exacto es configurable. Para implementar este comportamiento, tan sólo sería necesario ñadir una línea más al archivo “webclient.php” informando a la instancia sobre el nombre del archivo a crear, del modo siguiente:
$x-≥set_semaphore('Semaphore_WEBCLIENT.txt');
23 de diciembre de 2015
Programación asíncrona con Omnis
Existen dos enfoques básicos a la hora de programar determinadas funciones o métodos, nos referimos a la programación “sincrónica” y “asincrónica”. Con programación “sincrónica”, la ejecución de cada función o método deberá completarse antes de iniciarse el siguiente. Este es el comportamiento predeterminado en Omnis. La desventaja de este modelo es que el proceso puede quedar congelado por largo tiempo debido a la esperar por una acción del usuario o de la ocurrencia de un evento a fin de poder ejecutar otras tareas. Una solución a esto la encontramos bajo el modelo de programación “asíncrona”. En este caso, una función o método es ejecutado en un hilo separado, siendo posible el procesado en paralelo de otras funciones, cada una en su propio hilo. Sin duda (dependiendo del tipo de tareas a realizar) éste método es más rápido y eficiente, ya que la ejecución de un método nunca se queda parado a la espera de un suceso.
Imagine una situación en la que una aplicación necesita realizar una importación de datos, pero sin que eso le impida al mismo tiempo llevar a cabo alguna otra función. Bajo el modelo “sincrónico”, tendría que completarse primero la importación de datos, lo cual dejaría al programa bloqueado, mientras que en modo “asíncrono” la importación de datos podría ejecutarse en segundo plano, si impedir la ejecución de cualquier otro código.
El siguiente ejemplo hace uso del componente “Web Services”. Tomemos un ejemplo sencillo: en un bucle vamos incrementado el valor de una variable, mientras que, al mismo tiempo, se le presenta un “OK message” al usuario indicándole que existe un proceso ejecutándose en segundo plano.
En primer lugar, añadiremos a nuestra librería una “remote task” de nombre “RTest”, sobre la que crearemos el método denominado “$backgroundMethod()”. Pulsamos botón-derecho sobre el método y lo marcamos como “Web Service Method static”, tal y como mostramos en la siguiente imagen.
Imagine una situación en la que una aplicación necesita realizar una importación de datos, pero sin que eso le impida al mismo tiempo llevar a cabo alguna otra función. Bajo el modelo “sincrónico”, tendría que completarse primero la importación de datos, lo cual dejaría al programa bloqueado, mientras que en modo “asíncrono” la importación de datos podría ejecutarse en segundo plano, si impedir la ejecución de cualquier otro código.
El siguiente ejemplo hace uso del componente “Web Services”. Tomemos un ejemplo sencillo: en un bucle vamos incrementado el valor de una variable, mientras que, al mismo tiempo, se le presenta un “OK message” al usuario indicándole que existe un proceso ejecutándose en segundo plano.
En primer lugar, añadiremos a nuestra librería una “remote task” de nombre “RTest”, sobre la que crearemos el método denominado “$backgroundMethod()”. Pulsamos botón-derecho sobre el método y lo marcamos como “Web Service Method static”, tal y como mostramos en la siguiente imagen.
A continuación, añadiremos al método el siguiente código:
For contador from 1 to 1000000 step 1
Calculate contador2 as contador+1
End For
OK message {¡Proceso en segundo plano finalizado!}
Ahora crearemos una ventana con un botón, al cual añadir en su método “$event()” el siguiente código:
Start server
Do async method rTest/$backgroundMethod
OK message {¡Método contador ejecutándose en segundo plano!}
Para probarlo, abra la ventana y haga clic sobre el botón. Primero aparecerá el “OK message” indicando que se está ejecutando el método. Aunque pulse “Aceptar”, el proceso seguirá su curso, pero a su conclusión se le mostrará otro “OK message” indicando su finalización.
Cuando esté ejecutando métodos en modo “asíncrono”, deberá asegurarse de que se está programando en un entorno "seguro para subprocesos", es decir, asegurarse de no utilizar variables globales o comandos que puedan modificar indicadores globales. Los resultados podrían resultar los no esperados, si utilizamos comandos que (por ejemplo) cambien el valor de #F. Para volver al modo de ejecución “sincrónica” (el modo por defecto), deberemos usar el comando “Stop server”.
Suscribirse a:
Entradas (Atom)