Regresar a la página www.ComoCrearTuWeb.com
Resultados 1 al 10 de 10

Tema: PHP, MySQL - CMS, crear página nueva automáticamente a partir de formulario

  1. #1
    Me va gustando esto... Habitante
    Fecha de Ingreso
    19 feb, 13
    Mensajes
    47
    Poder de Reputación
    12

    PHP, MySQL - CMS, crear página nueva automáticamente a partir de formulario

    Hola a todos, soy nuevo en esto del diseño web y tengo un problema importante xD.

    Estoy haciendo una administración para mi página web. El objetivo es, a través de un formulario (conectado a la base de datos), insertar un nuevo registro en la base de datos y que sustituya los datos insertados en el diseño de una "plantilla-base" y que se cree una nueva pagina "pagina.php" con el nombre de uno de los datos introducidos, lo que viene a ser un CMS (o una de sus funciones, creo). No sé si el planteamiento de base está mal, solo me queda el código para que se creen las nuevas páginas. Lo que tengo:
    1-Creo la base de datos en MYSQL y la tabla, por ejemplo, con estos 3 datos:

    -meta_description
    -meta_keywords
    -Title_url

    2-Creo la página de administración que permita insertar la información a la base de datos: "page_add.php". Aquí inserto la tabla-formulario (la típica <table> <tr valign="baseline">
    <td nowrap="nowrap" align="right">Title_url:</td>
    <td><input type="text" name="Title_url" value="" size="32" /></td>
    </tr> </table>

    y desde aquí escribo qué irá en meta_description, meta_keywords y Title_url.

    4-Creo la plantilla "plantilla.php", donde dispongo toda la información que quiero (tengo includes de menu, cabecera, foot, etc). Las zonas que quiero que sean "escritas" por la base de datos, las conecto a la misma, por ejemplO:

    <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>">
    <meta name="keywords" content="<?php echo $row_musicabase['meta_keywords']; ?>" />
    <title><?php echo $row_musicabase['Title_url']; ?></title>

    Lo que quiero conseguir es que, rellenando el formulario, se cree una página nueva "Title_url.php", con la información que he introducido tomando de base "plantilla.php". Entiendo que el código debo de introducirlo en "plantilla.php", para que lea la información que acaba de variar con el nuevo registro en la base de datos proporcionado desde "page_add", y se cree, desde "plantilla.php" la nueva página PHP denominado "Title_url.php" y se guarde, por poner un ejemplo en "/paginaweb/musica".


    He probado con distintos códigos, algunos como los de $medruta, propuestos en este foro, pero supongo que, o el planteamiento está mal, o tengo que añadir funciones, o no lo aplico correctamente. Necesito conocer el código que debo de insertar al final de "plantilla.php" para crear una nueva página automáticamente cada vez que inserte información en el formulario y "plantilla.php" se "actualice". A ver si alguien me puede echar una mano. De momento comenzaré a investigar en diseño de foros, a ver si encuentro tutoriales y puedo coger algo de sus entrañas para mi proyecto.
    Muchas gracias a todos!
    PD: espero no estresaros con mis comentarios de novato.
    Última edición por garsagil; 19/02/2013 a las 18:51 Razón: Ánimo de explicarme bien y que se me entienda;).

  2. #2
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    25
    Hola:

    Es fácil crear un archivo con contenido:

    Código PHP:
    $contenido file_get_contents$archivo ); // Así extraes el contenido 
    Código PHP:
    $archivo $row_musicabase['Title_url'];
    file_put_contents$archivo$contenido ); // Así guardas el contenido 
    De esta forma crearías un nuevo archivo con el $contenido indicado cada vez que se añada nuevo contenido (no se crearán dos archivos con el mismo nombre).

    Lo que no entendí del todo es si quieres modificar platilla.php con el nuevo contenido o crear un nuevo archivo con contenido distinto al de plantilla. Si es lo segundo, entonces el código te serviría, pero si es lo último, entonces debes replantear el problema.

    Una mejor solución para lo último, sería leer el contenido directamente desde la base de datos y tener un único archivo (index.php) donde mostrar el contenido (lo que hacen actualmente los CMS):

    sql.php
    Código PHP:
    <?php
      $con 
    connect();

      function 
    connect() {
        
    $db_name 'base_datos';
        
    $user 'root';
        
    $pass '';
        
    $host 'localhost';
        
    $charset 'utf8';
        
    $collate 'utf8_bin';
        
    $con mysql_connect$host$user$pass );

        if( ! 
    $con ) {
          echo 
    '<p>No se pudo conectar a la base de datos: ' mysql_error() . '</p>';
          exit -
    1;
        }

        if( ! 
    mysql_select_db$db_name ) ) {
          echo 
    "<p>No se pudo seleccionar la base de datos <b>$db_name</b>: " mysql_error$con ) . "</p>";
          exit -
    1;
        }

        return 
    $con;
      } 
    // connect()
      

      
    function get_title$id ) {
        if( 
    is_numeric$id ) ) {
          global 
    $con;
          
    $o '';
          
    $q "SELECT * FROM tabla_paginas WHERE page_id = $id";
          
    $r mysql_query$q$con );

          if( 
    mysql_num_rows$r ) == ) {
            
    $r mysql_fetch_assoc$r );
            
    $o $r['title'];
            return 
    $o;
          }
        }

        return 
    error404();
      }

      function 
    error404() {
        return 
    'Página no encontrada';
      }
    ?>
    index.php
    Código PHP:
    <?php require_once "sql.php"?>
    <!DOCTYPE html>
    <html>
      <head>
        <title><?php echo get_title$_GET['id'] ); ?></title>
      </head>
      <body>...</body>
    </html>
    Obviamente lo anterior no funcionará, es solo para que te hagas una idea. Tendrías que inventar una forma de pasar el ID de la página solicitada a través de $_GET a get_title (http://mipagina/id=NNN, por ejemplo).

  3. #3
    Me va gustando esto... Habitante
    Fecha de Ingreso
    19 feb, 13
    Mensajes
    47
    Poder de Reputación
    12
    Gracias por la respuesta skaparate, acabo de editar el tema, a fin de que se me entienda mejor (a ver si lo consigo;)). Creo que me has entendido, quiero crear un nuevo archivo que se tenga el nombre de "Title_url.php" pero que tome la estructura de la pagina "plantilla.php". El código que me has dado no me funciona, soy MUY noob en esto, lo he probado a poner al final de "plantilla.php" y de "page_add", pero no funciona. Por lo que he visto, creo que el tema va por fread / fwrite y necesita una variable que sea la carpeta donde se guarda el archivo.
    Esto es lo que encontré en otro post de este foro:
    <?php
    $ruta_archivo="paginaweb/plantilla.php";
    $medruta='musica/'."$mednombre"; //(no se qué es esto, por eso pongo música, como la carpeta donde quiero que se guarde el nuevo archivo generado y Smednombre, como Title_url).

    $mednombre= 'Title_url';
    $medfile=fopen("$ruta_archivo","a");
    $medleido=fread($medfile,1000000);
    fread($medfile,1000000);
    $medreemplazo=str_replace("{ruta}","$medruta", file_get_contents("paginaweb/plantilla.php"));
    fwrite($medfile,$medreemplazo);
    fclose($medfile);
    ?>

    No se si lo aplico bien, ¿debe ir dentro de las marcas de html? ¿fuera?.
    Gracias a todos de nuevo.

  4. #4
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    25
    Según entiendo, no se puede modificar el contenido de un archivo .php que se esta ejecutando, por ende, debes crear un archivo nuevo con los contenidos de la plantilla, en lugar de ejecutarla.

    Sería útil que nos explicaras la estructura de tus archivos (dónde esta la función page_add, por ejemplo) para entender mejor la lógica de lo que buscas (entiendo lo que quieres, pero no la organización de tus scripts).

  5. #5
    Me va gustando esto... Habitante
    Fecha de Ingreso
    19 feb, 13
    Mensajes
    47
    Poder de Reputación
    12
    Veamos:
    C/wamp/www/tupaginaweb
    .../tupaginaweb/admin:
    -page_add.php //esta página contiene el formulario, a través del cual inserto registros en la tabla de MySQL. El código es el de juego de registros y luego la típica tabla de formulario como el código que pongo arriba.


    .../tupaginaweb
    -plantilla.php //esta página proviene de un template ("plantillabase.dwt.php") y tiene campos editables e includes, un ejemplo de su código:

    --Juego de registros--
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin template="/Templates/plantillabase.dwt.php" codeOutsideHTMLIsLocked="false" -->
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <!-- InstanceBeginEditable name="doctitle" -->
    <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>">
    <meta name="keywords" content="<?php echo $row_musicabase['meta_keywords']; ?>" />
    <title><?php echo $row_musicabase['Title_url']; ?></title>
    <!-- InstanceEndEditable -->
    <!-- InstanceBeginEditable name="head" -->
    <!-- InstanceEndEditable -->
    <link href="CSS/estiloprincipal.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="css/menuhorizontal.css" type="text/css" />
    </head>
    .
    .
    .


    Bien, pues en localhost/admin/page_add.php, introduzco los datos "meta_description", "meta_keywords" y "Title_url" a través de formulario, se genera un registro en la tabla de MySQL y se "actualiza" "plantilla.php", por lo que si entro en localhost/admin/plantilla.php, tendré la página actualizada con el último registro insertado en la tabla. <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>"> content será igual a lo que puse en el formulario de page_add.

    Quiero que, al insertar el formulario se genere una página .php nueva cuyo nombre sea la variable "Title_url" que puse en el formulario, y cuya información sea la de "plantilla.php" pero con las informaciones cambiadas por las del registro insertado, es decir, que lo que haya puesto en "meta_description", aparezca en content="lo que puse en el registro". Y así con todos los datos. Es decir, crear Title_url.php con la estructura de la "plantilla.php"

    A ver si esta información os sirve mejor, muchísimas gracias de nuevo, ahí sigo profundizando en el fwrite y fopen, pero no consigo sacarlo. Agradecería que en las respuestas intentéis explicármelo como si de un idiota se tratara :D, así lograré pillarlo y entenderlo todo, si dais algo por sabido, indicar qué es, por si acaso no lo sé, y así lo investigo.
    Un saludo!

  6. #6
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    25
    No es necesario crear un archivo nuevo, pero si eso es lo que quieres, entonces esto debería funcionar:

    Código PHP:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin template="/Templates/plantillabase.dwt.php" codeOutsideHTMLIsLocked="false" -->
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <!-- InstanceBeginEditable name="doctitle" -->
    <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>">
    <meta name="keywords" content="<?php echo $row_musicabase['meta_keywords']; ?>" />
    <title><?php echo $row_musicabase['Title_url']; ?></title>
    <!-- InstanceEndEditable -->
    <!-- InstanceBeginEditable name="head" -->
    <!-- InstanceEndEditable -->
    <link href="CSS/estiloprincipal.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="css/menuhorizontal.css" type="text/css" />
    </head>
    <body>
      <?php
        
    // De alguna forma debes conseguir el nombre del contenido que quieres ver y pasarlo a la siguiente función, aunque es algo reiterativo,
        // pues bastaría con mostrar el $contenido - echo $contenido:
        
    function crear_archivo$nombre$contenido ) {
          if( ! empty( 
    $nombre ) ) {
            
    $pos strpos$nombre'/' );
            if( 
    $pos != )
              
    $nombre '/' $nombre;

            
    $ruta dirname__FILE__ ) . $nombre;
            
    file_put_contents$ruta$contenido );
            include 
    $ruta;
          }

          return 
    false;
        }
      
    ?>
      <!-- Aquí, me imagino que pondrás más cosas, como el footer -->
    </body>
    Otra forma de hacerlo sería procesar todo antes del DOCTYPE y mostrar el contenido almacenado en variables.

  7. #7
    Me va gustando esto... Habitante
    Fecha de Ingreso
    19 feb, 13
    Mensajes
    47
    Poder de Reputación
    12
    Joder Skaparate, muchas gracias! Aunque te voy a molestar algo más. No se cómo aplicar el código que me das. Quiero que se genera un archivo con el nombre de la variable 'Title_url' con extensión .php y en la carpeta /musica. Cómo aplico tu código?

    // De alguna forma debes conseguir el nombre del contenido que quieres ver y pasarlo a la siguiente función, aunque es algo reiterativo,
    // pues bastaría con mostrar el $contenido - echo $contenido:
    function crear_archivo( $nombre, $contenido ) {
    if( ! empty( $nombre ) ) {
    $pos = strpos( $nombre, '/' );
    if( $pos != 0 )
    $nombre = '/' . $nombre;

    $ruta = dirname( __FILE__ ) . $nombre;
    file_put_contents( $ruta, $contenido );
    include $ruta;
    }

    return false;
    }
    ?>

    Siento no tener los conocimientos necesarios, pero me gustaría entenderlo. No veo el "$contenido = X".
    Entiendo que en
    $pos = strpos( $nombre, '/' );
    sería:
    $pos = strpos( $nombre, Title_url' ); // porque lo que hace es buscar?
    ¿Como aplico este código exactamente a mi página? Si pudieses explicármelo podría aplicarlo al resto de la página web. Muchas gracias de nuevo Skaparate!

  8. #8
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    25
    Código PHP:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"><!-- InstanceBegin template="/Templates/plantillabase.dwt.php" codeOutsideHTMLIsLocked="false" -->
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <!-- InstanceBeginEditable name="doctitle" -->
    <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>">
    <meta name="keywords" content="<?php echo $row_musicabase['meta_keywords']; ?>" />
    <title><?php echo $row_musicabase['Title_url']; ?></title>
    <!-- InstanceEndEditable -->
    <!-- InstanceBeginEditable name="head" -->
    <!-- InstanceEndEditable -->
    <link href="CSS/estiloprincipal.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="css/menuhorizontal.css" type="text/css" />
    </head>
    <body>
      <?php
        
    // De alguna forma debes conseguir el nombre del contenido que quieres ver y pasarlo a la siguiente función, aunque es algo reiterativo,
        // pues bastaría con mostrar el $contenido - echo $contenido:
        // ($nombre NO puede ser una URL, tiene que ser una ruta)
        
    function crear_archivo$nombre$contenido ) {
          if( ! empty( 
    $nombre ) ) {
            
    $pos strpos$nombre'/' ); // Busca la primera aparición del caracter pasado en el segundo parámetro dentro de la cadena del primer parámetro ($nombre), que en este caso es /.

            
    if( $pos !== false )
              
    $nombre substr$nombre, ( $pos ) ); // Corta la cadena para quitar el primer /. Esto es para asegurarse de que no se añada más de un / a la ruta.

            
    $ruta "musica/$nombre";
            
    file_put_contents$ruta$contenido );
            include 
    $ruta;
          }

          return 
    false;
        }
        
    /* No sé como se llama el contenido en la base de datos, así que reemplázalo por el nombre que corresponda */
        
    crear_archivo$row_musicabase['Title_url'], $row_musicabase['contenido'] );
        echo 
    $row_musicabase['contenido']; // Para mostrar el contenido.
      
    ?>
      <!-- Aquí, me imagino que pondrás más cosas, como el footer -->
    </body>
    Espero que te sirva :).

  9. #9
    Me va gustando esto... Habitante
    Fecha de Ingreso
    19 feb, 13
    Mensajes
    47
    Poder de Reputación
    12
    He conseguido crear archivos con título 'Title_url' pero sin terminación alguna, y necesito que sean .php. No quiero que el contenido del archivo nuevo sea una variable de la base de datos, quiero que el contenido sea el de "plantilla.php" pero con la información de las variables cambiadas. Yo inserto un registro y me aparece un archivo ("Title_url.php") con el código de "plantilla.php" y sus variables cambiadas:
    <meta name="Description" content="<?php echo $row_musicabase['meta_description']; ?>">

    Si en el formulario puse como meta_description = blablublibla quedaría así:
    ---dentro del código de "plantilla.php"-----
    <meta name="Description" content="blablublibla">

    Bien, he probado con esto:
    <?php
    function crear_archivo( $nombre, $contenido )
    {
    if( ! empty( $nombre ) ) {
    $pos = strpos( $nombre, '/' ); // Busca la primera aparición del caracter pasado en el segundo parámetro dentro de la cadena del primer parámetro ($nombre), que en este caso es /.

    if( $pos !== false )
    $nombre = substr( $nombre, ( $pos + 1 ) ); // Corta la cadena para quitar el primer /. Esto es para asegurarse de que no se añada más de un / a la ruta.

    $ruta = "musica/$nombre";
    file_put_contents( $ruta, $contenido );
    include $ruta;
    }
    return false;
    }
    $contenido= include("musica_base.php");
    crear_archivo( $row_musicabase['Title_url'], $contenido );
    echo $contenido;

    ?>

    He abierto un archivo con eso dentro, pero no sirve de nada, porque no está dentro del código <?php > ni la extensión del archivo creado es.php.
    Pero bueno, el tema va avanzando! A ver si se te ocurre algo más. Muchas gracias de nuevo

  10. #10
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    25
    Pero es fácil, basta con agregar la extensión .php al nombre del archivo y las etiquetas php:

    Código PHP:
    crear_archivo( $row_musicabase['title_url'] . '.php', "<?php $contenido ?>" );
    Pero te reitero, estás siendo redundante, pues es exactamente lo mismo que mostrar el contenido directamente desde la base de datos :P.

Temas Similares

  1. ¿como crear una pagina automaticamente?
    Por leoni en el foro Foro General
    Respuestas: 1
    Último Mensaje: 30/01/2012, 04:02
  2. Ayuda: Como Crear Un Formulario Con PHP y MySQL
    Por Cristianjbt en el foro Formularios
    Respuestas: 2
    Último Mensaje: 20/09/2011, 14:17
  3. Crear un formulario personalizado a partir de cero!
    Por aorkis en el foro Formularios
    Respuestas: 3
    Último Mensaje: 20/06/2007, 13:33

Etiquetas para este Tema

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •