GrapesJs y PHP - almacenan y cargan datos para mostrarlos en el editor y también en la página HTML
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)
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'
@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?
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.
Issue #1865
[Bug]: Las uvas cambian la posición de la página
Hola, Encontré el siguiente problema usando uvas dentro de una página html: Cuando haces clic en algunos elementos del editor, como la flec...
Issue #1278
Uso con php y mysql
Hola. ¿Se puede usar esto como un editor wysiwyg normal para guardar los datos en una base de datos y crear páginas dinámicamente en una pá...
Issue #2116
[PREGUNTA] NS_ERROR_FAILURE en rte.exec
Actualmente estoy usando GrapesJS para crear un editor para las entradas del blog en mi página web. Una de las cosas que quería cambiar res...
Issue #3702
Etiquetas de cabeza HTML no añadidas al dom
Estoy usando [grapesjs library][1] para crear páginas web, he añadido un bloque personalizado según docs [aquí][1] cuando arrastro el bloqu...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
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 →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.
Tutorial
Ship to Production Faster: What’s New in GrapesJS Shadcn
Supercharge your page builder! GrapesJS Shadcn adds live drag previews, rich text / commands, dynamic data, and canvas presets to ship to prod faster.
Tutorial
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
GrapesJS Inline RTE Plugins Update: CKEditor 5 v0.1.4 and Froala Inline Text Editor
CKEditor 5 Inline for GrapesJS v0.1.4 fixes Studio SDK toolbar clipping, iframe injection and link balloon bugs. Compare with Froala Inline — both $69.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.