Загрузка формы и отправка её с использованием Ajax

Несложная система комментирования с использованиям Ajax. Не использует никаких баз данных. Сообщения добавляются непосредственно в код html или php страниц.

Для начала разместим кнопку и div или span, в который будем подгружать форму:

<span id="insertComment">
<input type="submit"
    onclick="return ajaxLoad('insertComment','/send.php');"
    value="Прокомментировать" />
</span>

В этом примере мы поместили кнопку внуть span-а, в который будет загружаться форма. Это сделано в связи с тем, что после загрузки формы кнопка нам больше не понадобиться.

Наша функция ajaxLoad, которая часто встречается в моих примерах:
function ajaxLoad(obj,url,defMessage,post,callback){
  var ajaxObj;
  if (defMessage) document.getElementById(obj).innerHTML=defMessage;
  if(window.XMLHttpRequest){
      ajaxObj = new XMLHttpRequest();
  } else if(window.ActiveXObject){
      ajaxObj = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
      return;
  }
  //ajaxObj.open ('GET', location.href+'?ps='+page);
  ajaxObj.open ((post?'POST':'GET'), url);
  if (post&&ajaxObj.setRequestHeader)
      ajaxObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251;");
  ajaxObj.onreadystatechange = ajaxCallBack(obj,ajaxObj,(callback?callback:null));
  ajaxObj.send(post);
  return false;
  }
function updateObj(obj, data, bold, blink){
   if(bold)data=data.bold();
   if(blink)data=data.blink();
   if(document.getElementById(obj).tagName=='INPUT') document.getElementById(obj).value=data;
   else document.getElementById(obj).innerHTML = data;
  }
function ajaxCallBack(obj, ajaxObj, callback){
return function(){
    if(ajaxObj.readyState == 4){
       if(callback) if(!callback(obj,ajaxObj))return;
       if (ajaxObj.status==200)
        updateObj(obj, ajaxObj.responseText);
       else updateObj(obj, ajaxObj.status+' '+ajaxObj.statusText,1,1);
    }
}}

function SendComment(){
  formComment=document.frmcomment;
  if(!formComment.comment.value){updateObj('answer', 'Пустой комментарий!',1,1); return;}
  if (!IsMail(formComment.mail.value, true)){updateObj('answer', 'Mail или пустой или корректный!',1,1); return;}
 str=''
 for (i=0; i<formComment.length; i++) if(formComment[i].name){
     str=str+encodeURIComponent(formComment[i].name)+'='+encodeURIComponent(formComment[i].value)+'&';
     }
  str=str.slice(0,-1);
  ajaxLoad('answer','/send.php','Отправка...', str)
 }

Не будем на ней останавливаться подробно, т.к. она неоднократно описана на страницах http://htmlweb.ru/ajax/

Далее рассмотрим систему отображения формы по Ajax-запросу и записи комментариев.

<?
// Универсальная система добавления комментариев на страницы любого сайта с использованием технологии Ajax
// Вы можете использовать данный код в любых своих разработках с сохранением этого комментария
// Размещение исходного кода на сайтах возможно только при наличии активной ссылки на первоисточник:
// http://HTMLWEB.RU/ajax/example/load_form.php
// Все остальные права принадлежат автору: Колесникову Дмитрию Геннадьевичу

$u_name=param('name');
$u_mail=param('mail');
$u_www=param('www');
$DEBUG= (getenv('REMOTE_ADDR')=='127.0.0.1');

$HTTP_REFERER    = @$_SERVER['HTTP_REFERER'];
$comment=@$_POST['comment'];
if (empty($comment)) {
?>
<form name="frmcomment" method="post" ONSUBMIT="SendComment();return false;">
Имя: <input type="text" name="name" size=18 value="<?=$u_name?>" />      
E-mail:<input type="text" name="mail" size=18 value="<?=$u_mail?>" title="Защищен от спама" /><br />
<textarea name="comment" rows="4" style="width:100%"></textarea>
<INPUT TYPE="SUBMIT" VALUE="Поделиться мыслями"  class="submit" />
<input type="hidden" name="url" value="<?=substr($HTTP_REFERER,strlen("http://".$_SERVER['SERVER_NAME']))?>" />
</form><span id="answer"></span>
<?
exit;
}

$logfile=$_SERVER['DOCUMENT_ROOT']."/log/comment.txt";
if(!isset($add_mes) && is_file($logfile)){
   $t=((int)((time()-filemtime($logfile))));
   if($t<60){echo "Нельзя отправлять сообщения чаще, чем раз в минуту!";exit;}
   }

// при запросе через ajax всё всегда передается в UTF-8
$u_name=@iconv("UTF-8", "windows-1251//IGNORE", $u_name);
$comment=@iconv("UTF-8", "windows-1251//IGNORE", $comment);

// Вы можете добавить защиту от спамеров, но не забудьте при отправке формы через Ajax устанавливать поле referer
//if (!isset($HTTP_REFERER) || (strpos($HTTP_REFERER, "htmlweb.ru") === false)  )die('Запрос из вне сайта!');

// отправляем сообщение админу сайта
$body=date("d.m.Y H:i", time())."\n".$_SERVER['REQUEST_URI']."\nИмя: ".$u_name."\nMail:".$u_mail."\nip:".$ip."\n".$comment."\n";    // сообщение администратору
file_put_contents ( $logfile, $body."\r\n" , FILE_APPEND);
if(mail("admin@".$_SERVER['SERVER_NAME'], "Сообщение из ".$HTTP_REFERER, $body, "From: <".$u_mail.">\nContent-Type: text/plain; charset=windows-1251"))
    echo "Спасибо, Ваше сообщение отправлено!";
else    echo "К сожалению, отправка сообщения не удалась!";

// добавляем сообщение на страницу
  $file_name=$_SERVER['DOCUMENT_ROOT'].$url; // адрес страницы
  if(file_exists($file_name)){
    if(!empty($u_name)){$body=htmlspecialchars($u_name);
      if(!empty($u_mail))$body="<a href='' title='e-mail' onclick=\"this.href='mailto:".$u_mail."'\"><b>".$body.'</b></a>';
      }else $body='';
    $body='<span class="time">'.date("d.m.Y H:i", time()).$comment.'</span>'.$body;
    $body.="<br />\n".nl2br(AddBB(htmlspecialchars($comment)))."\n";
    $body='<div class="comment">'.$body."</div><br />";
    // добавляем в конец
    // на самом деле, желательно вставлять в какое-то определенное место.
    file_put_contents ( $file_name, "\r\n".$body."\r\n" , FILE_APPEND);
    } else die('Не удалось добавить комментарий в '.$file_name);


function AddBB($comment) {
// делаем ссылки активными
$comment = preg_replace("/\s(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))\s/i", " <a href=\"$1\" target=_blank>$3</a> ", $comment);
$comment = preg_replace("/\s(www\.([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))\s/i", " <a href=\"http://$1\" target=_blank>$2</a> ", $comment);
// можно сделать преобразование BB-кодов
// пример смотри на http://htmlweb.ru/php/example/bb_code.php

// можно совсем удалять все теги
//$comment=strip_tags($comment);

return $comment;}

function param($param) {
  $param=(isset($_GET[$param])?$_GET[$param]:(isset($_POST[$param])?$_POST[$param]:false));
  if (get_magic_quotes_gpc()) $param=stripslashes($param);
  return $param;
}
?>

.