Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Opciones personalizables para los usuarios de una aplicación Web: posibles soluciones (https://www.clubdelphi.com/foros/showthread.php?t=35212)

dec 04-09-2006 19:24:23

Opciones personalizables para los usuarios de una aplicación Web: posibles soluciones
 
Hola,

¿Cómo va eso? ¿Y la vuelta al cole, bien? ¿Y el Madrid, otra vez campeón de Europa? ¿Eh? Bueno. Parabienes para todos. ;)

A ver si podéis echarme una mano con mi "problema". Lo entrecomillo porque es más bien una duda, o varias, pero, ni corre prisa, ni es algo que esté causando ningún inconveniente. Veréis.

En Loturak, ya sabéis, esa Web a la que un Spammer se está refiriendo descaradamente en estos Foros (como le descubramos se va a enterar el pendejo), en Loturak, digo, estamos tratando de desarrollar lo que haga falta para que los usuarios puedan establecer determinadas "opciones" para el uso del sitio Web.

Ahora mismo el usuario ya puede cambiar una serie de datos, pero, el tema está en darle la posibilidad de establecer "verdaderas opciones" de la aplicación y no sólo sus propios datos de usuario.

Por ejemplo, algunos ya sabéis que Loturak muestra listados de enlaces a páginas Web, básicamente. Estos enlaces cuentan con una descripción, aunque no es obligatoria. Y esta descripción, por defecto, no aparece en el listado de enlaces: hay que hacer clic en una "lupa" para mostrarla.

Pues bien, de lo que se trataría es de dar la posibilidad al usuario de poder establecer si quiere que la descripción de los enlaces aparezca "visible" desde un principio o no, que aparezca como ahora, "oculta" hasta que se quiere echar un vistazo.

Eso sería un ejemplo de "opción de usuario", obviamente habría más, y de ahí el comerse un poco el coco para montar algo que escale, esto es, que se puedan añadir tantas opciones como sea preciso sin problemas. Ahora bien, mi cabecita no da para mucho, como se podrá apreciar.

He pensado en añadir una tabla a la base de datos de Loturak y ahí guardar las opciones de los usuarios, peeeeeeeeeeeeeeeeeero... siempre hay un pero, sobre todo si no se tiene mucha idea de lo que uno está haciendo, si se es un novato, prácticamente.

La table que mi mente privilegiada es capaz de imaginar podría estar formada por los siguientes campos:

Tabla Opciones. Campos:

opciones_id
opciones_id_usuario
opciones_clave
opciones_valor

Creo que no es importante, para lo que nos ocupa, especificar el tipo de estos campos, etc. El inconveniente que le veo a la tabla anterior podría resumirse en que aunque por un lado le veo todo el sentido del mundo, por el otro intuyo que ni es la mejor solución, ni siquiera una solución mínimamente aceptable.

Supongamos que el usuario tiene la posibilidad de escoger 20 opciones en la aplicación. Supongamos que hay 1000 usuarios registrados (que no llegará Loturak a eso, probablemente, pero, estamos suponiendo nada más). 20 opciones por 1000 usuarios son 20.000 mil registros en la tabla Opciones, tal y como yo soy capaz de plantearlo... y me parece que algo en mi planteamiento está rematadamente mal.

Otra cosa que se me ocurre al Hilo de esto es si alguna vez se me ocurre que necesito guardar en la base de datos las opciones de la propia aplicación, no ya de los usuarios. Por ejemplo, ahora se establecen una serie de constantes que son las que determinan algunos aspectos de la aplicación, pero, si llegáramos a ampliar el pobre apartado de "administración" conque cuenta Loturak... una de las gracias estaría en poder establecer opciones de la propia aplicación...

A mí se me mete en la cabeza que opciones son opciones, ora del usuario, ora de la aplicación, pero, que ambas cosas son opciones y deberían ir por tanto en la misma tabla Opciones... pero,... como que tampoco lo veo claro...

Mi "modelo" para esto último, es decir, sólo para las opciones de la aplicación, podría ser el Gestor de contenidos WordPress que, efectivamente, cuenta con una tabla "Opciones" y no sólo guarda en ella las suyas, pero, permite a los desarrolladores de Plugins hacer lo propio: crear opciones, escribirlas, leerlas, en fin.

O sea, de tratarse únicamente de guardar las opciones de la aplicación creo que más o menos estaría claro, podría seguirse el ejemplo de WordPress y la cosa mejor o peor funcionaría, pero, ¿qué pasa con las opciones de los usuarios? ¿Cómo se os ocurre a vosotros que podrían tratarse? ¿Acaso está demás utilizar la base de datos para esto y bastaría con "Cookies", por ejemplo? ¿Para veinte o más opciones? ¿Cómo lo véis vosotros?

Cualquier cosa que se os ocurra será bienvenida y agradecida. Saludos para todos y perdonar el pedazo de rollo que os acabo de soltar, que podría haberse resumido en pocas líneas, estoy seguro, peeeeeeeeeeero... siempre hay un pero. :eek:

Gracias de verdad a todos de antemano. :)

maeyanes 04-09-2006 19:41:40

Para las opciones de la aplicación si es bueno la tabla opciones, con los campos clave y valor.

Para las opciones de los usuarios, podrían darse dos situaciones...

Una tabla parecida a la de opciones de la aplicación, con un identificador al usuario (siguiendo tu ejemplo id_usuario). Ahora, leo que tu preocupación aquí es el número de opciones que pueden existir para un usuario y el número de registros que podría haber por usuario. Una posible solución sería solo guardar las opciones que el usuario cambie, o sea, si el usuario sigue usando el valor predeterminado de determinada opción, que este no se guarde, que se tome directamente de algun otro lado. La ventaja aquí sería la facilidad de agregar opciones nuevas.

La otra, una tabla con tantos campos como opciones tenga el usuario, la desventaja de esta posibilidad sería que al agregar una opcion nueva, tendrías que agregar un campo nuevo. La ventaja, cada usuario solo usaría solo un registro.

Espero que te sirvan de algo mis comentarios...



Saludos...

roman 04-09-2006 19:54:45

¿Cuánto podría ocupar una opción? ¿1 byte? Digo, esto da opción a 256 valores para cada opción. Ok. Decíamos que había ¿cuantos? ¿mil usuarios por 20 opciones? En total 20,000 bytes. Guau, suena mucho. Pero, esperen un momento, eso son 20 kilobytes. En mi opinión eso no es nada.

// Saludos

maeyanes 04-09-2006 19:57:25

Tal vez no le preocupa el espacio que ocupen, si no el volumen de información... digo, tal vez... :p



Saludos...

roman 04-09-2006 20:02:24

O quizá la cantidad de datos :p

dec 04-09-2006 20:05:23

Hola,

Gracias por vuestros comentarios. Por supuesto que son útiles. Sí; una posible solución podría estar en una tabla (para las opciones de los usuarios) que contuviese tantos campos como opciones, a costa de que añadir una opción significaría añadir un nuevo campo a dicha tabla. Bueno. Desde luego es algo que puede hacerse. Tampoco creo que las opciones crecieran como setas.

Por otro lado, atendiendo a lo que dice Román, pues, hombre, ocupar, lo que se dice ocupar, la mayoría de las opciones serían "booleanas", aunque el campo de la base de datos podría consistir en una enumeración cuyo rango estuviera entre 0 y 1. Es cierto que no parecen exagerados 20 KB para 20.000 opciones, puesto que hablamos de 1000 usuarios y Loturak crece a usuario por semana y somos ahora 85....

Las opciones en WordPress, la tabla de opciones en este gestor de contenidos, y, más concretamente, el campo que almacena el valor de dichas opciones es de tipo "longtext"... quiere decirse que no se trata de guardar un valor booleano, sino que pueden ir y de hecho van más allá (yo mismo escribí un Plugin para este sistema que guardaba en una opción varias líneas de texto sin problema alguno).

Tal vez una posible solución fuera considerar la posibilidad de separar las opciones de la aplicación y las opciones de los ususarios. Y que estas últimas fueran opciones "siempre" booleanas, de manera que el tamaño de la tabla de opciones no se fuera de madre. Podría ser, pero, no sé porqué (seguramente mi ignorancia y no otra cosa) no termino de verlo más o menos claro...

maeyanes 04-09-2006 20:12:12

Lo más sano, desde mi punto de vista, sería tener las opciones de la aplicación y las de los usuarios por separado...

Y podrías probar con solo guardar en la tabla las opciones que no contengan el valor predeterminado. Esto es, cuando un usuario hace login, se inicializan las opciones del usuario con los valores predeterminados, acto seguido, lees de la tabla de opciones del usuario las opciones que haya modificado y asignas sus valores a las opciones correspondientes...

No se que te parezca...



Saludos...

dec 04-09-2006 20:14:27

Hola,

Lo que parece claro es que si se quiere conseguir algo que escale y merezca la pena no va a ser moco de pavo, puesto que, por ejemplo, está el tema de consultar las opciones de un usuario, leerlas, escribirlas, actualizarlas, añadirlas,...

Se me ocurre emplear una clase Opciones que se encarge más o menos de todo esto, pero, desde luego, no creo que sea cuestión de ir añadiendo variables (propiedades) a esta clase por cada opción disponible, desde luego...

Pienso en una clase opciones con un "Array asociativo" que guardara las claves y los valores de las opciones, las cuales podrían cargarse al inicio de la sesión del usuario, y no volver a consultarse en la base de datos nunca más, a lo menos para "leer" dichos valores.

Esta clase habría de contar con métodos de escritura, lectura, actualización de opciones... ¡qué fregao, madre! Sin embargo, lo que más preocupa es el tema de la base de datos, de la posible tabla para las opciones...

Bueno. Gracias otra vez por vuestros comentarios, ¿eh? Siempre es bueno conocer la opinión de otros, puesto que quedarse con la de uno es posiblemente la mejor manera de ejecutar el salto del ángel en el pozo del error. Así que gracias otra vez. :)

Emilio 04-09-2006 20:27:49

Creo que estás invirtiendo algo, dices que si tienes 1.000 usuarios con 20 opciones por usuario serán 20.000 registros, cosa que no me cuadra, entiendo que tendrás 1.000 registros en una tabla de 20 campos, por otra parte no veo problema en el tamaño incluso hablando de muchos miles de registros, si quieres ahorrar espacio en tus tablas no olvides hacer uso de VARCHAR en lugar de CHAR para tus campos string.

En cuanto al tema de guardar las opciones del usuario, ya sabes, se trata de hacer una combinación entre cookies, session y los datos guardados en tu base de datos, creo que no tienes dudas sobre esto, si las tienes dilo y le pegamos un repaso a ver que sacamos en limpio.

PD: Por supuesto la sesión en una clase, me gusta más así, pero para gustos....

dec 04-09-2006 20:29:51

Hola,

Cita:

Empezado por Maeyanes
Lo más sano, desde mi punto de vista, sería tener las opciones de la aplicación y las de los usuarios por separado...

Me parece que así es. Pienso que, al contener la tabla de opciones una campo "id_usuario", bien podría ser la aplicación un usuario más, salvo que contara con ciertas opciones conque el resto de usuarios no, lógicamente, pero, esto no me convence del todo ni mucho menos, porque, acaso estaríamos mezclando churras con merinas, por mucho que la aplicación pudiera considerarse un usuario más, no sería un usuario como los otros, y las opciones de los otros de nada servirían a la aplicación.

Cita:

Empezado por Maeyanes
Y podrías probar con solo guardar en la tabla las opciones que no contengan el valor predeterminado. Esto es, cuando un usuario hace login, se inicializan las opciones del usuario con los valores predeterminados, acto seguido, lees de la tabla de opciones del usuario las opciones que haya modificado y asignas sus valores a las opciones correspondientes...

Aquí veo un inconveniente, seguro que porque en estos temas no estoy nada puesto. Como arriba (antes de que contestases) he dicho, me planteo una clase Opciones que se encargara de tratar con estas en la aplicación. En realidad ya se cuenta con una clase Usuario, y pienso que esta podría tener una variable/propiedad que podría albergar una instancia de un objeto de la clase Opciones.

De este modo, al crearse el objeto Usuario (que se crea al comienzo de la aplicación) podría aprovecharse para crear a su vez la instancia de la clase Opciones, y que esta se encargara ya de cargar las opciones del usuario en cuestión.

Ahora bien, tener opciones por defecto implica tener una lista de opciones predeterminada (¿O me equivoco?). Pero, ahora que lo pienso... tal vez es que no haya otra... no sé... la verdad es que contra más lo pienso me aparecen como posibles caminos a seguir, pero, enseguida encuentro algún obstáculo que me dice párate, no sigas por aquí, párate y mira esto...

Por ejemplo, ¿cómo se llevaría a cabo la inicialización de opciones? ¿Qué haría la clase Opcinoes en su inicialización? ¿Consultar la base de datos en busca de posibles opciones y guardarlas en el Array asociativo correspondiente para luego poder trabajar con estas? ¿Acaso debería la misma clase Opciones establecer una serie de opciones por defecto, de entrada, sin ni siquiera consultar a la base de datos? ¿Pero entonces para qué el Array asociativo? ¿Para otras opciones que no fueran las predeterminadas?

Pero he ahí otro problema (creo) y es que todas las opciones necesitan ser inicializadas al menos la primera vez que se piensen utilizar... digo yo, vamos... y me temo que al cabo habría que ir añadiendo y añadiendo opciones en la inicialización de la clase ídem...

No sé... disculpad que discurra de esta manera,... es lo que digo, habrá que darle vueltas a esto para no estar horas en realidad perdiendo el tiempo... no es que me importe, pero, tal vez sea bueno darle vueltas antes de escribir siquiera la primera línea de código.

roman 04-09-2006 20:40:30

En lo de separar las opciones de la aplicación de las de los usuarios, quizá sea útil revisar qué hace vBulletin. Hay opciones como el número de mensajes por página que pueden establecerse a "Predeterminado del foro". Supongo entonces que cada foro puede asignársele un valor y esto se guardará en la base de datos, supongo. Esta es una opción de la aplicación pero que también puede ser del usuario. En fin, quizá pueda dar alguna idea.

// Saludos

dec 04-09-2006 20:45:00

Hola,

Cita:

Empezado por Emilio
Creo que estás invirtiendo algo, dices que si tienes 1.000 usuarios con 20 opciones por usuario serán 20.000 registros, cosa que no me cuadra, entiendo que tendrás 1.000 registros en una tabla de 20 campos, por otra parte no veo problema en el tamaño incluso hablando de muchos miles de registros, si quieres ahorrar espacio en tus tablas no olvides hacer uso de VARCHAR en lugar de CHAR para tus campos string.

Desde luego que podría ser una solución utilizar una tabla con tantos campos como opciones de usuario, porque, siendo realistas, no sé yo hasta qué punto pueden acumularse las opciones de usuario... digamos que hubiera 5, 10, 20, quizás... lo que pasa es que entonces podríamos tener un poco de mieditis al plantearse añadir opciones, puesto que esto implicaría añadir un nuevo campo a la tabla... que al cabo podría ir acumulando campos hasta ser algo "monstruoso", ¿o no tanto?

Pero, lo de tener 20.000 registros en una tabla no es que me pánico ni nada de eso; lo que ma un poco de mal rollo es que esos 20.000 registros sean... cómo decirlo... ¿tan iguales?

Lo explicaré con un ejemplo. Loturak cuenta con una tabla de nombre "Enlaces" en donde se guardan los que los usuarios quieren. Esta tabla puede crecer y crecer, pero, al fin y al cabo hablamos de enlaces, puede haber un millón (y puede haberlos repetidos, en algunos de sus datos), pero, todos tiene su URL, su título, su descripción,... no sé... lo veo como algo razonable, porque me digo, hay un millón de registros, que se corresponden a un millón de enlaces: el asunto cuadra, no puede ser de otro modo, no caben en 100 registros un millón de enlaces.

Pero con las opciones no ocurriría eso, puesto que habría, digamos que veinte opciones distintas y miles y miles de registros... ¿No hay algo aquí que no está bien? Claro, por otro lado, ¿puede ser esto de otro modo? Es lo de antes, 20 opciones, 1000 usuarios: 20.000 registros... ¿pero puede ser de otro modo? Me parece que no, que si se plantea una tabla de opciones que contenga en realidad pares de claves y valores... no puede ser de otro modo...

En fin. Reconozco que todo esto es demasiado nuevo para mí, y que no me he documentado (no he leído) lo suficiente sobre el tema, ¡ni muchísimo menos!

Vuelvo a agradecer vuestros comentarios. Ahora mismo cada vez veo más la posibilidad de una tabla con tantos campos como opciones (claudicando un tanto en mis ambiciones de lograr algo más "abstracto") pero, básicamente, por la otra forma: los 20.000 registros de antes, no lo termino de ver nada claro... :D

Cita:

Empezado por Román
En lo de separar las opciones de la aplicación de las de los usuarios, quizá sea útil revisar qué hace vBulletin. Hay opciones como el número de mensajes por página que pueden establecerse a "Predeterminado del foro". Supongo entonces que cada foro puede asignársele un valor y esto se guardará en la base de datos, supongo. Esta es una opción de la aplicación pero que también puede ser del usuario. En fin, quizá pueda dar alguna idea.

Desde luego, vBulletin probablemente pueda enseñar no poco a quien se quiera meter a investigar en su código fuente... No te quito la razón Román. :D

dec 04-09-2006 20:53:52

Hola,

A ver si lo que se me acaba de ocurrir suena descabellado o no... ¿Qué tal si utilizamos la magnífica serialización de objetos que ofrece PHP? ¿Porqué no guardar, en un sólo campo de tipo "LongText" la instancia de la clase Opciones de los usuarios "serializada"? Podrían guardarse muchos pares de claves/valor.

Pienso en un "Array asociativo", como antes, al que podrían añadirse tantos elementos como fuera preciso, y que podría terminar guardado en la base de datos como digo: en un solo campo, junto al resto de la clase Opciones, previamente "serializada". Rizando un poco el rizo ni siquiera haría falta tabla de opciones (para usuarios), podría añadirse a la tabla Usuarios un campo "Opciones", precisamente. (*)

¿Qué os parece? :)

(*) Seguramente no; seguramente no estaría mal una tabla Opciones, salvo que, esta vez, contaría con un campo "LongText", como digo, que las almacenaría todas juntas.

roman 04-09-2006 21:01:20

A mi me parece muy buena idea a menos que quisieras hacer búsquedas sobre las opciones de usuario, por ejemplo, ¿cuántos usuarios usan morado como color de texto sobre fonde verde? Tu clase OpcionesUsuario simplemente tendría que tener cuidado en dar valores por defecto cuando aumente opciones. Yo creo que es bastante buena la idea.

// Saludos

dec 04-09-2006 21:13:05

1 Archivos Adjunto(s)
Hola,

Como que no la he inventado yo... je, je, je. No; quiero decir, que, recuerdo que WordPress guarda objetos serializados como opciones... claro que no hace esto únicamente, pero, a veces utiliza esta forma de guardar datos y, me he acordado de ello, seguramente.

Adjunto un sencillo ejemplo...

Emilio 04-09-2006 21:13:45

Cita:

Empezado por dec
Desde luego, vBulletin probablemente pueda enseñar no poco a quien se quiera meter a investigar en su código fuente... No te quito la razón Román. :D

Por lo poco/mucho que conozco vBulletin puedo decirte básicamente lo que hace...

1.- Comprueba si hay cookies.
2.- Comprueba que hay sesión iniciada.

2.- Si no hay ni sesión ni cookies (puede haber cookies sin sesión), entonces carga los valores por defecto.

3.- El usuario inicia session, carga datos de la BBDD a sesión y carga datos en las cookies.

Y ese es básicamente el funcionamiento del que antes te hablé.

maeyanes 04-09-2006 21:15:34

Cita:

Empezado por dec
,
Me parece que así es. Pienso que, al contener la tabla de opciones una campo "id_usuario", bien podría ser la aplicación un usuario más, salvo que contara con ciertas opciones conque el resto de usuarios no, lógicamente, pero, esto no me convence del todo ni mucho menos, porque, acaso estaríamos mezclando churras con merinas, por mucho que la aplicación pudiera considerarse un usuario más, no sería un usuario como los otros, y las opciones de los otros de nada servirían a la aplicación.

Aquí una pequeña corrección, quise referirme a tener dos tablas separadas, una para las opciones de la aplicación y otra para las opciones de los usuarios, pero lo que pensé no lo plasmé bien en mi mensaje... :p

Cita:

Aquí veo un inconveniente, seguro que porque en estos temas no estoy nada puesto. Como arriba (antes de que contestases) he dicho, me planteo una clase Opciones que se encargara de tratar con estas en la aplicación. En realidad ya se cuenta con una clase Usuario, y pienso que esta podría tener una variable/propiedad que podría albergar una instancia de un objeto de la clase Opciones.

De este modo, al crearse el objeto Usuario (que se crea al comienzo de la aplicación) podría aprovecharse para crear a su vez la instancia de la clase Opciones, y que esta se encargara ya de cargar las opciones del usuario en cuestión.

Ahora bien, tener opciones por defecto implica tener una lista de opciones predeterminada (¿O me equivoco?). Pero, ahora que lo pienso... tal vez es que no haya otra... no sé... la verdad es que contra más lo pienso me aparecen como posibles caminos a seguir, pero, enseguida encuentro algún obstáculo que me dice párate, no sigas por aquí, párate y mira esto...

Por ejemplo, ¿cómo se llevaría a cabo la inicialización de opciones? ¿Qué haría la clase Opcinoes en su inicialización? ¿Consultar la base de datos en busca de posibles opciones y guardarlas en el Array asociativo correspondiente para luego poder trabajar con estas? ¿Acaso debería la misma clase Opciones establecer una serie de opciones por defecto, de entrada, sin ni siquiera consultar a la base de datos? ¿Pero entonces para qué el Array asociativo? ¿Para otras opciones que no fueran las predeterminadas?

Pero he ahí otro problema (creo) y es que todas las opciones necesitan ser inicializadas al menos la primera vez que se piensen utilizar... digo yo, vamos... y me temo que al cabo habría que ir añadiendo y añadiendo opciones en la inicialización de la clase ídem...

No sé... disculpad que discurra de esta manera,... es lo que digo, habrá que darle vueltas a esto para no estar horas en realidad perdiendo el tiempo... no es que me importe, pero, tal vez sea bueno darle vueltas antes de escribir siquiera la primera línea de código.
Con lo que comentas, y siguiendo con mi propuesta, podrías tener las opciones con sus valores predeterminados bajo un ID de usuario con valor 0 o -1, así si deseas agregar una opción nueva, solo creas un registro nuevo para ese usuario. Ahora, para inicializar los valores predeterminados, al hacer un usuario login, se leen las opciones y sus valores de este ID de usuario, acto seguido, se leen las opciones modificadas del usuario.

Representado sería algo como esto:

