• ¡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
#1
Hola,

Quería saber si alguno tiene idea de cómo crear una página que lea de la base de datos. Más específicamente, una página que pasándole una id en la url (por ejemplo, usuarios/123) devuelva la información del usuario con la ID 123 (Básicamente es algo como users en el propio xenforo, pero de una forma más sencilla para entenderlo bien y poder crear a partir de ahí).
Estuve viendo un tutorial en el foro oficial (páginas leyendo y escribiendo la db) pero no estoy seguro de si es lo que necesito, ya que es más una página común que una que reciba el parámetro y actúe en función de eso.

Oh, y ya que estoy. ¿Alguno sabe cómo hace 2 sidebars? Una a la izquierda y otra a la derecha, completamente independientes.


Gracias :)
 

lms

Administrador
#2
Puedes usar el cambiador de rutas de jakes para cambiar la ruta de members a usuarios y así, members.1 te llevará a usuarios.1.

También puedes crearla con un archivo en un complemento y sigue los pasos de PoLiZe en http://www.xenfacil.com/posts/6938/

Lo de la sidebar es css por un lado y programación por el otro.

Salud2
 

SmauG

XenForoUser
#3
Creo que no me expliqué bien.
No quiero hacer /usuarios, quiero hacer otra página totalmente distinta que lea otra tabla, pero que funcione de esa manera (xxx/id, mostrando el xxx con la id que le pasas, teniendo en cuenta que puedo tener miles de id distintas).

Por otro lado, ¿podrías explicar algo más lo del sidebar?. Ya sé que es programación y css, pero no consigo pillarle el truco. Lo ideal para mi sería agregar la sintaxis <xen:leftsidebar>, pero en su defecto con crear la sidebar en una div con las mismas propiedades me sería más que suficiente.

Saludos
 

lms

Administrador
#4
Creo que no me expliqué bien.
No quiero hacer /usuarios, quiero hacer otra página totalmente distinta que lea otra tabla, pero que funcione de esa manera (xxx/id, mostrando el xxx con la id que le pasas, teniendo en cuenta que puedo tener miles de id distintas).
El tutorial que te indicaba es suficiente para lo que pretendes.
Por otro lado, ¿podrías explicar algo más lo del sidebar?. Ya sé que es programación y css, pero no consigo pillarle el truco. Lo ideal para mi sería agregar la sintaxis <xen:leftsidebar>, pero en su defecto con crear la sidebar en una div con las mismas propiedades me sería más que suficiente.

Saludos
Lo de la sidebar es más complejo y yo, ahora mismo, no sabría hacerla. Si solo se trata de que se vea en el listado de foros, copia el contenido (modificado a tu gusto) de la sidebar en la plantilla PAGE_CONTAINER y colócalo en la misma plantilla como leftsidebar. Tras ello deberás hacer todo el css, no solo para la leftsidebar, si no también las modificaciones del css de xenforo para que el resto quede "amoldado" a lo que hay.

Salud2
 

SmauG

XenForoUser
#5
Voy a probar esta tarde el tutorial y ya te digo :)

Lo de la sidebar voy a seguir investigando cómo añadir nueva sintaxis o cómo hacer una sidebar con un div, con el page_container no me sirve, ya lo probé.
 

SmauG

XenForoUser
#6
Bueno, ya le eché un ojo al tutorial. Está bien para crear páginas y subsecciones, pero no veo cómo aplicarlo a lo que quiero, quizá esté algo obcecado. ¿Podrías ponerme un ejemplo práctico? Por ejemplo eso de los usuarios, crear una página aparte que cargue el nombre del usuario según la ID.
 

lms

Administrador
#7
En el ejemplo, se indica como meter las variables para las estadísticas. En tu caso es meter las variables para user => XenForo_Model_User

Salud2
 

SmauG

XenForoUser
#8
Bueno, ya le pillé el truco a esto. Al final sólo me faltaba meter el helper y el datawriter en la librería xenforo, ya que al estar modificándolo y no creando un addon en sí, no leía los locales.

