entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Cuando uso include_once en php no funciona las hojas de estilo css (uso bootstrap)

cuando re-dirijo a una pagina con php usando include_once en lugar de header(), al visualizar el documento (HTML) este aparece como si no le hubiese puesto ningún estilo pero al entrar directamente al documento (HTML) este si muestra los estilos correctamente, si alguien me pudiera ayudar se lo agradecería.

2 Respuestas

2votos

AlexVixgeck Puntos920

Si la ruta a la hoja de estilos del fichero que incluyes es relativa, va a intentar buscarla en la carpeta donde se encuentra el include().

Revisa que la ruta de donde se intenta descargar la hoja de estilos es correcta (con el inspector de código en el navegador. Por regla general, F12 -> pestaña "network")

0voto

florescastrokevin comentado

Hola, gracias por la repuesta.
Tienes razón, la ruta que muestra es otra a la que yo le especifique en el HTML, estaba usando la ruta del documento que lo redireccionó. Lo solucioné simplemente copiando las carpetas de css de bootstrap en esa parte.

0voto

Leonardo-Tadei comentado

Kevin, si para solucinar el problema copiás los archivos a dos o más lugares, vas a complicar mucho el manteniemiento del sitio, porque un cambio requerirá modificar el mismo archivo en todas sus ubicaciones.

Sería una mejor solución comprender qué es lo que está pasando para solucionarlo sin tener que tener varias veces las cosas...

1voto

Leonardo-Tadei Puntos227320

Hola Kevin,

las funciones include_once() y header() no tienen un funcionamiento ni siquiera parecido, y es posible que el error sea por el uso incorrecto de una de ellas.

Lo que hace include_once() es incluir en el fuente, como si estuvieras copiando y pegando, el archivo pasado como parámetro. Se diferencia de include() en que no incluye dos veces el mismo archivo, y de require_once() y require() en que estas últimas dan un error fatal si el archivo no existe y las include*() dan un warning.

La función header() en cambio emite cabeceras HTTP que son enviadas al navegador. Como es una cabecera, debe estar siempre antes de cualquier salida del documento, y su conetnido está restringido exclusivamente a cabeceras HTTP válidas de respuesta determinadas por el protocolo HTTP.

Una lista de las cabeceras es esta: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_Headers

Si nos contás de qué manera estás usando una y otra función, podremos ayudarte mejor... sospecho que estás queriendo intercambiar el include() de un archivo por un header("Location: ....") al mismo con lo que se descarta el contenido previo del archivo llamador, pero sin más datos es solo una suposición.

Saludos!

0voto

florescastrokevin comentado

gracias por tu respuesta, te comento rápidamente lo que quiero lograr:
Esta aplicacion web es una tarea para la universidad, la intencion es almacenar datos en una DB (en mi caso appserv) y desde una aplicacion web poder INSERTAR ELIMINAR Y MODIFICAR LA DB ademas el usuario debe de poder ver los datos de la DB (listar mediante tablas).
Mi proyecto consta de 6 carpetas esencialmente VISTA CSS CONTROLADOR DAO BEAN UTIL.
VISTA: contiene todas las vistas de usuario (pantallas HTML)
CSS: contiene mis archivos .css y algunos .js en general todo bootstrap
DAO: contiene archivos php pero esta creado para realizar operaciones, listar eliminar añadir modificar etc etc, en otras palabras son puros funtion
BEAN: lo utilizamos para crear objetos
UTIL: aca tengo la conexion a la DB
CONTROLADOR: en esta carpeta tengo un php que me sirve para controlar las solicitudes que se hacen en las vistas, osea dentro de el tengo un switch con un case para cada solicitud que se haga.
Ahora el problema surgió cuando queria mostrar los datos de una tabla de la DB.
El proceso fue este: Primero el usuario da click en el boton listar, este boton llama a una funcion en el script de la pagina, esta funcion envia un aprametro mediante el metodo get al controlador, el controlador captura el valor del parametro dentro de una variable, luego el controlador usa esta variable para entrar al switch y luego a un case especifico para esta solicitud.
Dentro del case llamo a una funcion q previamente creé dentro de la carpeta DAO(donde estan mis funciones) para poder mostrar o listar mis elementos de la DB. esta funcion lo q hace es crear un objeto para cada elemento de la tabla de la DB luego estos objetos son almacenados dentro de un array. todo esto funciona dentro de un TRY CATCH que tiene como RETURN jsutamente el array. Regresando al contralador, despues de llamar a la funcion esta devuelve el array q es capturado en el controlador. Ahora necesito q este array sea enviado al HTML dentro de la carpeta vista para q lo pueda mostrar al usuario, para esto uso INCLUDE ONCE.
luego uso un foreach en el html para imprimir todos los datos en una tabla.
Debo decir que la aplicacion o el programa funciona, el problema fu cuando de iniciativa propia trate de ponerle estilos con css para q se vea bien ya que en la universidad no hacemos eso solo usamos html y css, y el tema de las aplicaciones web es algo q me interesa por eso quiero hacerlo lo mejor posible.
tambien la manera de como hacerlo (me refiero a las carpetas) es la manera de como el profesor nos enseña, estoy seguro de que hay otras derrepente mejores.
De todas manera me gustaria que des tu opinion sobre como desarrollamos esto o que tal te parece!
saludos!

