Issue #2763✓ ResueltoAbierto el 10 de mayo de 2020por ghuser123Reacciones 3

GrapesJs y PHP - almacenan y cargan datos para mostrarlos en el editor y también en la página HTML

Respuesta rápidapor Ju99ernaut3

Se supone que debes configurar una API RESTful, por ejemplo: 'sql' '''sql CREATE DATABASE gjs; CREAR TABLA SI NO EXISTE 'páginas' ( 'id' int(20) NO NULO AUTOINCREMENT, 'assets' TEXTO NO NULO DEFAULT '[]', 'components' TEXTO NO NULO POR DEFECTO '[]', 'css' TEXTO NO NULO DEFAULT ' ', 'html' TEXTO NO NULO DEFAULT ' ', 'e...

Lee la respuesta completa abajo ↓

Pregunta

Estoy usando GrapesJS para crear una página web sencilla.

Incluí el guion de la siguiente manera dentro de la parte de la cabeza:

<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<link rel="feuilletas de estilo" tipo="texto/css" href="grapesjs-dev/dist/css/grapes.min.css">
<script type="text/javascript" src="grapesjs-dev/dist/grapes.min.js"></script>

Estoy usando GrapesJS para crear una página web sencilla.

Incluí el guion de la siguiente manera dentro de la parte de la cabeza:

<script type="text/javascript" src="js/jquery-1.10.2.js"></script> <link rel="feuilletas de estilo" tipo="texto/css" href="grapesjs-dev/dist/css/grapes.min.css"> <script type="text/javascript" src="grapesjs-dev/dist/grapes.min.js"></script>

HTML:

<div id="gjs" style="height:0px; overflow:hidden;">
</div>

Javascript :


<script>      
       var editor = grapesjs.init({
        Offsets: 1,
        avisoOnUnload: 0,
        Contenedor: '#gjs',

fromElement: cierto,

Altura: '100%',
        fromElement: cierto,
        storageManager: { autoload: 0 },

assetManager: {

Activos: [
     'http://placehold.it/350x250/78c5d6/fff/image1.jpg',
     Pasa un objeto con tus propiedades
     {
       tipo: 'imagen',
       Src: 'http://placehold.it/350x250/459ba8/fff/image2.jpg',
       altura: 350,
       Ancho: 250
     },
     {
       Como la 'imagen' es el tipo base de recursos, omitirla sí
       se establezca como 'imagen' por defecto
       SRC: 'http://placehold.it/350x250/79c267/fff/image3.jpg',
       altura: 350,
       Ancho: 250
     },
    ],

},

storageManager: {
    Tipo: 'A distancia',
    pasos Antes de guardar: 1,
    autosave: true, // Almacenar datos automáticamente
    autoload: cierto,
    urlStore: 'save_now.php',
    urlLoad: 'load_now.php',
    TipoContenido: 'application/json',
    Para parámetros/encabezados personalizados en peticiones
    params: { _some_token: '....' },
    contentTypeJson: cierto,
      storeComponents: cierto,
    storeStyles: cierto,
    storeHtml: cierto,
    storeCss: cierto,
     cabeceras: {
    'Tipo de contenido': 'aplicación/json'
    },
    json_encode:{
    "GJS-html": [],
    "GJS-CSS": [],
    }
  encabezados: { Autorización: 'Basic ...' },
  }

});

window.editor= editor;

var blockManager = editor. Jefe de bloque;

'mi-primero-bloque' es el ID del bloque
blockManager.add('my-first-block', {
  etiqueta: 'Bloque simple',
  contenido: '<div class="my-block">Este es un bloque simple</div>',
});

</script>

Así que en el panel de bloques aparece un bloque llamado Simple Block que puedo arrastrar y soltar en el editor. Cada vez que se realiza algún cambio, el guardado automático se trigerea con una llamada ajax a save.php archivo. Dentro de save.php, tengo:

$content_found="";
$content_found= file_get_contents('php://input');

mysqli_real_escape_string($conn, $content_encontrado);
echo " contenido encontrado = ".$content_encontrado;
$sql = "INSERTAR EN 'grapes_content' ('content_found')
VALORES ('".$content_found."')";

Pero en la pestaña de red de herramientas para desarrolladores de Chrome, puedo ver: ! 1

No está claro qué variables de carga útil debería guardar en la base de datos ni cómo. Usé '$content_found= file_get_contents('php://input');' para obtener el contenido completo en su lugar.

Después de guardarlo en la base de datos, al refrescar la página, cargo la página con 'load_now.php'. Dentro de 'load_now.php', tengo 👍


$content_found="";
$sql = "SELECCIONAR * DE 'grapes_content'";
$result=$conn->consulta($sql);
$content_found="";
while($row=mysqli_fetch_assoc($result)){

$content_found=$row['content_found'];

}

echo $content_found;

Pero el editor no muestra ningún dato guardado.

Estoy bastante seguro de que la forma en que guardo y recupero datos no es correcta. Así que los puntos son:

Q1) ¿Qué cosas debería guardar en la base de datos? ¿Y cómo puedo obtener las variables o datos de la carga útil de ajax o de cualquier otra manera?

P2) ¿Cómo puedo mostrar los datos guardados en el editor después de recargar la página?

En el editor, veo una opción de vista previa con una imagen de ojo que puede mostrarme la página HTML sin ningún editor.

P3) Después de guardar datos en la base de datos, ¿cómo puedo mostrar los datos simplemente como una página HTML y no dentro de ningún editor?

Respuestas (3)

👍 Muy útilJu99ernaut10 de mayo de 2020

Se supone que debes configurar una API RESTful, por ejemplo:

'sql' '''sql CREATE DATABASE gjs; CREAR TABLA SI NO EXISTE 'páginas' ( 'id' int(20) NO NULO AUTO_INCREMENT, 'assets' TEXTO NO NULO DEFAULT '[]', 'components' TEXTO NO NULO POR DEFECTO '[]', 'css' TEXTO NO NULO DEFAULT ' ', 'html' TEXTO NO NULO DEFAULT ' ', 'estilos' TEXTO NO NULO POR DEFECTO '[]', CLAVE PRIMARIA ('id') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;


'db.php'
'''php
Introduce tu anfitrión, nombre de usuario, contraseña y base de datos abajo.
$con = mysqli_connect("localhost","root","","gjs");
si (mysqli_connect_errno()){
  echo "No se ha conseguido conectar a MySQL: " . mysqli_connect_error();
  die();
}

'store.php' '''php

<?php encabezado("Content-Type:application/json"); incluir('db.php'); $data = json_decode(file_get_contents("php://input")); $assets = $data['gjs-assets']; $components = $data['componentes GJS']; $css = $data['GJS-CSS']; $html = $data['gjs-html']; $styles = $data['estilo GJS']; si (isset($_POST['id']) && $_POST['id']!="") { $result = mysqli_query( $con, "ACTUALIZA 'páginas' SET assets=$assets, components=$components, css=$css, html=$html, styles=$styles DONDE id=$id"); mysqli_close($con) }else{ $result = mysqli_query( $con, "INSERTAR EN 'páginas' (assets, components, css, html, styles) VALORES ($assets, $components, $css, $html, $styles"); mysqli_close($con); } respuesta ($id, $assets, $components, $css, $html, $styles); respuesta funcional($id, $assets, $components, $css, $html, $styles){ $response['id'] = $id; $response['gjs-assets'] = $assets; $response['componentes GJS'] = $components; $response['GJS-CSS'] = $css; $response['GJS-html'] = $html; $response['estilos GJS'] = $styles; $json_respuesta = json_encode($response); echo $json_respuesta; } ?>

'load.php'
'''php
<?php
encabezado("Content-Type:application/json");
si (isset($_GET['id']) && $_GET['id']!=""
  incluir('db.php');
  $id = $_GET['id'];
  $result = mysqli_query(
  $con,
  "SELECT * FROM 'pages' DONDE id = $id");
  if(mysqli_num_rows($result)>0){
    $row = mysqli_fetch_array($result);
    $assets = $row['activos'];
    $components = $row['componentes'];
    $css = $row['css'];
    $html = $row['html'];
    $styles = $row['estilos'];
    respuesta ($id, $assets, $components, $css, $html, $styles);
    mysqli_close($con);
  }else{
    respuesta (NULL, NULL, 200,"No se ha encontrado registro");
  }
}else{
 response(NULL, NULL, 400, "Solicitud inválida");
}
 
respuesta funcional($id, $assets, $components, $css, $html, $styles){
 $response['id'] = $id;
 $response['gjs-assets'] = $assets;
 $response['componentes GJS'] = $components;
 $response['GJS-CSS'] = $css;
 $response['GJS-html'] = $html;
 $response['estilos GJS'] = $styles;
 
$json_respuesta = json_encode($response);
 echo $json_respuesta;
}
?>

'.htaccess'

Añade esto a tu archivo '.htaccess'

RewriteEngine activado # Enciende el motor de reescritura

RewriteRule ^store store.php [NC,L] 
RewriteRule ^store/([0-9a-zA-Z_-]*)$ store.php?id=$1 [NC,L]
RewriteRule ^load/([0-9a-zA-Z_-]*)$ load.php?id=$1 [NC,L]

Dado que añades los archivos a una carpeta llamada 'api', tendrás los siguientes endpoints:

http://localhost/api/load/{id} 'carga un proyecto con id dado' http://localhost/api/store/{id} 'actualizar proyecto con id dado' http://localhost/api/store 'crear un proyecto'

ghuser12310 de mayo de 2020

@Ju99ernaut , Q1) ¿son correctos todos mis fragmentos de código del frontend? Q2) ¿Cómo puedo conseguir la variable '$_POST'? En la pestaña de inspección de red del navegador, solo veo la carga útil de solicitudes. '$_POST' está vacío ahí. P3) Para cargar, ¿los datos guardados se adjuntarán automáticamente al editor?

Ju99ernaut11 de mayo de 2020

Supongo que la variable '$_POST' solo funciona para parámetros de URL, he actualizado el código para usar la variable '$data', tus fragmentos de frontend están bien, pero al cargar los datos no se adjuntarán automáticamente al editor ya que el método load solo envía una solicitud GET, tendrás que decirle al editor qué hacer una vez que los datos estén cargados.

Por ejemplo: '''js añadir al código frontent editor.on('load', () => { const rs = editor. StorageManager.get ('almacenamiento remoto'); rs.load(res => { editor.setComponents(JSON.parse(res['gjs-components'].replace(/^"|" $/g, ""))); editor.setStyle(JSON.parse(res['gjs-styles'].replace(/^"|" $/g, ""))); }, err => { console.log("Ocurrió un error", err); }); });


También actualiza estos en el gestor de almacenamiento
'''js
autoload: false,
urlStore: 'http://localhost/api/store', //OR 'http://localhost/api/store/{id}' {id} debería ser el id de la página que quieres actualizar
urlLoad: 'http://localhost/api/store/{id}', //{id} debería ser el id de la página que quieres cargar

También puede que tengas que configurar una forma de llevar un control de qué página estás editando

También puedes consultar este tutorial sobre APIs RESTful usando php.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Tutoriales relacionados

Guías detalladas sobre el mismo tema.

Todos los tutoriales →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.