Как сохранять и извлекать данные, пригодные для контента
Я хочу, чтобы администраторы моего веб-сайта могли изменять текст некоторых страниц. Использование contentediteble было бы идеально для меня.
Проблема в том, что я знаю, как программировать на PHP. Я искал в Интернете часами, пытаясь заставить его работать для меня, но я просто не понимаю языки программирования, используемые для хранения данных, достаточных для того, чтобы они работали.
Вот как я хотел бы работать:
1. Администратор нажимает кнопку "edit"
2. div становится редактируемым.
3. Когда администратор готов к редактированию, он нажимает кнопку "Сохранить"
4. Данные сохраняются в файл или базу данных (не знаю, что будет лучшим вариантом).
5. Измененный контент отображается при открытии страницы.
Это все, что у меня есть сейчас:
<div class='big_wrapper' contenteditable>
PAGE CONTENT
</div>
Я знаю, как сделать часть с преобразованием div в contenteditable div, когда admin нажимает "редактировать".
Моя проблема в том, что я действительно не знаю, как сохранить отредактированные данные.
Я также не знаю, будет ли сложно извлечь данные из файла, а также о том, как сохранить данные. Если он будет сохранен в базе данных, у меня не возникнет проблем с его извлечением, но я не знаю, возможно ли это, и если это лучший вариант.
Спасибо за вашу помощь,
Сэмюэль
EDIT:
@gibberish, большое вам спасибо за ваш быстрый ответ!
Я пытался заставить его работать, но он пока не работает. Я не могу понять, что я делаю неправильно.
Здесь мой код:
<Б > over_ons.php:
<div class='big_wrapper' contenteditable>
PAGE CONTENT
</div>
<input type='button' value='Send Data' id='mybutt'>
<script type="text/javascript">
$('#mybutt').click(function(){
var myTxt = $('.big_wrapper').html();
$.ajax({
type: 'post',
url: 'sent_data.php',
data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
});
});
</script>
sent_data.php:
<?php
session_start();
include_once('./main.php');
include($main .'connectie.php');
$tekst=$_POST['myTxt'];
$query="UPDATE paginas SET inhoud='" .$tekst. "' WHERE id='1'";
mysql_query($query);
?>
Еще раз спасибо за вашу большую помощь!
Можете ли вы также помочь мне сделать div редактируемым только тогда, когда пользователь нажимает кнопку?
РЕШЕНИЕ:
Мне потребовалось более 2 недель, чтобы, наконец, сделать работу. Мне пришлось изучить javascript, jQuery и Ajax. Но теперь он работает безупречно. Я даже добавил некоторые дополнения для причудливости:)
Я хотел бы поделиться, как я это сделал, если кто-то хочет сделать то же самое.
over_ons.php:
//Active page:
$pagina = 'over_ons'; ?>
<input type='hidden' id='pagina' value='<?php echo $pagina; ?>'> <!--Show active page to javascript--><?php
//Active user:
if(isset($_SESSION['correct_ingelogd']) and $_SESSION['functie']=='admin'){
$editor = $_SESSION['gebruikersnaam']; ?>
<input type='hidden' id='editor' value='<?php echo $editor; ?>'> <!--Show active user to javascript--><?php
} ?>
<!--Editable DIV: -->
<div class='big_wrapper' id='editable'>
<?php
//Get eddited page content from the database
$query=mysql_query("SELECT inhoud FROM paginas WHERE naam_pagina='" .$pagina. "'");
while($inhoud_test=mysql_fetch_array($query)){
$inhoud=$inhoud_test[0];
}
//Show content
echo $inhoud;
?>
</div>
<!--Show edit button-->
<?php
if(isset($_SESSION['correct_ingelogd']) and $_SESSION['functie']=='admin')
{?>
<div id='sidenote'>
<input type='button' value='Bewerken' id='sent_data' class='button' />
<div id="feedback" />
</div>
<?php }
Поскольку это довольно длинный и сложный файл, я попытался перевести большинство моих комментариев на английский.
Если вы хотите перевести что-то, что уже не переведено, исходный язык - голландский.
<Б > javascript.js:
//If the system is in edit mode and the user tries to leave the page,
//let the user know it is not so smart to leave yet.
$(window).bind('beforeunload', function(){
var value = $('#sent_data').attr('value'); //change the name of the edit button
if(value == 'Verstuur bewerkingen'){
return 'Are you sure you want to leave the page? All unsaved edits will be lost!';
}
});
//Make content editable
$('#sent_data').click(function(){
var value = $('#sent_data').attr('value'); //change the name of the edit button
if(value == 'Bewerken'){
$('#sent_data').attr('value', 'Verstuur bewerkingen'); //change the name of the edit button
var $div=$('#editable'), isEditable=$div.is('.editable'); //Make div editable
$div.prop('contenteditable',!isEditable).toggleClass('editable')
$('#feedback').html('<p class="opvallend">The content from<BR>this page is now<BR>editable.</p>');
}else if(value == 'Verstuur bewerkingen'){
var pagina = $('#pagina').val();
var editor = $('#editor').val();
var div_inhoud = $("#editable").html();
$.ajax({
type: 'POST',
url: 'sent_data.php',
data: 'tekst=' +div_inhoud+ '&pagina=' +pagina+ '&editor=' +editor,
success: function(data){
Change the div back tot not editable, and change the button name
$('#sent_data').attr('value', 'Bewerken'); //change the name of the edit button
var $div=$('#editable'), isEditable=$div.is('.editable'); //Make div not editable
$div.prop('contenteditable',!isEditable).toggleClass('editable')
//Tell the user if the edditing was succesfully
$('#feedback').html(data);
setTimeout(function(){
var value = $('#sent_data').attr('value'); //look up the name of the edit button
if(value == 'Bewerken'){ //Only if the button name is 'bewerken', take away the help text
$('#feedback').text('');
}
}, 5000);
}
}).fail(function() {
//If there was an error, let the user know
$('#feedback').html('<p class="opvallend">There was an error.<BR>Your changes have<BR>not been saved.<BR>Please try again.</p>');
});
}
});
И, наконец,
<Б > sent_data.php:
<?php
session_start();
include_once('./main.php');
include($main .'connectie.php');
//Look up witch page has to be edited
$pagina=$_POST['pagina'];
//Get the name of the person who eddited the page
$editor=$_POST['editor'];
//Get content:
$tekst=$_POST['tekst'];
$tekst = mysql_real_escape_string($tekst);
$query="UPDATE paginas SET naam_editer='" .$editor. "', inhoud='" .$tekst. "' WHERE naam_pagina='" .$pagina. "'";
}
if(mysql_query($query)){
echo "<p class='opvallend'>Successfully saves changes.</p>";
}else{
echo "<p class='opvallend'>Saving of changes failed.<BR>
Please try again.</p>";
}
?>
Ответы
Ответ 1
Используйте язык на стороне клиента, например JavaScript (или лучший, jQuery), чтобы управлять редактированием полей ввода.
Используйте AJAX для захвата данных поля и отпустите его в файл PHP, который будет хранить данные в вашей базе данных.
Вот очень упрощенный пример использования jQuery для управления включением/отключением полей ввода:
jsFiddle Demo
$('.editable').prop('disabled',true);
$('.editbutt').click(function(){
var num = $(this).attr('id').split('-')[1];
$('#edit-'+num).prop('disabled',false).focus();
});
$('.editable').blur(function(){
var myTxt = $(this).val();
$.ajax({
type: 'post',
url: 'some_php_file.php',
data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
});
});
PHP файл: some_php_file.php
<?php
$myVar = $_POST['varname'];
$secondVar = $_POST['anothervar'];
//Now, do what you want with the data in the vars
Использование AJAX довольно просто. Я привел очень краткий пример того, как это будет выглядеть. Не смотрите в HTML или jQuery для переменной moreTxt
- я добавил это, чтобы показать, как вы добавили бы второй var данных в ajax.
Вот несколько основных примеров, которые помогут вам ускорить работу с ajax:
Обратный вызов запроса AJAX с использованием jQuery
Нет короткого пути к изучению jQuery или AJAX. Прочтите примеры и эксперимент.
Здесь вы можете найти отличные, бесплатные jQuery-учебники:
http://thenewboston.com
http://phpacademy.org
ИЗМЕНЕНИЕ ОБНОВЛЕНИЯ:
Чтобы ответить на ваш запрос по запросу:
Чтобы отправить данные из DIV в файл PHP, сначала нужно событие, которое запускает код. Как вы упомянули, в поле ввода это может быть событие blur()
, которое запускается, когда вы покидаете поле. На <select>
это может быть событие change()
, которое срабатывает, когда вы выбираете выделение. Но на DIV... ну, пользователь не может взаимодействовать с div, не так ли? Триггер должен быть тем, что пользователь делает, например, нажатием кнопки.
Таким образом, пользователь нажимает кнопку - вы можете получить содержимое DIV с помощью команды .html()
. (В блоках ввода и элементах выбора вы должны использовать .val()
, но на DIV и ячейках ячеек вы должны использовать .html()
. Код будет выглядеть так:
Как отправить содержимое DIV после нажатия кнопки:
HTML:
<div class='big_wrapper' contenteditable>
PAGE CONTENT
</div>
<input id="mybutt" type="button" value="Send Data" />
JQuery
$('#mybutt').click(function(){
var myTxt = $('.big_wrapper').html();
$.ajax({
type: 'post',
url: 'some_php_file.php',
data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
});
});
Ответ 2
Вы могли бы спасти весь
Страница клиента с этим:
<script>
function saveAs(filename, allHtml) {
allHtml = document.documentElement.outerHTML;
var blob = new Blob([allHtml], {type: 'text/csv'});
if(window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, filename);
}
else{
var elem = window.document.createElement('a');
elem.href = window.URL.createObjectURL(blob);
elem.download = filename;
document.body.appendChild(elem);
elem.click();
document.body.removeChild(elem);
}
}
</script>
НТН