Lo de la sidebar.. ni idea, ¿no? Aún no encontré nada.. :(
 

SmauG

XenForoUser
#10
Otra cosilla que me di cuenta hoy..
Un datawriter sólo es capaz de leer de una sola tabla?Estoy intentando meter varios en el array, pero después no estoy seguro de si tengo que meter el query dentro del getExistingFields, creo otro nuevo (que me da que no, ya que requiere después el getFields y alguna cosilla más) o tengo que hacer un datawriter por cada pestaña que haga dentro de una misma página?
Y cómo va lo de fetchAllKeyed? Sólo lee todo y no se puede filtrar por un parámetro? Porque cuando lo intento me da algunos errores, sin embargo haciéndolo fila a fila va perfectamente.
 

lms

Administrador
#11
El datawriter lee y escribe lo que le pongas (bien puesto). El fetchAllKeyed lee lo que le pongas. Es un sistema para pasar arrays o matrices.

Salud2
 

SmauG

XenForoUser
#12
Pero cómo haces que lea de dos tablas? Le pasas las dos por un array, pero después creas varias funciones con el mismo nombre (_getExistingData) o puedes crearlas con el nombre que quieras y hacer que lea desde ahí? Las pruebas que hice con _getXXX no me iban, seguía leyendo del _getExistingData principal.

Entonces para pedir "x" filas en función de un campo.. qué función uso? Porque no sería ni la de devolver fila ni la de devolver todo, estoy mirando pero aún no vi una mixta.
 

lms

Administrador
#13
Abre cualquier archivo .php de XenForo_DataWriter, como por ejemplo el user.php.
Mira la función protected function _getFields()
Ahí verás el formato a escribir y leer de los datos y de varias tablas a la vez.
La función public static $usernameChangeUpdates (línea 821) y la protected function _postSave() (línea 866) que te darán una idea de su manejo.

La siguiente es una consulta que estoy usando para que me den los usuarios más seguidos:
Insertar CODE, HTML o PHP:
        $sql = $this->fetchAllKeyed[COLOR=#0000ff]([/COLOR]$this->limitQueryResults[COLOR=#808000]([/COLOR]'
            SELECT COUNT( follow_user_id ) AS Total,
                xf_user.username AS username, xf_user.user_id AS user_id,
                xf_user.avatar_date, xf_user.gravatar AS gravatar
            FROM xf_user_follow
            LEFT JOIN xf_user ON
                (xf_user.user_id = xf_user_follow.follow_user_id)
            GROUP BY follow_user_id
            ORDER BY Total DESC
            ', $limite[COLOR=#808000])[/COLOR]
        , 'Total'[COLOR=#0000ff])[/COLOR];
 
        return $sql;
La variable $limite supone el límite de los registros devueltos por la consulta y se corresponde con la función $this->limitQueryResults.
XenForo dijo:
/**
* Fetches results from the database with each row keyed according to preference.
* The 'key' parameter provides the column name with which to key the result.
* For example, calling fetchAllKeyed('SELECT item_id, title, date FROM table', 'item_id')
* would result in an array keyed by item_id:
* [$itemId] => array('item_id' => $itemId, 'title' => $title, 'date' => $date)
*
* Note that the specified key must exist in the query result, or it will be ignored.
Mira el archivo XenForo/model.php

Salud2
 

SmauG

XenForoUser
#14
Argh.

No estaba haciendo mal lo de consultar varias tablas, pero intentaba devolver varias filas o limitar el de devolver todas a ojímetro, sin usar las opciones del model.


Igual estoy tonto, pero ahora mismo no encuentro el error aquí, puedes echarle un ojo?

Esto estaría en mi model de prueba, quiero devolver directamente las filas para mostrarlas en la página.

Insertar CODE, HTML o PHP:
    public function getTestData($Id)
    {
        return $this->fetchAllKeyed($this->limitQueryResults('
            SELECT COUNT( id ) AS total,
            data.*
            FROM xf_data as data
            WHERE data.id = ?
            ', $Id)
        , 'total');
    }
Y esta la linea de devolución en el ControllerPublic:
Insertar CODE, HTML o PHP:
        $viewParams = array('testdata' => $this->getModelFromCache('XenForo_Model_Test')->getTestData($Id));
Después ya leo el array con un foreach en el template sin ningún problema, está probado con el fetchAllKeyed sin filtrar.

A pesar de pasarle la Id ($Id está llena, la uso en otros sitios), me dice "Mysqli statement execute error : No data supplied for parameters in prepared statement"
 

lms

Administrador
#15
Argh.

No estaba haciendo mal lo de consultar varias tablas, pero intentaba devolver varias filas o limitar el de devolver todas a ojímetro, sin usar las opciones del model.


Igual estoy tonto, pero ahora mismo no encuentro el error aquí, puedes echarle un ojo?

Esto estaría en mi model de prueba, quiero devolver directamente las filas para mostrarlas en la página.

Insertar CODE, HTML o PHP:
    public function getTestData($Id)
    {
        return $this->fetchAllKeyed($this->limitQueryResults('
            SELECT COUNT( id ) AS total,
            data.*
            FROM xf_data as data
            WHERE data.id = ?
            ', $Id)
        , 'total');
    }
Y esta la linea de devolución en el ControllerPublic:
Insertar CODE, HTML o PHP:
        $viewParams = array('testdata' => $this->getModelFromCache('XenForo_Model_Test')->getTestData($Id));
Después ya leo el array con un foreach en el template sin ningún problema, está probado con el fetchAllKeyed sin filtrar.

A pesar de pasarle la Id ($Id está llena, la uso en otros sitios), me dice "Mysqli statement execute error : No data supplied for parameters in prepared statement"
Insertar CODE, HTML o PHP:
    public function getTestData($Id)
    {
        return $this->fetchAllKeyed($this->limitQueryResults('
            SELECT COUNT( [SIZE=7][B][COLOR=#0000ff]*[/COLOR][/B][/SIZE] ) AS total,
            [SIZE=7][B][COLOR=#0000ff]xf_[/COLOR][/B][/SIZE]data.*
            FROM xf_data as data
            WHERE data.id = ?
            ', $Id)
        , 'total');
    }
Debes pasarle algún dato que corresponda a la tabla en el SELECT. El asterísco se usa para seleccionar toda la tabla.

Prueba y me dices.

Salud2
 

SmauG

XenForoUser
#16
El SELECT COUNT (*) es igual al SELECT COUNT (id), ya que id es la primary key de la tabla xf_data.

Por otro lado, no hace falta poner ese xf_data ahí ya que al hacer el xf_data as data ya lo reconoce. Por si acaso probé pero no arregla nada, es más, así ni encuentra la tabla :/
 

lms

Administrador
#17
Si te funciona sin la clausula WHERE y así no, es que: o el $Id es un array o es una variable vacía o nula.
Si es el segundo caso, solo te vale el comprobarla primero con un isset(). En el primer caso tienes que poner:

Insertar CODE, HTML o PHP:
    public function getTestData($Id)
    {
        if (!isset($Id) || $Id === '') return false; /* $Id es nulo o vacío */
        return $this->fetchAllKeyed($this->limitQueryResults('
            SELECT COUNT( id ) AS total,
            data.*
            FROM xf_data as data
            WHERE data.id [SIZE=5][B][COLOR=#0000ff]IN ('.$this->_getDb()->quote($Id).')'[/COLOR][/B][/SIZE]
            ',[B][COLOR=#0000ff][SIZE=5] 0, 5[/SIZE][/COLOR][/B])
        , 'total');
    }
0 y 5 son el límite de la consulta: entre 0 y 5. Ahí no debe ir el $Id.

Salud2
 

SmauG

XenForoUser
#18
Creo que voy a echarle un ojo mañana.
Ahora mismo lo acabo de probar y va a medias. Ya no da error y devuelve resultados con el in (aunque sólo 1 y debería devolver varios). No sé por qué no va de forma normal, $Id es un entero :/
 

lms

Administrador
#19
Si es un COUNT sólo te puede devolver 1 resultado si lleva el asterisco enmedio. Prueba:
Insertar CODE, HTML o PHP:
    public function getTestData($Id)
    {
        if (!isset($Id) || $Id === '') return false; /* $Id es nulo o vacío */
        return $this->fetchAllKeyed($this->limitQueryResults('
            SELECT COUNT( id ) AS total,
            data.*
            FROM xf_data as data
            WHERE data.id = [B]'.$Id.'[/B]
            ', 0, 50)
        , 'total');
    }
La expresión '.$Id.' (con las ' incluidas) puedes cambiarla por el número entero y realizar la consulta en phpMyAdmin para que veas que funciona y que te devuelve lo que debe devolverte.

Salud2
 

SmauG

XenForoUser
#20
Gracias, pero así no me va bien.

Creo que ahora me funciona bien, pero no estoy seguro de por qué. ¿Alguna idea de por qué va bien por si acaso va mal y lo tengo que corregir? Teóricamente lo veo bien, pero no sé por qué tengo que pasarle el segundo argumento ni qué significa (creía que era el máximo de filas a devolver, pero parece que no).

Insertar CODE, HTML o PHP:
    public function getData($Id)
    {
        return $this->fetchAllKeyed('
            SELECT * 
            FROM xf_data as data
            WHERE data.Id = ('.$this->_getDb()->quote($Id).')
            ', 0);

    }
 
Estado
Cerrado para nuevas respuestas
Arriba