0voto

Leonardo-Tadei comentado

Hola Kevin,

gracias por la explicacióbn del proceso: feu muy clara.

Primero de todo, aunque no tiene relación directamente con tu problema, debo decirte que estás implementando mal el MVC. En un MVC, los Controladores jamás devuelven datos a la Vista, que es lo que describís que estás haciendo cuando el array cargado con los pseudo Objetos que se crean tras la consulta a la DB, son capturados por el Controlador.

Lo que debe hacer un Controlador de MVC es devolverle a la vista la señal "terminé", para que la vista lea al Modelo y muestre las cosas. Acá te dejo un esquema que ilustra esta cuestión: http://images.jeremymorgan.com/what-is-mvc-2.jpg

También es raro que tengas al Modelo repartido entre BEAN y UTIL, pero que sea raro no significa que esté mal, a diferencia del Controlador pasando datos a la Vista.

Volviendo a tu problema, las imágenes y CSS se cargan con rutas relativas o absolutas. En caso de usar rutas absolutas, que es lo más recomendable, los HTML en la raíz buscarán esto en /css, pero cuando los estás invocando desde un subdirectorio, como por ejemplo /controlador o /bean y se buscan en /css no se encuentran, porque respecto a ellos están en ../css, es decir un directorio más atrás.

Tenés para esto varias soluciones: una es crear al principio de cada script una variable que contenga la ruta para llegar a la raíz. Para archivos en la raíz estará vacía $rel=''; para archivos en un subdirectorio será $rel='../' y luego a todas las rutas del HTML, concatenar al principio esta variable, de forma tal que las rutas se acomoden según la profundidad de los directorios.

Otra es corregir tu arquitectura y poner todas las Vistas en un mismo directorio a la vez que garantizás que solo sean las vistas las que entreguen información al cliente. De esta manera, respecto de las vistas, los CSS y demás recursos están siempre en el mismo lugar.

Saludos cordiales!

PD: igual, como te decía al principio, header() e include() tienen usos distintos, y sigo sospechando que estás usando una de las dos mal, ya que no son intercambiables.

0voto

florescastrokevin comentado

gracias por el comentario, para casos futuros tratare de subir los proyectos a github para realizar mejor las consultas

0voto

Leonardo-Tadei comentado

Hola Kevin,

para recibir buenas respuestas, no te recomiendo subir los proyectos enteros a gitHub. No creo que muchos tengan tiempo de descargarlo, ponerlo en marcha (en caso de tener la plataforma de ejecución) y revisarlo.

Es mejor como hiciste ahora, plateando un problema en concreto. Lo que sí mejoría comprender qué pasa es la porción de código que da el problema para ver cómo estás usando las cosas.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta