|
|
|
| В форме ввода имеются два textarea, причем в одно окно инфа вводится напрямую, а в другое - с использованием визуального редактора tiny_mce (http://fh7929mi.bget.ru/5/51.html).
Если Вы кликнете "Применить", то внизу появится предзаполненное содержимое обоих этих окон.
А теперь допишите что-нибудь в каждое из окон и вновь кликнете "Применить". При этом Вы увидите новое содержимое первого окна и... старое содержимое второго окна!
Кликнете "Применить" еще раз и содержимое второго окна тоже обновится!
Вот как объяснить этот странный эффект? А главное, как от него избавиться?
============
Содержимое файла firm-server-50
$mini_text = trim($_POST["mini_text"]);
$maxi_text = trim($_POST["maxi_text"]);
echo "<br /> mini_text $mini_text ";
echo "<br /> maxi_text $maxi_text ";
if (strlen ($mini_text) < 10)
die ('<p>Слишком короткое краткое описание</p>');
|
| |
|
|
|
|
|
|
|
для: Владимир55
(21.04.2014 в 23:37)
| | Если два окна значит два UPDATE к базе.
Видимо второй UPDATE стоит ниже вывода содержимого второго окна.
А вообще, желательно бы код всей страницы | |
|
|
|
|
|
|
|
для: Den*s
(21.04.2014 в 23:40)
| | А вообще, желательно бы код всей страницы
Сорри, я посчитал, что HTML код удобнее смотреть прямо в сети. База не используется, ибо эффект виден и без неё.
Код страницы:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Изменение сведений о фирме</title>
<script type="text/javascript" src="tiny_mce/tiny_mce.js"></script>
<script type="text/javascript">
tinyMCE.init({
mode : "specific_textareas",
editor_selector : "editme",
language : "ru",
plugins : "jbimages,safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
theme : "advanced",
relative_urls : false,
theme_advanced_buttons1 : "bold,italic,underline,forecolor,link,unlink,bullist,|,pasteword,pastetext,jbimages,image,|,undo,redo,|,code,fullscreen",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "center",
theme_advanced_statusbar_location : "bottom",
relative_urls : false,
// your site CSS
content_css : "css/all.css"
// Конфигурация загрузчика графики устанавливается в файле config.php в папке tiny_mce/plugins/jbimages
});
</script>
<!-- jQuery -->
<script type="text/javascript" src="jquery.js"></script>
<script src='js/jquery.form.js'></script>
<script>
var options = {
target:"#output",
success: function(data){
if($(data).attr("id")=='success'){
$.modal.close();
}
}
};
</script>
<script>
function checklength(t){
var ml = $(t).attr('maxlength');
var diff = ml - $(t).val().length;
var ad = $(t).nextAll('div:first');
if (diff==ml){
ad.html(' ').css('color','green');
}
else if(diff>10){
ad.text('Осталось знаков: '+diff).css('color','green');
}
else{
ad.text('Осталось знаков: '+diff+'!').css('color','red');
}
}
</script>
</head>
<body bgcolor="#FFFFFF">
<form action="firm-server-50.php" method="post" onSubmit="$(this).ajaxSubmit(options);return false;">
<input type="hidden" name="success_href" value="/my-admin/">
<input type="hidden" name="id_rubric" value="1">
<input type="hidden" name="id_firm" value="2">
<input type="hidden" name="ss_firm" value="1/vtoraja-avtomobilnaja-firma">
<p>Краткое описание фирмы</p>
<textarea cols="" rows="" maxlength="100" onKeyUp="checklength(this);" name="mini_text" style="width:750px;height:50px" >Транспортные услуги по всей стране.</textarea>
<p>Полное описание фирмы </p>
<textarea name="maxi_text" cols="" rows="" style="width:1000px; height:300px" class="editme">
Транспортные услуги по всей России в полном объеме.
</textarea>
<input type=submit value="Применить">
</form>
<table width="100%" bgcolor="#F2FFFF" >
<tr>
<td style="text-align:center;" colspan="2">
<div id="output"></div>
</td>
</tr>
</table>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: Владимир55
(21.04.2014 в 23:41)
| | Прикрепите ещё файл jquery.form.js (находится в папке js)
А то отправка формы судя по всему идёт через ajax | |
|
|
|
|
 31.2 Кб |
|
|
для: Den*s
(21.04.2014 в 23:47)
| | Во вложении. | |
|
|
|
|
 8.1 Кб |
|
|
для: Владимир55
(21.04.2014 в 23:54)
| | Этот же файл в архивированом виде. | |
|
|
|
|
 61.3 Кб |
|
|
для: Владимир55
(21.04.2014 в 23:56)
| | У меня вообще появляются ещё 2 формы, в которых написаны исходные значения зашитые в html или js/jquery. Это если не подключать tinymce
А если подключать то пустой экран. Возможно как то js скрипты криво пересекаются.
А вообще какая задача стоит?
Куда должны сохраняться данные с форм "Краткое описание фирмы" и "Полное описание фирмы"
Зачем столько нагромождений | |
|
|
|
|
|
|
|
для: Den*s
(22.04.2014 в 00:16)
| | Данные с форм отправляются в базу, но суть не в этом. С базой все нормально, проблема лишь в части, которую я описал.
Зачем столько нагромождений
Что именно Вам представлеятся нагромождением?
Если можно что-то упростить, то это хорошо, но это не самоцель.
Возможно как то js скрипты криво пересекаются.
Как можно предположить, проблема именно в этом. | |
|
|
|
|
|
|
|
для: Владимир55
(22.04.2014 в 00:31)
| | Я бы сделал так:
<?
include_once("config/config.php"); //подключаемся к базе
$mini_text = mysql_real_escape_string($_POST["mini_text"]);
$maxi_text = mysql_real_escape_string($_POST["maxi_text"]);
$id = intval($_POST["id"]); //или $id = intval($_GET["id"]); зависит каким способом передаём id записи в базе
//по отдельности обновляем каждое поле
if ($mini_text)
{
$query = "UPDATE tableName SET mini_text = '$mini_text'
WHERE id = '$id' ";
if(!mysql_query($query)) exit(mysql_error());
}
if ($maxi_text)
{
$query = "UPDATE tableName SET maxi_text = '$maxi_text'
WHERE id = '$id' ";
if(!mysql_query($query)) exit(mysql_error());
}
$query = mysql_query("SELECT * FROM tableName WHERE id = '$id' ");
$content_show = mysql_fetch_assoc($query);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Изменение сведений о фирме</title>
<script type="text/javascript" src="_img/tools/tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript">
tinyMCE.init({
mode : "specific_textareas",
editor_selector : "editme",
language : "ru",
plugins : "jbimages,safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
theme : "advanced",
relative_urls : false,
theme_advanced_buttons1 : "bold,italic,underline,forecolor,link,unlink,bullist,|,pasteword,pastetext,jbimages,image,|,undo,redo,|,code,fullscreen",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "center",
theme_advanced_statusbar_location : "bottom",
relative_urls : false,
// your site CSS
content_css : "css/all.css"
// Конфигурация загрузчика графики устанавливается в файле config.php в папке tiny_mce/plugins/jbimages
});
</script>
<!-- jQuery -->
<script type="text/javascript" src="js/jquery.js"></script>
<script src='jquery.form.js'></script>
<script>
var options = {
target:"#output",
success: function(data){
if($(data).attr("id")=='success'){
$.modal.close();
}
}
};
</script>
<script>
function checklength(t){
var ml = $(t).attr('maxlength');
var diff = ml - $(t).val().length;
var ad = $(t).nextAll('div:first');
if (diff==ml){
ad.html(' ').css('color','green');
}
else if(diff>10){
ad.text('Осталось знаков: '+diff).css('color','green');
}
else{
ad.text('Осталось знаков: '+diff+'!').css('color','red');
}
}
</script>
</head>
<body bgcolor="#FFFFFF">
<form action="firm-server-50.php" method="post" >
<input type="hidden" name="id" value="<?=$id;?>">
<input type="hidden" name="success_href" value="/my-admin/">
<input type="hidden" name="id_rubric" value="1">
<input type="hidden" name="id_firm" value="2">
<input type="hidden" name="ss_firm" value="1/vtoraja-avtomobilnaja-firma">
<p>Краткое описание фирмы</p>
<textarea cols="" rows="" maxlength="100" name="mini_text" style="width:750px;height:50px" ><?=htmlspecialchars($content_show['mini_text']);?></textarea>
<p>Полное описание фирмы </p>
<textarea name="maxi_text" cols="" rows="" style="width:1000px; height:300px" class="editme"><?=$content_show['maxi_text'];?></textarea>
<input type=submit value="Применить">
</form>
<table width="100%" bgcolor="#F2FFFF" >
<tr>
<td style="text-align:center;" colspan="2">
<div id="output"></div>
</td>
</tr>
</table>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: Den*s
(22.04.2014 в 01:22)
| | Мне как то не удается ухватить логику Вашей идеи. В чем преимущество обновление полей по отдельности, если инфа не поступает в переменную $maxi_text с первого клика (а второго не будет)?
Когда мы открыли страницу, то получили в обоих полях textarea какие-то изначальные данные (в реале они берутся из базы, но на макете я их для простоты прописал в HTML коде).
Теперь оператор что-то меняет в тексте и кликает "Применить". Если по каким-то причинам в $_POST передается прежнее значение текста, то как ни обновляйте поля - хоть все сразу, хоть по отдельности - новая инфа в базу не попадет.
Или в Вашем скрипте какая-то иная логика? | |
|
|
|
|
|
|
|
для: Владимир55
(22.04.2014 в 12:25)
| | >Мне как то не удается ухватить логику Вашей идеи. В чем преимущество обновление полей по отдельности, если инфа не поступает в переменную $maxi_text с первого клика (а второго не будет)?
Я писал быстро, стараясь донести суть. Суть в том что нет необходимости подключать js скрипты, которые долго разбирать. Проще сделать обновление прям на этой странице.
Код что я писал можно изменить так
Присваиваем кнопке имя name = "button"
и изменяем код так
<?
if ($_POST["button"])
{
$query = "UPDATE tableName SET mini_text = '$mini_text', maxi_text = '$maxi_text'
WHERE id = '$id' ";
if(!mysql_query($query)) exit(mysql_error());
}
?>
|
>Теперь оператор что-то меняет в тексте и кликает "Применить". Если по каким-то причинам в $_POST передается прежнее значение текста, то как ни обновляйте поля - хоть все сразу, хоть по отдельности - новая инфа в базу не попадет.
Мы вносим текст в поля, нажимаем применить, изменённый текст обновляется в базе за счёт кода в самом начале страницы, потом читается из базы и уже прочитанный размещается в форме.
Много раз так делал. это давно обкатанные блок обновления новостей/статей в администрировании.
Суть: данные полученные через POST обновляем в базе, потом читаем. потом отображаем в полях | |
|
|
|
|
|
|
|
для: Den*s
(23.04.2014 в 17:09)
| | Спасибо, очень интересная идея!
Но ведь на странице имеется код:
<form action="firm-server-50.php" method="post" >
|
Разве при клике на кнопку не должен произойти переход на обработчик firm-server-50.php?
А если мы со страницы уйдем, то в базе все останется по-прежнему! | |
|
|
|
|
|
|
|
для: Владимир55
(23.04.2014 в 23:34)
| | >Разве при клике на кнопку не должен произойти переход на обработчик firm-server-50.php?
firm-server-50.php - это текущая страница, на которой расположена форма с двумя полями.
То есть мы посылаем методом POST данные на эту же страницу (При нажатии на кнопку), на этой же странице сохраняем и отображаем. Думаю не стоит создавать файл с несколькими строчками который будет использовать только одна страница.
для примера в моей админке блок редактирования новостей, приведу кусок кода
<?
$id = @intval($_GET["id"]);
$data = @mysql_real_escape_string($_POST["data"]);
$head = @mysql_real_escape_string($_POST["head"]);
$head_full = @mysql_real_escape_string($_POST["head_full"]);
$content = @mysql_real_escape_string($_POST["content"]);
if ($head)
{
$name_page = ru2Lat($head);
$query = "UPDATE news SET data = '$data', head = '$head', head_full = '$head_full', content = '$content', namePage = '$name_page', title = '$title',
description = '$description', keywords = '$keywords'
WHERE id = '$id' ";
if(!mysql_query($query)) exit(mysql_error());
}
?>
.......
<form action="news_edit.php?id=<?=$id;?>&category=<?=$category;?>" method="post" name="form1" enctype="multipart/form-data">
<p>
<b>Заголовок:</b> <br> <input name="head" type="text" size="70" value="<?=$content_show["head"];?>" id="head" >
</p>
<p>
<strong>Расширенный заголовок:</strong><br>
<textarea name='head_full' cols='90' rows='30' style='width: 95%'><?=$content_show["head_full"];?></textarea>
</p>
<p>
<strong>Полный текст:</strong><br>
<textarea name='content' cols='90' rows='30' style='width: 95%'><?=$content_show["content"];?></textarea>
</p>
<p>
<input type="submit" name="Submit" value="Сохранить">
</p>
</form>
|
> А если мы со страницы уйдем, то в базе все останется по-прежнему!
Это если мы не нажмём кнопку.
Если вы хотите что бы при написании текст сразу сохранялся в базе, то есть написали и он без нажатия на кнопку сохранился в базе. То тут я бы реализовал через jQuery, и то реализация бы заняла несколько строчек. Одна функция и отдельный php файл. | |
|
|
|
|
|
|
|
для: Владимир55
(21.04.2014 в 23:37)
| | Вообще мне кажется это связано с tiny_mce нет ли там каких функций синхронизации (между textarea и tiny_mce)? | |
|
|
|
|
|
|
|
для: KPETuH
(22.04.2014 в 12:50)
| | В определенном смысле, синхронизацией является class="editme". tiny_mce обрабатывает только тот textarea, где этот класс присутствует. | |
|
|
| |
|
|
|
|
для: KPETuH
(22.04.2014 в 13:32)
| | Это что-то очень близко к теме. Я бы попробовал, но не пойму, куда вписать и как использовать это выражение:
var value = tinymce.get('text').getContent();
|
| |
|
|
|
|
|
|
|
для: Владимир55
(22.04.2014 в 13:35)
| | где то так
onSubmit="$('.editme').val(tinymce.get('text').getContent());$(this).ajaxSubmit(options);return false;"
|
только вам еще нужно дать id textarea типа id='text' | |
|
|
|
|