1. Este sitio usa cookies. Para continuar usando este sitio, se debe aceptar nuestro uso de cookies. Más información.
  2. ¡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
Descartar aviso
Become a vip user! / ¡Házte usuario VIP!
Download free all our add-ons
descarga gratis todos nuestros complementos
Look into XenForo's Manual in spanish
ver gratis el Manual de XenForo en español
Upgrade to user VIP and download free all our add-ons, look into XenForo's Manual in spanish, see all tutorials entirely, and much more....
Actualiza a usuario VIP y descarga gratis todos nuestros complementos, podrás ver gratis el Manual de XenForo en español, ver completamente todos los tutoriales y mucho más....

Become a vip user! / ¡Házte usuario VIP!

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

Tema en 'Ayuda y Soporte software XenForo' iniciado por SmauG, 27 Abr 2012.

Estado del tema:
Cerrado para nuevas respuestas
  1. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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 :)
     
  2. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
  3. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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
     
  4. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    El tutorial que te indicaba es suficiente para lo que pretendes.
    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
     
  5. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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é.
     
  6. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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.
     
  7. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
  8. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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.. :(
     
  9. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    Pues no. Aún nada.

    Salud2
     
  10. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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.
     
  11. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
  12. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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.
     
  13. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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.
    Mira el archivo XenForo/model.php

    Salud2
     
    A 2 personas les gusta esto.
  14. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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"
     
  15. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
  16. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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 :/
     
  17. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
  18. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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 :/
     
  19. lms

    lms Administrador

    Registrado:
    6 Oct 2010
    Mensajes:
    6.984
    Me Gusta recibidos:
    2.009
    Puntos:
    2.613
    Género:
    Masculino
    País:
    España
    Versión de XenForo:
    1.5.13
    PayPal:
    Donar dinero a este usuario
    Página web:
    Web
    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
     
    A 2 personas les gusta esto.
  20. SmauG

    SmauG XenForoUser

    Registrado:
    22 Mar 2012
    Mensajes:
    86
    Me Gusta recibidos:
    9
    Puntos:
    8
    Género:
    Masculino
    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 del tema:
Cerrado para nuevas respuestas

Compartir esta página

Este sitio usa cookies, propias y de terceros.
Si se continúa con nosotros entendemos que se acepta el uso de cookies.