Donde se crea el nuevo objeto de la clase de mi modulo?

Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Número de respuestas: 13
No sé en que archivo se crea el nuevo objeto de la clase de la que dependerá mi módulo. Es decir, si tengo "mimodulo" en muchas partes del codigo aparece $mimodulo->id, por ejemplo. $mimodulo se supone que es un objeto. Pues mi pregunta es que donde se ha creado.

Les agradecería un poco de ayuda.
Gracias
Promedio de valoraciones: -
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
La información de cada nueva instancia del objeto módulo se guarda en la base de datos, en la tabla course_modules que enlaza con la tabla general modules.
En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Hola Xavier,
Te agradezco la respuesta. Mi problema ahora es que en mi módulo php, al margen de moodle, yo trabajo con mi clase en donde tengo variables públicas que luego requiero a través del SESSION en las diferentes páginas. La forma en que lo utilizo es la siguiente:

//archivo1.php
$translating= new translationtool_search($page); // donde instancio
$_SESSION['translating'] = $translating; //Donde guardo el objeto con el session

//archivo2.php
session_start();
$translating = $_SESSION['translating']; //Aquí recupero el objeto anterior

De esta manera entre diferentes páginas soy capaz de recuperar variables propias del objeto, por decirlo de alguna manera globales.
Cuando instalo el módulo en moodle esto deja de funcionar. Supongo que puede ser porque moodle crea una sesión que entra en conflicto con la sesión con la que intento trabajar de mi código.

¿Cómo puedo pasar el objeto a través de diferentes páginas para poder trabajar con sus variables. O lo que sería parecido, cómo podría pasar las variables directamente entre mis archivos .php para acceder a la información que necesito?

Muchas gracias
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
La guía de estilo de moodle para programadores te dice que no debes crear nuevas variables globales, sino que debes usar la ya existentes, a saber: $SESSION, $THEME, $CFG, $SITE, $COURSE y $USER.

Como bien dices, es posible que la variable de sesión de Moodle entre en conflicto con la que tu declaras. Podrías intentar usar $SESSSION.

Basta con incluir el archivo config.php y a continuación declarar $SESSION como global para poder acceder a su contenido. Sería algo parecido a esto:

//archivo1.php
global $SESSION;
$translating= new translationtool_search($page);
$SESSION->translating = $translating;

//archivo2.php
global $SESSION;
$translating = $SESSION->translating;

Supongo que para poder hacer esto tendrás que estar "dentro" de moodle, es decir, que el usuario tiene que haber iniciado la sesión. Además debes acordarte de eliminar la variable cuando no la vayas a usar más, ya que así ahorras recursos.

En cualquier caso, si la información del objeto que se instancia en el módulo es importante, tal vez deberías valorar la posibilidad de guardarla en las tablas de la base de datos pertenecientes al módulo, para poder recuperar los datos fácilmente.
En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Ciertamente sí había leido esto en la guia de programadores, pero tengo tan poca idea que no había sabido relacionarlo con el caso que me ocupaba.

Los datos no son importante ni tienen que perdurar, pero sí que son necesarios como información para actualizar el estado de la traducción. Por lo que he leido en su contestación, siendo así, supongo que lo mas adecuado sería pasar los datos por las variables globales, por favor corríjame si no es acertado. ¿Debo suponer también que utilizar las variables globales de moodle es habitual, o no es muy convencional?.

En cuanto al método de guardarlo en la base de datos me parece super ingenioso y no se me había ocurrido.

Mañana intentaré implementar mi código con las variable globales.

Un saludo, es ud. muy amable
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
Me puedes tutear, que no soy tan viejo... guiño

No es lo habitual usar variables globales, aunque tampoco está prohibido. Quiero decir, que todo depende del programador y de como estructure su código.

En algunosos casos, en vez de crear dos scripts y operar de uno a otro, a veces es posible crear una clase que contenga las operaciones realizadas en uno de los scripts, e instanciarla en el otro.

De esta manera, tienes la instancia del objeto en un ámbito más accesible y al mismo tiempo puedes hacer uso de todas las operaciones que realizabas en el otro script.

Repito, que todo depende del programador. Supongo que siempre existe más de una solución posible para el mismo problema.

En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Hola de nuevo,
He introducido los cambios en archivo1.php y archivo2.php tal y como me indicaste pero sigue sin funcionar, y supongo que será porque se me ha pasado algo por alto, a ver si puede ser por esto:

tengo archivo1.php que es donde hago la instancia
archivo.class.php que es donde defino la clase sus variables y métodos
archivo2.php que es llamado desde un formulario de archivo.class.php y que tiene que obtener las variables globales de la clase y que despues vuelve a llamar a una funcion de la clase. Despues en el mismo formulario volveriamos a hacer el submit a archivo2.php y así hasta dar a finalizar.
Además mi modulo se llamaría translationtool.

Mis preguntas:
1) si en archivo1.php llamo al metodo de la clase lo tengo que escribir así:
//archivo1.php
global $SESSION;
$translating= new translationtool_search($page);
$SESSION->translating = $translating;
$translating->translationtool_taketag(); //forma 1
$SESSION->translating->translationtool_taketag(); //forma 2

2) en mi clase cuando normalmente hago referencia a mis variables como quedarían:
//archivo.class.php
global $SESSION;
$var=1; //variable "normal" forma1
$SESSION->translating->var=1; //forma2 esta supongo que se haría como la forma1

$this->data=1; //variable publica forma1
$SESSION->this->data=1; //forma 2

3) en el archivo2.php cuando vuelvo a llamar al método de la clase:
//archivo2.php
global $SESSION;
$translating = $SESSION->translating;
$translating->translationtool_taketag(); //forma 1
$SESSION->translating->translationtool_taketag(); //forma 2

Espero que la pregunta no sea demasiado obvia, para mi desde luego que no.

Muy agradecido, Iván


En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Una duda más que antes había pasado por alto. Si mi módulo se llama translationtool, al usar session no sería de esta forma:

global $SESSION;
$translating= new translationtool_search($page);
$SESSION->translationtool->translating=$translating;

He pensado que podía ser así porque en teoría cuando se inicia la sesion se crea para la nueva actividad ese nuevo módulo, corrigeme si me equivoco por favor.
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
Es posible que me equivocara, y $SESSION no sea un objeto sino un array asociativo. Haz un var_dump($SESSION) para saber si es objeto o array.

En caso de que sea objeto, creo que no podrás hacer $SESSION->translating->translationtool_taketag(), por poner un ejemplo, porque PHP no sabrá a que te estás refiriendo.

Tendrías que sacar el objeto de $SESSION y a partir de ahí, operar con el. Esto es:

$translating = $SESSION->translating;
$datos = $translating->translationtool_taketag();

Por otro lado, recuerda que tienes que incluir el archivo "config.php", que es el que te da acceso a $CFG y compañía.

En cuanto a las relaciones entre los archivos que has mencionado, no termino de aclararme ¿qué hace o qué intentas que haga exactamente tu módulo? te lo digo porque tengo la ligera impresión de que tal vez te estés liando un poco en cuanto al diseño y la implementación del módulo.
En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Intentaré explicarte lo que pretendo. La cuestion es que fuera de moodle funciona a la perfección, pero bueno...
Mi módulo se encargaría de meter en un array( _array) una página web con la función file().
En este array mi programa tendría que ir buscando texto que aparece en dicha página, aislarlo en otro array (data), y modificarlo mediante cajas de texto en un formulario. de lo que se modifica en la caja de texto, recolocarlo nuevamente en _array que es la página web a modificar, y así sucesivamente hasta completar, momento es que _array ya modificado se vuelca a un archivo, y obtenemos la misma página pero con el texto modificado.
Espero haber sido claro, al menos lo he intentado sonrisa .

Supongo que comentas que probablemente me esté liando porque quizas no sería necesaria la utilización de clases en mi módulo. La verdad es que me lo estoy planteando, y cuando quiera guardar o cargar variables hacerlo a través de SESSION, que creo que si que es un array.

Comentame si te parece buena idea por favor.
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
Suele pasar que fuera funcione y dentro de Moodle tenga problemas. Por mi experiencia hay que enfocarlo desde el punto de vista contrario. Hay que partir el desarrollo directamente desde dentro, con las herramientas que da Moodle, sino luego es muy complicado insertarlo. De todas formas, cuando te preguntaba por la función de tu módulo, no me refería tanto a los detalles técnicos, sino a la función general ¿es un módulo que traduce páginas web?

En cuanto a la implementación, como dije antes, cada maestrillo tiene su librillo, pero yo en este caso creo que lo más adecuado podría ser un formulario autoprocesado. Es decir, un formulario que si va por GET, carga la pagina web en el array, busca el texto y lo vuelca en la caja de texto. Si va por POST, procesa el contenido de la caja de texto, carga de nuevo la página, realiza la sustitución de las líneas y vuelca el contenido del array en el nuevo fichero.

De esta forma te ahorrarías el paso de variables por sesión, ya que todo se haría en el mismo sitio. En algún lugar tendrías que apuntar las líneas que se modifican y almacenan, para luego poder restaurarlas adecuadamente (¿campos hidden en el formulario, tal vez?)
En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Bueno no se trata de un módulo que traduce páginas, sino de un módulo que aisla el texto editable de las páginas para que traductores (personas) puedan modificarlo fácilmente.

Disculpame, pero no he entendido bien como se implemetaría el formulario autoprocesado. supongo que se trata de un formulario normal, que hace ciertas "cosas". Pero no he entendido cómo desde el form se podría cargar el array. ¿Quizas te puedes referir poniendo el el action la propia página?. Te agradecería que me enseñaras un ejemplo muy simple para poder hacerme una idea.

Muchas gracias Xavier
En respuesta a Ivan Blanco

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Xavier Paz -
Los formularios normales mandan los datos a otro script para que los procese y responda. Los formularios autoprocesados simplemente hacen todo en el mismo sitio. Sería algo así como..

If ($_POST){
      procesa el contenido de la caja de texto.
      carga de nuevo la página.
      realiza la sustitución de las líneas.
      vuelca el contenido del array en el nuevo fichero.
}else if ($_GET){
          carga la pagina web en el array.
          busca el texto.
          lo vuelca en la caja de texto.
          muestra caja de texto.
}

Es posible que tengas que pasarle algún tipo de parámetro en el caso de GET, para que sepa qué página cargar.

Por otro lado, tras leer tu descripción del módulo, estaba pensando que tal vez te podrías basar en un mecanismo que ya existe dentro de Moodle. Me refiero al botón Activar Edición. Creo que el enfoque sería parecido. Te explico:

Tu muestras ese botón en las páginas que quieras editar, y cuando el usuario lo pulse, procesas la página, aislas los textos editables y los cargas en un formulario para que el usuario los modifique. Cuando termine, pulsa enviar y procesas el contenido del formulario para crear el nuevo fichero de la página con el contenido actualizado.

Técnicamente, ese botón sería un formulario, con un campo hidden cuyo contenido sería el nombre del fichero actual en uso. De esta manera, cuando se pulsa el botón, se manda ese dato y se puede cargar y procesar la página adecuada.






En respuesta a Xavier Paz

Re: Donde se crea el nuevo objeto de la clase de mi modulo?

de Ivan Blanco -
Muchas gracias Xavier. Desde luego que moodle tiene herramientas muy interesantes pero desde luego el mérito lo tienes en saber en que momento utilizarlas. Me voy a poner con ello a ver que tal.

Gracias de nuevo