• ¡Bienvenido a XenFácil!

    Estás viendo el sitio como Invitado. Para poder participar en este sitio

    y obtendrás privilegios adicionales, acceso a otras áreas y mucho mas.

    ¡Es gratis!


    ¿Ya eres miembro? Inicia sesión

Solucionado Crear una página que lea de la base de datos

Estado
Cerrado para nuevas respuestas

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
No sé por qué no me iba ayer, creo que lo había hecho así :/

Y si quiero poder pasarle 'test_id' y que haga una ruta tipo test_name.test_id? Lo hice así en otra (con un LinkWithIntegerParam) e iba, pero no sé por qué ahora no.

EDITO: Listo, ya está.
Sólo hay que hacer esto y pasarle de nuevo el parámetro en el prefix (como estaba antes).
Insertar CODE, HTML o PHP:
        $test = $this->_input->filterSingle('player', XenForo_Input::UINT);
 
        $this->canonicalizeRequestUrl(
            XenForo_Link::buildPublicLink('test', $testData, array('test' => $test))
        );

Siendo $testData la fila de la id que recibiste de la ruta.
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
¿Cómo va lo de escribir en la db? Usando el datawriter de user, cuando la tabla usa user_id me va perfectamente. Sin embargo, cuando uso mi datawriter con el mismo código pero cambiando la primary key que se lee, da error.

Este es mi datawriter
Insertar CODE, HTML o PHP:
<?php
class XenForo_DataWriter_Test extends XenForo_DataWriter
{     
    protected function _getFields()       
    {
        'xf_test' => array(
                'test_id'      => array('type' => self::TYPE_UINT),
                'int'        => array('type' => self::TYPE_UINT),
                'string'          => array('type' => self::TYPE_STRING)
            )
    }
 
    protected function _getExistingData($data)
    {
        if (!$testId = $this->_getExistingPrimaryKey($data, 'test_id'))
        {
            return false;
        }
        return array('xf_test' => $this->_getTestModel()->getTeamByUser($testId));
    }
   
    protected function _getUpdateCondition($tableName)
    {
        return 'test_id = ' . $this->_db->quote($this->getExisting('test_id'));
    }
 
    protected function _getTestModel()
    {
        return $this->getModelFromCache('XenForo_Model_Test');
    } 
}

Y estas las acciones del controller
Insertar CODE, HTML o PHP:
    public function actionTestString()
    {
        $visitor = XenForo_Visitor::getInstance();
        if (!$visitor->get('test_id')) {
            return $this->responseError(new XenForo_Phrase('cannot_change_string'));
        }
 
        // return the response
        return $this->responseView('XenForo_ViewPublic_Test_Empty', 'Test_changeTestString', array());
    }
   
    public function actionTestStringUpdate()
    {
        $visitor = XenForo_Visitor::getInstance();
        if (!$visitor->get('test_id')) {
            return $this->responseError(new XenForo_Phrase('cannot_change_string'));
        }
        $testId = $this->_input->filterSingle('test_id', XenForo_Input::UINT);   
 
        // parse input parameters
        $input = $this->getInput();
        $string = $input->filterSingle('string', XenForo_Input::STRING);
        $viewParams = array(
            'string' => $string,
            'test_id' => $testId
        );
 
        $errors = array();
        if ($string == $visitor->get('string'))
        {
            $errors['string'] = new XenForo_Phrase('string_is_the_same');
        }
 
        $writer = XenForo_DataWriter::create('XenForo_DataWriter_Test');
        $writer->setExistingData($visitor->get('test_id'));
        $writer->set('string', $string);
 
        $writer->save();
 
        return $this->responseRedirect(
            XenForo_ControllerResponse_Redirect::SUCCESS,
            XenForo_Link::buildPublicLink('Test'),
            null,
            $viewParams
        );
    }

El template ya no lo pego, descarté que sea eso ya que con el otro datawriter va bien :)
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
La función _getFields() la tienes mal. Cámbiala por:
Insertar CODE, HTML o PHP:
    protected function _getFields() 
    {
        [COLOR=#0000ff][B]return array([/B][/COLOR]
              'xf_test' => array(
                        'test_id'      => array('type' => self::TYPE_UINT),
                        'int'        => array('type' => self::TYPE_UINT),
                        'string'          => array('type' => self::TYPE_STRING)
            )
      [B][COLOR=#0000ff] );[/COLOR][/B]
    }
Ya que tu función no devuelve nada.

Salud2
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
¿Y cambiando en la función por esto?
Insertar CODE, HTML o PHP:
    public function actionTestStringUpdate()
    {
        [COLOR=#0000ff][B]$testId = $this->_input->filterSingle('test_id', XenForo_Input::UINT);[/B][/COLOR]
        $visitor = XenForo_Visitor::getInstance();
        if (!$visitor->get([COLOR=#0000ff][B]$testId[/B][/COLOR])) {
            return $this->responseError(new XenForo_Phrase('cannot_change_string'));
        }
        [S][COLOR=#ff0000][B]$testId = $this->_input->filterSingle('test_id', XenForo_Input::UINT);[/B][/COLOR][/S]
...

Salud2
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Hecho. Dejándolo entra siempre en el if y devuelve el error, cambiando la condición por la contraria (sin el !) me da el mismo error que antes.

Me da un error de javascript, me dice que mire la consola para ver el error exacto. ¿Dónde lo puedo consultar? Creo que aceleraría mucho la localización del error.


Oh, y una chorradita que recordé. ¿Os funciona la propiedad alt en las imágenes? Es que no me va ni pasándole una xen:phrase ni poniéndolo diréctamente.
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Hecho. Dejándolo entra siempre en el if y devuelve el error, cambiando la condición por la contraria (sin el !) me da el mismo error que antes.
Eso es que no tienes el 'test_id' en la página y no lo lee por lo que recibes error.
Me da un error de javascript, me dice que mire la consola para ver el error exacto. ¿Dónde lo puedo consultar? Creo que aceleraría mucho la localización del error.
Este tipo de errores los miro con firebug en firefox (es una extensión) que también está para opera y chrome.

Oh, y una chorradita que recordé. ¿Os funciona la propiedad alt en las imágenes? Es que no me va ni pasándole una xen:phrase ni poniéndolo diréctamente.
No siempre, pero esto depende del navegador más que de XenForo.

Salud2
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Buenísimo el addon, ya encontré el fallo del JS. Estaba usando tipos no declarados por XenForo en el getFields (TYPE_DECIMAL, TYPE_UINT, que no funcionan). Ahora revisaré el código para ver dónde me olvidé de pasarle la variable y ya debería funcionar :)

Gracias!
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Una dudilla.. cómo le especifico qué tabla debe editar? Si en el _getFields() tengo un array que lee de 4 tablas, ¿cómo le especifico que quiero que el writer modifique la tabla que yo quiero? Creo que ese es el problema, ya que el js ya carga la información que quiero pero después no la salva, supongo que será cosa de que no selecciona bien la tabla.
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Una solución es cargar la información de las tres tablas restantes y luego salvar las cuatro tablas a la vez con las modificaciones hechas a la cuarta tabla.

Es algo menos complejo y al guardar algo que ya está es como si no lo hubieras tocado.

Salud2
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
¿Pero sabes cómo se selecciona? Intenté pasarle la tabla en la función update, pero no va. Ayer hasta probé a hacer un datawriter específico para esa tabla, pero no me funcionó, voy a echarle otra vez un ojo a esto ahora que sé que el resto va bien.

En este momento "sólo" uso 4 tablas, pero ya son sobre 50 campos. Si cada usuario tiene que modificar eso cada vez que quiera actualizar tan sólo un campo, el bajón de rendimiento puede ser grande. Siempre intento hacer las consultas muy concisas para agilizar la web, pero ahora mismo estoy perdido por lo de la tabla.
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Bueno, con un datawriter específico para esa tabla va. Me interesaría saber cómo seleccionar la tabla directamente en la consulta para usar un datawriter por cada controlador, pero vaya, mientras tanto si a alguien le pasa lo mismo, es un buen parche.
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
¿Pero sabes cómo se selecciona? Intenté pasarle la tabla en la función update, pero no va. Ayer hasta probé a hacer un datawriter específico para esa tabla, pero no me funcionó, voy a echarle otra vez un ojo a esto ahora que sé que el resto va bien.

En este momento "sólo" uso 4 tablas, pero ya son sobre 50 campos. Si cada usuario tiene que modificar eso cada vez que quiera actualizar tan sólo un campo, el bajón de rendimiento puede ser grande. Siempre intento hacer las consultas muy concisas para agilizar la web, pero ahora mismo estoy perdido por lo de la tabla.
No. No me has entendido. Pones los campos que va a actualizar el user. Luego en el controller, cargas los datos desde la BD para las otras tablas y guardas todo a la vez con ese datawritter.

Es más cómodo para ti.

Salud2
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Si entendi bien, te refieres a cargar todo desde la db (un select * de las tablas del datawriter), en el controlador actualizo en el array los campos que quiero y lo guardo.

Si es así, le veo 2 problemas: campos de tablas distintas con el mismo nombre (por ejemplo name en test y user) y que aunque el usuario no lo tenga que actualizar, para cambiar un dato la consulta guarda x campos en y tablas.
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Entonces, lo único que puedes hacer es crear un datawritter para cada tabla. Leerla y escribir las modificaciones.

Salud2
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Si, por ahora voy a ir tirando así, total un datawriter poco código tiene y no es un problema, ya que puedo utilizar un controlador y modelo único para varias tablas. Además, que no creo que escriba en todas las tablas y sólo necesito un datawriter específico en esas, en las de sólo lectura con uno para todas es suficiente :)

PD: En serio, el firebug es genial, debuggear la web así es facilísimo :D
 

SmauG

XenForoUser
Mensajes
86
Puntuación de reacciones
9
Puntos
8
Tengo un problema bien gordo.. No sé qué pasó, pero de repente (iba bien, no toqué nada) el foro no me va, me da este error:

Insertar CODE, HTML o PHP:
An exception occurred: Mysqli statement execute error : Prepared statement needs to be re-prepared in /home/wgm/public_html/test/library/Zend/Db/Statement/Mysqli.php on line 214
[LIST=1]
[*][B]Zend_Db_Statement_Mysqli->_execute()[/B] in [B]Zend/Db/Statement.php[/B] at line [B]317[/B]
[*][B]Zend_Db_Statement->execute()[/B] in [B]Zend/Db/Adapter/Abstract.php[/B] at line [B]479[/B]
[*][B]Zend_Db_Adapter_Abstract->query()[/B] in [B]Zend/Db/Adapter/Abstract.php[/B] at line [B]808[/B]
[*][B]Zend_Db_Adapter_Abstract->fetchPairs()[/B] in [B]XenForo/Model/DataRegistry.php[/B] at line [B]144[/B]
[*][B]XenForo_Model_DataRegistry->_getMultiFromDb()[/B] in [B]XenForo/Model/DataRegistry.php[/B] at line [B]97[/B]
[*][B]XenForo_Model_DataRegistry->getMulti()[/B] in [B]XenForo/Dependencies/Abstract.php[/B] at line [B]134[/B]
[*][B]XenForo_Dependencies_Abstract->preLoadData()[/B] in [B]XenForo/FrontController.php[/B] at line [B]125[/B]
[*][B]XenForo_FrontController->run()[/B] in [B]/home/wgm/public_html/test/index.php[/B] at line [B]13[/B]
[*][B][/B]
[/LIST]

EDITO: Arreglado, tal como vino se fué. ¿Qué pudo ser?
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
El host y alguna actualización de linux.

Salud2
 
Estado
Cerrado para nuevas respuestas
Arriba