Código:

Id_Usuario  Clave    Value
0          Opcion1  0
0          Opcion2  1
0          Opcion3  1 <--- hasta aquí, todas las opciones con sus valores predeterminados.
1          Opcion2  0 <--- el usuario con ID 1 solo modificó el valor de la opcion2.

Claro, tiene el pequeño inconveniente que se tendría que leer dos veces la tabla de opciones del usuario.

Cita:

Empezado por dec
Hola,

A ver si lo que se me acaba de ocurrir suena descabellado o no... ¿Qué tal si utilizamos la magnífica serialización de objetos que ofrece PHP? ¿Porqué no guardar, en un sólo campo de tipo "LongText" la instancia de la clase Opciones de los usuarios "serializada"? Podrían guardarse muchos pares de claves/valor.

Pienso en un "Array asociativo", como antes, al que podrían añadirse tantos elementos como fuera preciso, y que podría terminar guardado en la base de datos como digo: en un solo campo, junto al resto de la clase Opciones, previamente "serializada". Rizando un poco el rizo ni siquiera haría falta tabla de opciones (para usuarios), podría añadirse a la tabla Usuarios un campo "Opciones", precisamente. (*)

¿Qué os parece? :)

(*) Seguramente no; seguramente no estaría mal una tabla Opciones, salvo que, esta vez, contaría con un campo "LongText", como digo, que las almacenaría todas juntas.

Aquí el inconveniente que le veo sería que si algún otro programador quiere agregar alguna funcionalidad a la aplicación y esta conlleve opciones de usuario nuevas, tendría que modificar la clase opciones para agregarlas.


Saludos...

dec 04-09-2006 21:22:28

Hola,

Cita:

Empezado por Maeyanes
Aquí [ serializando la clase Opciones ] el inconveniente que le veo sería que si algún otro programador quiere agregar alguna funcionalidad a la aplicación y esta conlleve opciones de usuario nuevas, tendría que modificar la clase opciones para agregarlas.

Yo pienso que no, puesto que las opciones en realidad estarían todas en un Array asociativo de la clase Opciones... si se quisiera añadir una nueva opción bastaría (según lo veo ahora) con añadir un nuevo elemento al Array de opciones.

Evidentemente, a la que se añadiera el nuevo elemento habría que actualizar todas (si no se encuentra la forma de hacerlo de otro modo), digo, habría que actualizar todas las opciones, pero, en realidad hablamos de actualizar UN campo de la base de datos...

Cuando el usuario iniciara de nuevo sesión, la opción añadida antes no se habría perdido, sino que se recuperaría con el resto de opciones al "deserializar" el objeto. Además pienso en la cantidad de funciones conque cuenta PHP para trabajar con Arrays... no conozco la mayoría, pero, sé que están ahí... :D

roman 04-09-2006 21:29:17

Yo no creo que sea necesario actualizar nada. Por ello mencioné lo de valores por defecto. Cuando un usuario se conecte, al momento de deserializar, el objeto OpcionesUsuario tendrá más propiedades, pero éstas tendran valores por defecto. Cuando guardes las opciones ya guardarás todas ellas pues lo que habrás actualizado será el método Save del objeto.

// Saludos

maeyanes 04-09-2006 21:35:13

Cita:

Empezado por dec
Hola,



Yo pienso que no, puesto que las opciones en realidad estarían todas en un Array asociativo de la clase Opciones... si se quisiera añadir una nueva opción bastaría (según lo veo ahora) con añadir un nuevo elemento al Array de opciones.

Evidentemente, a la que se añadiera el nuevo elemento habría que actualizar todas (si no se encuentra la forma de hacerlo de otro modo), digo, habría que actualizar todas las opciones, pero, en realidad hablamos de actualizar UN campo de la base de datos...

Cuando el usuario iniciara de nuevo sesión, la opción añadida antes no se habría perdido, sino que se recuperaría con el resto de opciones al "deserializar" el objeto. Además pienso en la cantidad de funciones conque cuenta PHP para trabajar con Arrays... no conozco la mayoría, pero, sé que están ahí... :D

Reconozco que no me he metido lo suficiente a PHP.

Ahora, como sería? Como usuario inicio sesión, la aplicación lee las opciones de la base de datos ("deserializa" el objeto), hago algún cambio de estas opciones, trabajo con la aplicación y finalizo la sesión, la aplicación aquí guarda las opciones (o puede guardarlas desde que aplico los cambios a estas opciones).

Dado lo anterior, ¿en que momento se podría agregar una opción nueva? Esto lo pregunto por que no se exactamente como funciona la serialización de objetos en PHP. A lo que voy, si creo el objeto con un arreglo de X elementos, al "deserializar" este objeto conteniendo X - 1 elementos, ¿se pierde el elemento extra con el que inicialicé el arreglo o solo se sobreescriben los que ya existían?


Saludos...

dec 04-09-2006 21:55:09

Hola,

Cita:

Empezado por Román
Yo no creo que sea necesario actualizar nada. Por ello mencioné lo de valores por defecto. Cuando un usuario se conecte, al momento de deserializar, el objeto OpcionesUsuario tendrá más propiedades, pero éstas tendran valores por defecto. Cuando guardes las opciones ya guardarás todas ellas pues lo que habrás actualizado será el método Save del objeto.

Me pierdo un poco en el tema de la inicialización de las opciones. En lo que "he caído" es en que acaso no sea preciso serializar todo el objeto, sino que bastaría con hacerlo con el Array que guarde las opciones, propiamente. Esto es posible porque PHP no sólo serializa Objetos (ignoro ahora mismo si un Array lo es en PHP, pero, me parece que no), sino, variables de tipo "mixed"... y Arrays, por ejemplo.

Cita:

Empezado por Maeyanes
Ahora, como sería? Como usuario inicio sesión, la aplicación lee las opciones de la base de datos ("deserializa" el objeto), hago algún cambio de estas opciones, trabajo con la aplicación y finalizo la sesión, la aplicación aquí guarda las opciones (o puede guardarlas desde que aplico los cambios a estas opciones).

Exacto. Las opciones por defecto siempre serán las mismas hasta que el usuario las cambie... en el apartado de opciones de la aplicación. Efectivamente, tendrá que "aplicar los cambios", puesto que, por las características de una aplicación de este tipo, no es posible guardar las opciones "cuando el usuario salga de la aplicación", pongamos por caso.

Pero, de todos modos, los programas no tienen porqué guardar las opciones al salir, aunque ahora me doy cuenta de que esto lo he hecho alguna que otra vez... hombre, tal vez algunas opciones han de guardarse al salir, como la posición de un formulario en pantalla, pero, buena parte de las opciones se "tocarán" en el apartado de opciones, se editarán y se guardarán desde ahí cuando el usuario lo precise.

Cita:

Empezado por Maeyanes
Dado lo anterior, ¿en que momento se podría agregar una opción nueva? Esto lo pregunto por que no se exactamente como funciona la serialización de objetos en PHP. A lo que voy, si creo el objeto con un arreglo de X elementos, al "deserializar" este objeto conteniendo X - 1 elementos, ¿se pierde el elemento extra con el que inicialicé el arreglo o solo se sobreescriben los que ya existían?

Si serializas un objeto que contiene diez "propiedades" al deserializar será eso lo que recuperes. Ahora... cómo añades opciones... pues supongo que "todo a la vez". Esto es, supongamos un Plugin que necesitara añadir un par de opciones de usuario... cuando esto se llevara a cabo habría se añadirían las opciones al Array correspondiente, y, efectivamente, habría en ese mismo punto que actualizar la base de datos, es decir, para que en sucesivas ocasiones la nueva opción estuviera disponible.

No he podido resistir y he escrito este poco de código en un momento como aquél que dice (no lo he probado ni nada) y lo expongo aquí porque creo que puede dar alguna idea de cómo llevar a cabo el tema, haciéndolo como venimos diciendo:

Código PHP:

<?php

class Opciones
{
  var 
$idUsuario 0;
  var 
$opciones null;

  function 
Opciones($idUsuario)
  {
    
$this->opciones = array();
    
$this->idUsuario $idUsuario;    
    
$this->Cargar();
  }

  
/**
   * Cargamos las opciones del usuario.
   */
  
function Cargar()
  {
    global 
$bdatos;
    
$consultaSql "SELECT opcion_contenido FROM opciones 
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";
    
$this->opciones unserialize($bdatos->Variable($consultaSql));    
  }

  
/**
   * Guardamos las opciones del usuario.
   */
  
function Guardar()
  {
    global 
$bdatos;
    
$contenido serialize($this->opciones);
    
$consultaSQL "UPDATE opciones SET opcion_contenido = '$contenido'
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";
  }
  
  
/**
   * Averiguamos si existe una opción de usuario en concreto.
   *
   * @param string $clave
   * @return boolean
   */
  
function Existe($clave)
  {
    return 
array_key_exists($clave$this->opciones);
  }

  
/**
   * Leemos el valor de una opción. Si esta no existe retornamos el valor
   * por defecto que se especifique en el parámetro correspondiente.
   * 
   * Nota: esos "mixed", ¿qué pasa con ellos?
   *
   * @param string $clave
   * @param mixed $valorPorDefecto
   * @return mixed
   */
  
function Leer($clave$valorPorDefecto '')
  {
    if(!isset(
$this->opciones[strtolower($clave)]))
      return 
$valorPorDefecto;    
    else 
      return 
$this->opciones[strtolower($clave)];
  }

  
/**
   * Escribimos el valor de una opción del usuario.
   *
   * Nota: Otra vez el "mixed" sale a relucir...
   * 
   * @param string $clave
   * @param mixed $valor
   */
  
function Escribir($clave$valor)
  {
    
$this->opciones[strtolower($clave)] = $valor;    
    
$this->Actualizar();
  }  
  
  
/**
   * Actualiza las opciones del usuario.
   */
  
function Actualizar()
  {
    
$this->Guardar();
  }
  
// class Opciones

?>

Por supuesto el código anterior no está ni probado, ni "concluído" ni nada de nada... pero puede dar alguna idea, espero. En caso de dudas aquí estamos. ¡Y otra vez muchas gracias a todos muchachos! ;)

maeyanes 04-09-2006 22:03:04

Yo me refiero a la serialización de arreglos, ya que es de lo que has hablado, que tu clase opciones contenga un arreglo con estas y sus valores, es por eso mi ejemplo. En cuanto a propiedades si me doy la idea de como sería.

Saludos...

dec 04-09-2006 22:22:16

Hola,

Bueno. No creas que tengo del todo claro el asunto Maeyanes, ni mucho menos... ahora mismo estoy haciendo alguna que otra prueba, pero, según voy avanzando me va surgiendo algún que otro reparo... qué sé yo... pero, vamos a ver si sacamos algo en claro. Desde luego este Hilo me ha venido estupendamente. ;)

Si todo esto no es más que por un usuario de Loturak, que quiere que las descripciones de los enlaces siempre estén visibles, ya ves tú... no tiene otra cosa mejor en qué pensar... el jodío, y yo, que, sabiéndolo, pues quiero darle el gusto, porque además creo que esto abre la puerta a otras posibilidades. :)

Ahora, espero que nos os toque nunca un usuario tan puñetero como el que os digo. :eek: :eek: :D :D :D

maeyanes 04-09-2006 22:31:30

Hay de todo en la viña del señor... :D

Pues también mucho de esto me servirá para cuando me adentre más en esto del PHP... jejeje



Saludos y suerte...

dec 04-09-2006 23:10:25

Hola,

Ea. Pues ya es posible que este usuario puñetero (que está tardando en decirme algo bonito) vea siempre la descripción de los enlaces de Loturak. Ya está añadida esa opción,... y creo que no sería complejo añadir otras, pero, me temo que no tan "sencillamente" como esta que digo, a lo menos no en todos los casos. Se han dejado no pocos cabos sueltos.

Sin embargo, puede que lo que ha salido de este Hilo sea la base de la que partir. Es decir, como digo, parece que la cosa marcha bien. Piénsese que los usuarios de Loturak no notarán cambio alguno, esto es, los enlaces se verán como hasta ahora, porque la opción por defecto es no mostrar la descripción de estos de primeras, pero, ya pueden hacer que esto no sea así.

Por ejemplo, me llama la atención que Loturak cuenta con 85 usuarios, pero, la tabla de opciones cuenta con un registro: mis propias opciones. Sin embargo, como digo, no tendré que "rellenar" la tabla de opciones para el resto de usuarios, puesto que, siempre se tomará la medida "por defecto" en caso de que las opciones de un usuario no existan.

¿Y cuando existirán? Evidentemente, cuando el usuario eche un vistazo a sus opciones (en el apartado correspondiente) y decida "aplicar los cambios".

La clase que estoy utilizando ahora mismo es tal que así, empero, he subido la misma al Servidor para que el puñetero usuario que he mencionado (y quien quiera) pueda ver cómo queda el asunto. Evidentemente el código fuente que se ha implicado en todo esto (sorprendentemente sencillo) hay que repasarlo mejor.

Código PHP:

<?php

class Opciones
{
  var 
$idUsuario 0;
  var 
$opciones null;

  function 
Opciones($idUsuario)
  {
    
$this->opciones = array();
    
$this->idUsuario $idUsuario;    
    
$this->Cargar();
  }

  
/**
   * Cargamos las opciones del usuario.
   */
  
function Cargar()
  {
    global 
$bdatos;
    
$consultaSql "SELECT opcion_contenido FROM opciones 
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";    
    
$contenido $bdatos->Variable($consultaSql);
    
    if(
$contenido)
    {
      
$this->opciones unserialize($bdatos->Variable($consultaSql));      
    }
      
    return;
  }

  
/**
   * Guardamos las opciones del usuario.
   */
  
function Guardar()
  {
    global 
$bdatos;
    
$contenido serialize($this->opciones);
    
    
$consultaSQL "SELECT opcion_contenido FROM opciones 
     WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";    
    
$resultado $bdatos->Resultados($consultaSQL); 
    
    if(
$resultado)
    {
      
$consultaSQL "UPDATE opciones SET opcion_contenido = '$contenido'
       WHERE opcion_id_usuario = '
{$this->idUsuario}' LIMIT 1;";
       
$bdatos->Resultados($consultaSQL);       
    }
    else 
    {
      
$contenido $bdatos->Escapar(serialize($this->opciones));
      
$consultaSQL "INSERT INTO opciones (opcion_id_usuario,opcion_contenido)
       VALUES('
{$this->idUsuario}', '$contenido');";
      
$bdatos->Resultados($consultaSQL);             
    }
    
    return;    
  }
  
  
/**
   * Averiguamos si existe una opción de usuario en concreto.
   *
   * @param string $clave
   * @return boolean
   */
  
function Existe($clave)
  {
    return 
array_key_exists($clave$this->opciones);
  }

  
/**
   * Leemos el valor de una opción. Si esta no existe retornamos el valor
   * por defecto que se especifique en el parámetro correspondiente.
   * 
   * Nota: esos "mixed", ¿qué pasa con ellos?
   *
   * @param string $clave
   * @param mixed $valorPorDefecto
   * @return mixed
   */
  
function Leer($clave$valorPorDefecto '')
  {    
    if(!
$this->Existe($clave))
      return 
$valorPorDefecto;
    
    if(!isset(
$this->opciones[strtolower($clave)]))
      return 
$valorPorDefecto;    
    else 
      return 
$this->opciones[strtolower($clave)];
  }

  
/**
   * Escribimos el valor de una opción del usuario.
   *
   * Nota: Otra vez el "mixed" sale a relucir...
   * 
   * @param string $clave
   * @param mixed $valor
   */
  
function Escribir($clave$valor)
  {
    
$this->opciones[strtolower($clave)] = $valor;    
    return;    
  }  
  
  
/**
   * Actualiza las opciones del usuario.
   */
  
function Actualizar()
  {
    
$this->Guardar();
    return;    
  }
  
// class Opciones

?>

Como he dicho antes, esta clase se instancia en un objeto cuya referencia se guarda en una variable privada de la clase "Usuarios" conque contamos en Loturak. ¡Muchas gracias a todos otra vez, de no haber sido por vosotros seguramente no hubiera hecho nada y tendría a Ro... al puñetero diciéndome que qué pasa, que si no sé programar o qué! :eek: :eek: :) :D :cool:

Emilio 05-09-2006 00:20:17

Hola dec,

Pues no se que decirte, a mi gusto a quedado extremadamente farragoso, me gustan las cosas simples, sencillas y funcionar seguro que funciona, llegar a Roma seguro que has llegado, pero no comprendo que te ofrece para enmarañarlo tanto.

Ojo, es sólo una opinión que intenta ser constructiva, seguro que me lo explicas y hasta me convences, pero es que no lo veo claro por mi mismo.

dec 05-09-2006 00:41:39

Hola,

Ya he afinado un poquitín más el asunto y he actualizado el archivo Zip que contiene la última versión del código fuente de Loturak, por si queréis echar un vistazo, lo digo. ;)

En cuanto a lo que dices Emilio, me queda la duda de no haber utilizado (siempre se está a tiempo) una Cookie, pero, desde luego, no creo que el tema haya quedado farragoso.

Fíjate. ¿Qué ha sido necesario hacer? Crear una tabla en la base de datos de nombre Opciones, con tres campos, el ID de las opciones, el ID del usuario de estas, y el propio campo que contiene las opciones.

Ahora bien. ¿Ha sido necesario hacer algo más en la base de datos? No. ¿Hemos tenido que añadir algo a la tabla Opciones para que la cosa funcione? No. ¿Los usuarios notarán algo raro mientras no cambien sus opciones? No.

¿Básicamente qué es lo que hacemos? Hemos escrito una clase Opciones para tratar con estas en la base de datos de una forma más o menos sencilla... y la hemos escrito en un momento, como aquél que dice, y sabemos ya que puede ampliarse... que abre posibilidades...

De acuerdo, pero, ¿realmente es complicado acceder a las opciones, determinar qué camino a seguir en función de estas, qué es lo que nos cuesta averiguar la información que nos ofrece una opción? Veamos la única que existe ahora mismo, ¿cómo la utilizamos?

Código PHP:

if($usuario->opciones->Leer(APP_OPC_FORZAR_DESCRIPCION'0') == '0')
{
  
// No forzar la descripción del enlace
}
else
{
  
// Forzar la descripción del enlace


No parece muy complicado. Se busca una opción, se ofrece un valor "por defecto" en caso de que no exista la opción y obramos en consecuencia.

Pero, ¿Y qué hacemos para actualizar las opciones? Veámoslo:

Código PHP:

$usuario->opciones->Escribir(APP_OPC_FORZAR_DESCRIPCION1);
$usuario->opciones->Actualizar(); 

Es decir, se escribe el valor de las opciones que sean menester y se actualizan en consecuencia. No he querido "actualizar" en el propio método "Escribir", precisamente, para poder guardar varias opciones de un golpe, y, sobre todo, para no tener que hacerlo una a una...

Ahora bien, ¿dónde ves la complicación en todo esto Emilio? Estoy dispuesto a rectificar si encuentro que lo que hasta ahora hay hecho sirve, por supuesto. ;)

Al contrario, yo creo que la cosa ha quedado tan sencilla que escama un poco... que seguro que se están dejando cabos sueltos, pero, la opción añadida actualmente está cumpliendo, y, al menos similares a esa, estamos ya seguros de poder añadir más si nos es preciso, y con relativa sencillez.

roman 05-09-2006 01:43:17

La verdad que yo tampoco entendo el pero Emilio. Lo que ha hecho dec aquí es sencillo y servirá para guardar las opciones del usuario. Cierto que si sólo se tratase de una opción pues sería mucho hacer pero es claro que dec lo está pensando para más cosas.

Por otra parte, tanto puñetar empieza a mosquearme. No sé en España como sea la costumbre, pero llamarme puñetero tantas veces empieza a incomodarme. Confío en que sólo sea una diferencia de costumbres.

// Saludos

Emilio 05-09-2006 01:43:26

Cita:

Empezado por dec
Ahora bien, ¿dónde ves la complicación en todo esto Emilio? Estoy dispuesto a rectificar si encuentro que lo que hasta ahora hay hecho sirve, por supuesto.

Mi estimado dec, creo que en esta ocasión el que debe rectificar soy yo, después de atender con detalle al código, veo cuales son las intenciones que no he visto inicialmente y de ahí mi anterior opinión, lo cierto es que incluso debo decir que ahora hasta me gusta y posiblemente te lo pinche para alguna que otra cosa que tengo entre manos :D

Eso si, a ese código le falta la función resultados() que en ella debes hacer la consulta, pero bueno eso no es imprescindible, se sobreentiende.

Emilio 05-09-2006 01:46:17

Cita:

Empezado por roman
Por otra parte, tanto puñetar empieza a mosquearme. No sé en España como sea la costumbre, pero llamarme puñetero tantas veces empieza a incomodarme. Confío en que sólo sea una diferencia de costumbres.

Bueno aquí incluso se toma como alago que te llamen cabronazo, hijo de la gran pu... y cosas así ¿eso no se estila por ahí?

dec 05-09-2006 01:58:11

Hola,

Román, lo cierto es que el diccionario no hace esta vez una correcta descripción de la que es al menos una de las acepciones de las palabra puñetero. En mi tierra se dice cariñosamente, claro que vuelve a pasar lo mismo otra vez: dicho, o sea, de viva voz, suena de distinto modo, porque ahí está el quid, en el tono que se le dé a la palabra. Pasa con otras como cabrón, que no es necesariamente un insulto, puede incluso ser todo lo contrario. Pero, supongo que el lenguaje escrito no permite todas las posibilidades del lenguaje hablado. Permite otras, claro. :D

Cita:

Empezado por Emilio
Mi estimado dec, creo que en esta ocasión el que debe rectificar soy yo, después de atender con detalle al código, veo cuales son las intenciones que no he visto inicialmente y de ahí mi anterior opinión, lo cierto es que incluso debo decir que ahora hasta me gusta y posiblemente te lo pinche para alguna que otra cosa que tengo entre manos :D

Bueno. Desde luego la cosa es muy mejorable, de eso no me cabe duda. Por ejemplo, acabo de actualizar el código fuente de Loturak, porque estaba haciendo dos consultas a la base de datos para lo mismo. La clase Opciones ha cambiado también algo de lo que se puede ver arriba, aunque, básicamente, es lo que se ha comentado ya. ;)

Cita:

Empezado por Emilio
Eso si, a ese código le falta la función resultados() que en ella debes hacer la consulta, pero bueno eso no es imprescindible, se sobreentiende.

Bueno. Ahora mismo nos valemos de la clase "BDatos" de Loturak para traer las opciones de la base de datos, pero, muy probablemente termine escribiendo un método en la clase "BDatos" a partir del cual la clase "Opciones" pueda hacerse con estas.

En realidad el resultado sería el mismo: lo único que cambiaría (que se me ocurra, y que además pretendemos y tratamos de seguir como norma) es que se dejaría la consulta SQL en la clase BDatos, junto al resto de consultas que se hacen, de manera que en caso de necesitar modificar la misma se sabría de antemano a dónde acudir.

Al comenzar Loturak la clase BDatos era cierta clase que escribí (en realidad casi copié, pero, adrede, para tratar de comprender su funcionamiento) hace ya tiempo (con ayuda de no poca gente, Román, por ejemplo, colaboró en ello). Pero en Loturak contamos con una clase que extiende esta BDatos, y que es la que aporta métodos que, fundamentalmente, hacen consultas a la base de datos. Es por eso, por tenerlo ahí, a mano, como aquel que dice, y no una consulta aquí, otra allí, otra acullá, etc.

Pero, creo que me enrrollo... joroba... ¡sí, me estoy enrrollando! Me gustaría encontrar un fragmento de cierto capítulo de Don Quijote de la Mancha en donde se explica porqué utilizar el término hijo de puta y llamárselo a alguien no tiene que ser un insulto... no recuerdo exactamente qué capítulo era, pero, como todos los del Quijote, es estupendo.

Podría acaso buscarse por Internet, puesto que el Quijote está digitalizado y probablemente el término "hideputa" o "hijo de puta" no aparezca demasiado (eso creo recordar). En fin, lo dejo ya, que ya está bien, qué pesao. :eek: :eek: :) :D

roman 05-09-2006 02:05:38

Ta bueno pues.

En cuanto a la clase bdatos, desconozco yo el uso exacto que le das, pero visto así desde lejos y a juzgar por su nombre, a mi me da que tal como tienes tu clase Opciones está muy bien. Esto es, tienes una clase bdatos que- estoy suponiendo-centraliza el acceso a la base de datos, lo cual está muy bien, pero no hagas de esta clase un dios que hace todo. Otras clases de tu aplicación, como Opciones hacen uso de ella en lugar de dejarle todo el trabajo a una sólo clase.

Vamos, en resumen, que a mi me parece bien tal como la tienes.

// Saludos puñetero

dec 05-09-2006 02:06:13

Hola,

Capítulo XIII de la segunda parte del Quijote. Léase.

Y, por cierto,... ha sido leer un poco del texto para acordarme de que sí, en el Quijote se utiliza "hijo de puta" en más de una ocasión y más de dos... :D

seoane 05-09-2006 02:07:16

Cita:

Empezado por dec
Pero, creo que me enrrollo... joroba... ¡sí, me estoy enrrollando! Me gustaría encontrar un fragmento de cierto capítulo de Don Quijote de la Mancha en donde se explica porqué utilizar el término hijo de puta y llamárselo a alguien no tiene que ser un insulto... no recuerdo exactamente qué capítulo era, pero, como todos los del Quijote, es estupendo.

Podría acaso buscarse por Internet, puesto que el Quijote está digitalizado y probablemente el término "hideputa" o "hijo de puta" no aparezca demasiado (eso creo recordar). En fin, lo dejo ya, que ya está bien, qué pesao. :eek: :eek: :) :D

Ya te busco yo el fragmento:

Cita:

A lo que respondió Sancho, algo mohíno:

-Ni ella es puta, ni lo fue su madre, ni lo será ninguna de las dos, Dios quiriendo, mientras yo viviere. Y háblese más comedidamente, que, para haberse criado vuesa merced entre caballeros andantes, que son la mesma cortesía, no me parecen muy concertadas esas palabras.

-¡Oh, qué mal se le entiende a vuesa merced -replicó el del Bosque- de achaque de alabanzas, señor escudero! ¿Cómo y no sabe que cuando algún caballero da una buena lanzada al toro en la plaza, o cuando alguna persona hace alguna cosa bien hecha, suele decir el vulgo: "¡Oh hideputa, puto, y qué bien que lo ha hecho!?" Y aquello que parece vituperio, en aquel término, es alabanza notable; y renegad vos, señor, de los hijos o hijas que no hacen obras que merezcan se les den a sus padres loores semejantes.

-Sí reniego -respondió Sancho-, y dese modo y por esa misma razón podía echar vuestra merced a mí y hijos y a mi mujer toda una putería encima [...]

dec 05-09-2006 02:18:17

Hola,

Sí; de hecho dudo en añadir un método (y seguramente más de uno sería necesario) en la clase BDatos, puesto que la clase Opciones está ahora bastante clara y limpia, y tampco estorban ahí las consultas SQL.

Empero, los métodos principales relacionados con la base de datos de la aplicación: realizar la conexión, la selección de la base de datos, ejecutar consultas de varias maneras... todo eso lo hace la clase BDatos,... que en realidad no se ha tocado en Loturak, es decir, que puede usarse en otra aplicación sin problemas (en principio) y de hecho yo la he utilizado en alguna otra aplicación o pruebas.

Ahora, lo que existe en Loturak es una clase que extiende (que hereda) de la clase BDatos "principal". Es en esta clase hija en donde se acumulan métodos como "NumEnlacesPublicos", "NumEnlacesPrivados", "EnlaceUsuario", etc., etc., etc., que, básicamente, puede decirse que conforman las consultas SQL. No se ejecutan, sólo se conforman, porque de la ejecución de las consultas, entre otras cosas, se encarga la clase padre de esta.

¿Entonces cuál es la intención de extender la clase BDatos? Pues, básicamente (y es posible que de forma equivocada) se hace para tener en un solo lugar la conformación de consultas SQL. Esto no se consigue del todo, hay sitios en la aplicación en donde se hacen consultas SQL (siempre a través de la clase BDatos), pero, la gran mayoría (y como norma general) se hacen en la clase BDatos, no en "cualquier sitio".

Ocurre un poco lo mismo con la clase Xhtml, que "encapsula" (es mucho decir) la salida del código XHTML de la apliación. En algunos sitios se genera código de salida, pero, prácticamente todo el código XHTML de salida está en la clase Xhtml, de manera que es algo más sencillo de "localizar", editar, etc. Al menos así lo estoy viendo yo de momento... porque está el problema del tamaño de los archivos... la clase BDatos no me preocupa, pero, la clase Xhtml, incluso luego de varios repasos, ocupa ya unos 130 KB.

Sin embargo, no noto problemas en eso (de momento) y todavía es posible darle más de un repaso y más de dos... :eek: :eek: :D :D

dec 05-09-2006 02:23:13

Hola,

Cita:

Empezado por Seoane
Ya te busco yo el fragmento

Muchas gracias Seoane. ;) Unos párrafos más adelante de lo que has referido Seaoane, viene a caer Sancho en la verdad de que hijo de puta no es siempre un término ofensivo:

Cita:

(...)

-Por mi fe, hermano -replicó el del Bosque-, que yo no tengo hecho el estómago a tagarninas, ni a piruétanos, ni a raíces de los montes. Allá se lo hayan con sus opiniones y leyes caballerescas nuestros amos, y coman lo que ellos mandaren. Fiambreras traigo, y esta bota colgando del arzón de la silla, por sí o por no; y es tan devota mía y quiérola tanto, que pocos ratos se pasan sin que la dé mil besos y mil abrazos.

Y, diciendo esto, se la puso en las manos a Sancho, el cual, empinándola, puesta a la boca, estuvo mirando las estrellas un cuarto de hora, y, en acabando de beber, dejó caer la cabeza a un lado, y, dando un gran suspiro, dijo:

-¡Oh hideputa bellaco, y cómo es católico!

-¿Veis ahí -dijo el del Bosque, en oyendo el hideputa de Sancho-, cómo habéis alabado este vino llamándole hideputa?

-Digo -respondió Sancho-, que confieso que conozco que no es deshonra llamar hijo de puta a nadie, cuando cae debajo del entendimiento de alabarle. Pero dígame, señor, por el siglo de lo que más quiere: ¿este vino es de Ciudad Real?

-¡Bravo mojón! -respondió el del Bosque-. En verdad que no es de otra parte, y que tiene algunos años de ancianidad.

(...)
Véase el lenguaje de Cervantes (aunque traído al castellano "moderno"), pero, véase la maestría, la elegancia, la sencillez, la enjundia, el conocimiento, la cultura, lo que este hombre es capaz de decir en lo que escribe... ¡si no habéis leído el Quijote no dejéis de hacerlo cuando podáis, os aseguro risas, buenos ratos, sabiduría! ¡Y pongo las manos en el fuego por ello! No puede haber ser humano al que el Cervantes (no ya el Quijote) deje indiferente. Yo no sé cómo encarecerlo como se debe. :D

roman 05-09-2006 02:32:42

Cita:

Empezado por dec
Ocurre un poco lo mismo con la clase Xhtml, que "encapsula" (es mucho decir) la salida del código XHTML de la apliación. En algunos sitios se genera código de salida, pero, prácticamente todo el código XHTML de salida está en la clase Xhtml, de manera que es algo más sencillo de "localizar", editar, etc. Al menos así lo estoy viendo yo de momento... porque está el problema del tamaño de los archivos... la clase BDatos no me preocupa, pero, la clase Xhtml, incluso luego de varios repasos, ocupa ya unos 130 KB.

La clase BDatos no te preocupa ahora y posiblemente funcione bien en esta aplicación. Pero sí es de pensarse qué pasa cuando toda una clase muy grande debe cargarse para cualquier mínima cosa. Esto realmente es pregunta. Es que hasta para la página más pequeñita, tu clase xhtml carga todo. Y aunque en esta aplicación BDatos no tiene tanta demanda, la naturaleza de la cuestión es la misma que en la clase xhtml.

No sé, no sé. Sería bueno saber :)

// Saludos

dec 05-09-2006 02:59:43

Hola,

Cita:

Empezado por Román
Esto realmente es pregunta. Es que hasta para la página más pequeñita, tu clase xhtml carga todo (...)

Sobre eso diré que yo también me he preguntado algunas cosas y he estado a punto de comentarlo en los Foros, y, en fin, acaso ahora toca hacerlo.

En primer lugar no se me escapa que ciertas páginas, digamos, más o menos estáticas, podrían prescindir de la clase Xhtml, o, fuera como fuera, no necesitarían de métodos en esta clase, sino que, simplemente, cada página incluiría su código XHTML correspondiente (además del "general", que sí añadiría, por ejemplo, las cabeceras de las páginas, o el pie de estas). Puede hacerse, se ha pensado y no se descarta.

Peeeeeeeeeeeero... Lo cierto es que dudo que PHP carge los 130 KB del archivo de la clase Xhtml. Lo pongo en duda... ¡porque la carga de la página es bastante rápida, y, si tuviera que cargar los 130 de la clase Xhtml, los 30 de la clase BdatosEx, los 25 de la clase Login, los... tardaría mucho más de lo que tarda, fijo. Además nos hemos animado a echar para adelante (por lo menos hasta que no veamos que la cosa no escala, que no es posible seguir así) porque hemos visto clases en PHP de 300 KB...

Pero, sobre todo, porque los hechos contradicen a los números. Ya lo he dicho, si se "carga todo" la página tendría que ocupar unos 250 KB (no quiero exagerar) y, sin embargo, Loturak carga bastante rápido, desde luego, no cargaría así si tuviera que cargar con 250 KB... y lo dice alguien que cuenta con una conexión vía módem de 56 kbs y que notaría esos KB de qué manera...

¿Entonces? Pues no sé... no llego a tanto... es lo que quería preguntar, ¿cómo se las ingenia PHP? No lo sé, pero, desde luego, se las ingenia. No sé. Debe haber algo parecido al caché de los navegadores, o a lo que hace Apache (que no sirve páginas si no han cambiado desde la última vez), me parece, o MySQL, que no actualiza un registro (aunque se lo digas) si esto es innecesario, porque los datos del mismo son iguales... o al compilador JIT (Just in time) de .NET, que compila el código la primera vez que es necesario, pero, luego ya no hace sino ejecutar el código previamente compilado...

Mecanismos de optimización que van más allá de mi conocimiento, pero, que, deben existir, pues de lo contrario se vería enseguida, se notaría la diferencia y bastante además, ya digo.

Pensad en que la clase Xhtml no va sola... que se apoya en otra clases (de algún modo) y antes de su declaración puede verse:

Código PHP:

<?php

require(DIR_LIBS.'captcha.class.php');
require(
DIR_LIBS.'filtros.class.php');
require(
DIR_LIBS.'servidor.class.php');
require(
DIR_LIBS.'etiquetas.class.php');
require(
DIR_LIBS.'validarex.class.php');
require(
DIR_LIBS.'compresion.class.php');
require(
DIR_LIBS.'administrar.class.php');

class 
XHtml


  
/* ... */

Estas clases son mucho menos pesadas (del orden de 10 KB ó menos), pero, lo cierto es que ahí están... y, como digo, Loturak no carga "lenta" ni noto "en local" un excesivo consumo de recursos o algo parecido... ¡qué sé yo! Alguien tiene que explicarnos esto. :D

Edito: Me doy cuenta ahora de que acaso he mezclado churras con merinas en parte de lo que he dicho, pero, no voy a buscarle las vueltas, porque, me parece que se entiende lo que más o menos quiero explicar. Ea. ¡Saludos! :D

roman 05-09-2006 04:47:13

Claro que en mucho dependerá lo que se desee hacer. Ciertamente hay clases por ahí tremendamente grandes pero también sé de varias de ellas que a la larga han tenido que refactorizar y dividirse en partes. Ahora, ciertamente quizá me "asusto" sin razón pero el caso es que alguna vez pregunté algo relacionado con la velocidad en MaestrosDelWeb y nadie pareció saber la respuesta. No al menos para el ambiente que tenían en mente y que era uno de accesos de entre 600 y 800 personas simultaneas (real). En ese entonces quería probar con un sistema de plantillas, no smarty que me parece conceptualmente estúpido, sino con algún otro. Pero me entró el temor de que tantos accesos simultáneos cargando cada uno clases de cientos o miles de líneas, no dieran el ancho, y como no podía darme el lujo de experimentar y que fallara, pues aun no lo he probado.

En fin, claro que cabe la posibilidad de que esté mal informado y que php (y apache y el servidor) puedan manejar muchos elefantes simultáneos, pero la realidad es que no lo sé.

Ahora bien, dejando de lado las consideraciones de eficiencia, también me pregunto yo sí a la larga no resulta difícil de manejar y entender una clase tan amplia.

// Saludos

dec 05-09-2006 12:50:51

Hola,

Cita:

Empezado por Román
Ahora bien, dejando de lado las consideraciones de eficiencia, también me pregunto yo sí a la larga no resulta difícil de manejar y entender una clase tan amplia.

Bueno. Es probable que eso ocurra, pero, en el caso de las clases de Loturak de que venimos hablando, hay que tener en cuenta la idiosincracia de las mismas.

La clase Xhtml, que es la más "pesada", en realidad ni siquiera llega a instanciarse (lo que puede tener que ver con lo que estamos hablando: acaso de instanciarse otro gallo cantaría), pero, únicamente cuenta con métodos estáticos.

Es una manera de "encapsular", de "tener a buen recuado" las funciones que tratan con el código XHTML de la aplicación, es por comodidad, básicamente, pero, ya digo: no es compleja, porque no tiene más que métodos (funciones) listas para utilizar.

Estaría bien que alguien que supiera nos contara un tanto sobre todo esto. Resulta interesante. :)


La franja horaria es GMT +2. Ahora son las 02:54:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi