Cambiar password de Usuario desde el ACP

Foro de debate para los escritores de MOD, sobre MOD en Desarrollo.

Moderador: Personalizaciones de Extensiones

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Jue Jul 14, 2011 9:19 pm

Patrocinador

Bueno, primero os digo lo que tengo: (clase php)

Código: Seleccionar todo

case 'password_strong':
                /* $sql_ary = "";
                 $username = "";*/
		if (!$username && !$user_id)
		{
			$template->assign_vars(array(
				'U_ACTION'		=> $this->u_action,
				'S_SELECT_USER'		=> true,
				'U_FIND_USERNAME'	=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=select_user&field=username&select_single=true'),
                        ));
			//return;
		}
                
                $data = array(
                        'new_password'		=> request_var('new_password', '', true),
                        'password_confirm'	=> request_var('password_confirm', '', true),
                );
                $template->assign_vars(array(
				'NUEVA_CONTRASEÑA'		=> $data['new_password'],
				'NUEVA_CONTRASEÑA_CONFIRMAR'	=> $data['password_confirm'],
		));
                /*if (!$data){
                    $update_password = ($data['new_password'] && !phpbb_check_hash($user_row['user_password'], $data['new_password'])) ? true : false;
                    if ($update_password)
                    {
                            $sql_ary += array(
                                    'user_password'		=> phpbb_hash($data['new_password']),
                                    'user_passchg'		=> time(),
                                    'user_pass_convert'	=> 0,
                            );

                            $user->reset_login_keys($user_id);
                            add_log('user', $user_id, 'LOG_USER_NEW_PASSWORD', $user_row['username']);
                    }
                    if (sizeof($sql_ary))
                    {
                            $sql = 'UPDATE ' . USERS_TABLE . '
                                    SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
                                    WHERE user_id = ' . $user_id;
                            $db->sql_query($sql);
                    }
                    add_log('admin', 'LOG_USER_USER_UPDATE', $data['username']);
                }*/
                
                break;
Plantilla:

Código: Seleccionar todo

    <form id="select_user" method="post" action="{U_ACTION}">
        <fieldset>
                <legend>{L_SELECT_USER}</legend>
        <dl>
                <dt><label for="username">{L_FIND_USERNAME}:</label></dt>
                <dd><input class="text medium" type="text" id="username" name="username" /></dd>
                <dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd>
                <dd>&nbsp;</dd>
                <dt><label for="password">{L_NEW_PASSWORD}:</label></dt>
                <dd><input class="text medium" type="text" id="new-password" name="new-password" /></dd>
                <dd>&nbsp;</dd>
                <dt><label for="password_confirm">{L_NEW_PASSWORD_CONFIRM}:</label></dt>
                <dd><input class="text medium" type="text" id="new-password_confirm" name="new-password_confirm" /></dd>
                
        </dl>

        <p class="quick">
                <input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
        </p>
        </fieldset>
        <div>{NUEVA_CONTRASEÑA}</div><div>{NUEVA_CONTRASEÑA_CONFIRMAR}</div>
    </form>
En esta parte saco los datos de la caja de selección de usuario (La he sacado de acp_users.php) aparentemente la caja sale bien, el botón de encontrar miembro también, por tanto dispongo de la caja de texto, le añadí dos input para poner la password (aunque no valida aún si es la misma en los 2)

En el php con el "request_var" supongo que estoy sacando las variables de los inputs de password que os he dicho y quiero mostrarlas para ver si se envían correctamente de ahí el <div>{Nueva_contraseña}... pero claro, mi principal problema es que quiero enviar como formulario, y dispongo del formulario pero no se como enviar esos datos a la misma página.

PD: La parte comentada en la clase la saque de acp_users.php, y creo que me puede servir, aunque no estoy muy seguro aún. Se admiten ideas y enlaces con información donde construir Sentencias SQL :)

Edito: Encontré esto para construir sentencias sql! http://wiki.phpbb.com/Dbal.sql_build_query

Bueno un saludo!

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Leviatan21 » Jue Jul 14, 2011 11:31 pm

A todo esto : ¿Cual es la pregunta ?
Juanla escribió:En el php con el "request_var" supongo que estoy sacando las variables de los inputs
No, no es así, tu haces

Código: Seleccionar todo

request_var('new_password', '', true)
y

Código: Seleccionar todo

request_var('password_confirm', '', true)
pero los campos tienen otros nombres

Código: Seleccionar todo

<input class="text medium" type="text" id="new-password" name="new-password" />
y

Código: Seleccionar todo

<input class="text medium" type="text" id="new-password_confirm" name="new-password_confirm" />
El primer parámetro del la función request_var debe ser el name ( y de los id) de los imputs
Y si quieres pasarlos a las plantillas ya lo estas haciendo con :

Código: Seleccionar todo

			$template->assign_vars(array(
                'NUEVA_CONTRASEÑA'      		=> $data['new_password'],
                'NUEVA_CONTRASEÑA_CONFIRMAR'   => $data['password_confirm'],
          	));
Supongo que la mejor manera será tomar esas 2 variables y colocarlas como value de los imputs

Código: Seleccionar todo

 value="{NUEVA_CONTRASEÑA}"
y

Código: Seleccionar todo

value="{NUEVA_CONTRASEÑA_CONFIRMAR}"
pero lo que no estoy seguro es que reconozca las variables con Ñ
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Vie Jul 15, 2011 10:06 am

Vale, fallo mío lo de las variables, la pregunta era como construir el formulario, si con el if($submit) bastaría, porque tengo uno y no va, ahora me pondré un poco más con ello, pero no puedo mirarlo porque lo tengo en 000webhost y programo con netbeans por ftp.. y parece que no carga el foro T_T, si no cuando vuelva seguiré :)

Gracias por contestar.

Por cierto el código comentado, según entiendo:

Código: Seleccionar todo

$data = array(
                        'new_password'		=> request_var('new-password', '', true),
                        'password_confirm'	=> request_var('new-password_confirm', '', true),
                );
Con esto recibo los 2 campos del formulario y los guardo en $data['new_password'] y $data['password_confirm'].

Código: Seleccionar todo

if (!$data){
                    $update_password = ($data['new_password'] && !phpbb_check_hash($user_row['user_password'], $data['new_password'])) ? true : false;
                    if ($update_password)
                    {
                            $sql_ary += array(
                                    'user_password'		=> phpbb_hash($data['new_password']),
                                    'user_passchg'		=> time(),
                                    'user_pass_convert'	=> 0,
                            );

                            $user->reset_login_keys($user_id);
                            add_log('user', $user_id, 'LOG_USER_NEW_PASSWORD', $user_row['username']);
                    }
                    if (sizeof($sql_ary))
                    {
                            $sql = 'UPDATE ' . USERS_TABLE . '
                                    SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
                                    WHERE user_id = ' . $user_id;
                            $db->sql_query($sql);
                    }
                    add_log('admin', 'LOG_USER_USER_UPDATE', $data['username']);
                } 
Con esto compruebo si se han recibido los datos (si data tiene valor), este trozo lo fui recortando de acp_users.php . La primera línea no tengo muy claro lo que hace, se vuelve true la variable si $data['new_password'] existe y no es igual a la que ya tenía el usuario (supongo), si es true, construye (sql_ary) que parece que son unos parámetros para luego ejecutar el update más abajo, donde construye el hash de la password, la fecha de cuando se cambio la password y el otro campo no se que será :P.
Luego hace un reset_login_keys del userid, que será una especie de "limpiar caché" de ese usuario y añade una línea al log con la ifnormación. Y si se ha creado sql ary (último if) ejecuta el update y añade otra línea al log.

Me gustaría saber si puedo usar este código tal y como está, (creo que tengo que añadir un trozo de código con el $user_row (ya investigaré), pero si con este código puedo cambiar la password de usuario o me recomendáis que me construya yo mismo el código sql?

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Leviatan21 » Vie Jul 15, 2011 1:03 pm

Juanla escribió:Con esto compruebo si se han recibido los datos (si data tiene valor), este trozo lo fui recortando de acp_users.php
Aqui veo un error,

Código: Seleccionar todo

if (!$data)
siempre dará si, porque en realidad es un array y aunque el usuario no haya enviado el formulario tiene 2 columnas con o sin valores, si lo imprimes verás esto :

Código: Seleccionar todo

$data = array('new_password' => '','password_confirm' => '',);
Para saber si el formulario fue enviado debes averiguar si se pulsó el botón enviar :

Código: Seleccionar todo

$submit		= (isset($_POST['submituser'])) ? true : false;
y luego averiguar si el array $data tiene valores
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Vie Jul 15, 2011 9:39 pm

Me gustaría comunicar que he conseguido ya lo que quería :) Ahora voy a ver como hago para avisar por e-mail al usuario al que hemos cambiado la password, no vaya a ser que se moleste porque no lo hagamos :P

Espero que no me de mucho más problema eso, para terminar esa parte ya :)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Sab Jul 16, 2011 9:36 am

Bueno, ya he acabado una primera parte, pero ahora antes de terminar esa parte del mod, me gustaría añadir una característica nueva, consiste en cuando activas una opción en el ACP con esto (lo he sacado y adaptado de otro mod):

Código: Seleccionar todo

    	<legend>{L_PHPBBSPS_CONFIG}</legend>
	<dl>
		<dt><label for="phpbbsps_enable">{L_PHPBBSPS_ENABLE}:</label></dt>
		<dd><label><input type="radio" class="radio" name="phpbbsps_enable" value="1"<!-- IF PHPBBSPS_ENABLE --> id="phpbbsps_enable" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
		<label><input type="radio" class="radio" name="phpbbsps_enable" value="0"<!-- IF not PHPBBSPS_ENABLE --> id="phpbbsps_enable" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
	</dl>
Al activar esto a Yes me gustaría que algo que pondré en upc_register.html se mostrara, si esta no, no se mostrará, sé que se hace con un <!-- IF PHPBBSPS_ENABLE --> y meto ahí lo que quiero (que se lo que es y lo tengo "preparado"). Pero no se
si tengo que crear un campo en la base de datos para guardar esa configuración o se hace de otra forma.

Tampoco sé si las variables a la plantilla ( el PHPBBSPS_ENABLE ) se envían igual que he enviado todas las demás con el $template->assign_vars, supongo que no, tendría que definir en algún sitio que esa variable vaya al ucp_register.html no?

Es lo que me queda para terminar con las passwords :) porque puedo añadir el código pero no "condicionalmente".

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Sab Jul 16, 2011 1:23 pm

Bueno, leyendo un poco más entendí la función "set_option" y creo que he avanzado algo más, siento ser un poco plasta pero me gusta entender las cosas :roll:

Código: Seleccionar todo

if($submitpasschecker){
                    set_config('phpbbsps_enable', request_var('phpbbsps_enable', 0));
                    //set_config('so_status', request_var('so_status', 0));
                    trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
                }
                $template->assign_vars(array(
                'PHPBBSPS_ENABLE'      => $config['phpbbsps_enable'],
                //'SO_STATUS'      => $config['so_status'],
                ));
Tengo eso en la clase php, en el index concretamente, ahora mismo funciona así de maravilla, pero la primera vez como es lógico me daba un error "undefined index 'phpbbsps_enable'" lo veo obvio el error porque el if no se ejecuta a la primera nunca, por lo tanto el campo no existía aún. Dije de meter lo de $template dentro del mismo if, pero claro, para ejecutarlo una primera vez si tiene sentido, pero a partir de ahí no, porque no te guarda el estado si no es cuando envías el submit, lo cual no es útil xd

Quiero saber cual sería la forma más correcta de poner esto. He mirado algunos mods y lo tienen como dejo arriba, pero eso es un problema bajo mi punto de vista al menos hasta que lo logras ejecutar una vez. A no ser claro que en install.xml crees el campo sql o te lo cree un install.php (cosas que no he visto en uno de los mods que he mirado)

Gracias y un saludo! Me alegra ir avanzando con esto :)

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Leviatan21 » Sab Jul 16, 2011 1:39 pm

siempre me gustó hacerlo de esta masera, consultando si la variable existe, caso contrario le doy el valor que debe ser :

Código: Seleccionar todo

'PHPBBSPS_ENABLE'      => (isset($config['phpbbsps_enable']) ? $config['phpbbsps_enable'] : false,
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Juanla » Sab Jul 16, 2011 2:54 pm

Leviatan21 escribió:siempre me gustó hacerlo de esta masera, consultando si la variable existe, caso contrario le doy el valor que debe ser :

Código: Seleccionar todo

'PHPBBSPS_ENABLE'      => (isset($config['phpbbsps_enable']) ? $config['phpbbsps_enable'] : false,
He borrado la columna que ya tenía para probar lo que me pusiste y este es el resultado de nuevo:

Código: Seleccionar todo

 on line 56: Undefined index: phpbbsps_enable
Te dejo aquí como lo tengo, también netbeans me lo detecta como error (no error grave).
Imagen

Por último, si esto:

Código: Seleccionar todo

<!-- IF PHPBBSPS_ENABLE --> checked="checked"<!-- ENDIF -->
funciona en el ACP correctamente, para usar el mismo comodín en las plantillas normales de prosilver tengo que hacer algo? he estado probando y no me funcionaba :?:

Y gracias de nuevo!

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Cambiar password de Usuario desde el ACP

Mensaje sin leer por Leviatan21 » Sab Jul 16, 2011 3:02 pm

Juanla escribió:He borrado la columna que ya tenía para probar lo que me pusiste y este es el resultado de nuevo:
Perdón, falta cerrar un paréntesis :

Código: Seleccionar todo

        'PHPBBSPS_ENABLE'      => (isset($config['phpbbsps_enable'])) ? $config['phpbbsps_enable'] : false,
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Responder