Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Странный комбинационный эффект
 
 автор: Владимир55   (21.04.2014 в 23:37)   письмо автору
 
 

В форме ввода имеются два 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>');

  Ответить  
 
 автор: Den*s   (21.04.2014 в 23:40)   письмо автору
 
   для: Владимир55   (21.04.2014 в 23:37)
 

Если два окна значит два UPDATE к базе.
Видимо второй UPDATE стоит ниже вывода содержимого второго окна.
А вообще, желательно бы код всей страницы

  Ответить  
 
 автор: Владимир55   (21.04.2014 в 23:41)   письмо автору
 
   для: 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('&nbsp;').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>

  Ответить  
 
 автор: Den*s   (21.04.2014 в 23:47)   письмо автору
 
   для: Владимир55   (21.04.2014 в 23:41)
 

Прикрепите ещё файл jquery.form.js (находится в папке js)
А то отправка формы судя по всему идёт через ajax

  Ответить  
 
 автор: Владимир55   (21.04.2014 в 23:54)   письмо автору
31.2 Кб
 
   для: Den*s   (21.04.2014 в 23:47)
 

Во вложении.

  Ответить  
 
 автор: Владимир55   (21.04.2014 в 23:56)   письмо автору
8.1 Кб
 
   для: Владимир55   (21.04.2014 в 23:54)
 

Этот же файл в архивированом виде.

  Ответить  
 
 автор: Den*s   (22.04.2014 в 00:16)   письмо автору
61.3 Кб
 
   для: Владимир55   (21.04.2014 в 23:56)
 

У меня вообще появляются ещё 2 формы, в которых написаны исходные значения зашитые в html или js/jquery. Это если не подключать tinymce
А если подключать то пустой экран. Возможно как то js скрипты криво пересекаются.
А вообще какая задача стоит?
Куда должны сохраняться данные с форм "Краткое описание фирмы" и "Полное описание фирмы"
Зачем столько нагромождений

  Ответить  
 
 автор: Владимир55   (22.04.2014 в 00:31)   письмо автору
 
   для: Den*s   (22.04.2014 в 00:16)
 

Данные с форм отправляются в базу, но суть не в этом. С базой все нормально, проблема лишь в части, которую я описал.

Зачем столько нагромождений
Что именно Вам представлеятся нагромождением?
Если можно что-то упростить, то это хорошо, но это не самоцель.

Возможно как то js скрипты криво пересекаются.
Как можно предположить, проблема именно в этом.

  Ответить  
 
 автор: Den*s   (22.04.2014 в 01:22)   письмо автору
 
   для: Владимир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('&nbsp;').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>

  Ответить  
 
 автор: Владимир55   (22.04.2014 в 12:25)   письмо автору
 
   для: Den*s   (22.04.2014 в 01:22)
 

Мне как то не удается ухватить логику Вашей идеи. В чем преимущество обновление полей по отдельности, если инфа не поступает в переменную $maxi_text с первого клика (а второго не будет)?

Когда мы открыли страницу, то получили в обоих полях textarea какие-то изначальные данные (в реале они берутся из базы, но на макете я их для простоты прописал в HTML коде).

Теперь оператор что-то меняет в тексте и кликает "Применить". Если по каким-то причинам в $_POST передается прежнее значение текста, то как ни обновляйте поля - хоть все сразу, хоть по отдельности - новая инфа в базу не попадет.

Или в Вашем скрипте какая-то иная логика?

  Ответить  
 
 автор: Den*s   (23.04.2014 в 17:09)   письмо автору
 
   для: Владимир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 обновляем в базе, потом читаем. потом отображаем в полях

  Ответить  
 
 автор: Владимир55   (23.04.2014 в 23:34)   письмо автору
 
   для: Den*s   (23.04.2014 в 17:09)
 

Спасибо, очень интересная идея!

Но ведь на странице имеется код:
<form action="firm-server-50.php" method="post" > 


Разве при клике на кнопку не должен произойти переход на обработчик firm-server-50.php?

А если мы со страницы уйдем, то в базе все останется по-прежнему!

  Ответить  
 
 автор: Den*s   (24.04.2014 в 00:44)   письмо автору
 
   для: Владимир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 файл.

  Ответить  
 
 автор: KPETuH   (22.04.2014 в 12:50)   письмо автору
 
   для: Владимир55   (21.04.2014 в 23:37)
 

Вообще мне кажется это связано с tiny_mce нет ли там каких функций синхронизации (между textarea и tiny_mce)?

  Ответить  
 
 автор: Владимир55   (22.04.2014 в 13:21)   письмо автору
 
   для: KPETuH   (22.04.2014 в 12:50)
 

В определенном смысле, синхронизацией является class="editme". tiny_mce обрабатывает только тот textarea, где этот класс присутствует.

  Ответить  
 
 автор: KPETuH   (22.04.2014 в 13:32)   письмо автору
 
   для: Владимир55   (22.04.2014 в 13:21)
 

Посмотрите вот это вам не поможет?

http://stackoverflow.com/questions/6830541/getting-value-of-textarea-which-is-under-control-of-tinymce-editor-using-jquery

  Ответить  
 
 автор: Владимир55   (22.04.2014 в 13:35)   письмо автору
 
   для: KPETuH   (22.04.2014 в 13:32)
 

Это что-то очень близко к теме. Я бы попробовал, но не пойму, куда вписать и как использовать это выражение:
var value = tinymce.get('text').getContent();

  Ответить  
 
 автор: KPETuH   (22.04.2014 в 13:49)   письмо автору
 
   для: Владимир55   (22.04.2014 в 13:35)
 

где то так
onSubmit="$('.editme').val(tinymce.get('text').getContent());$(this).ajaxSubmit(options);return false;"


только вам еще нужно дать id textarea типа id='text'

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования