|
|
|
| Добрый вечер!
Нашел скрипт - вывод комменатриев без перезагрущки страницы.
Работатет. Но первоначально комментарии отображаюся не там где надо
Они отображаются над формой, а если посмотреть нижний код - вывод комментариев идет ниже формы.
Стоит перезагрузить страницу - комментарии выводятся в нужном месте.
Где ошибка?
оставить свой комментарий ниже:<br>
<div id='cerror'></div>
<div align="center"><form action="#" method="POST" enctype="multipart/form-data" name="addcom"
id="addcom" onSubmit="return false">
Ваше имя:<br>
<input name="author" type="text" size="30" class="pole" id="author"><br><br>
Текст комментария:<br>
<textarea name="text" rows="5" cols="50" class="text"></textarea><br>
<br>
<input name="id" type="hidden" value="<?php echo $id_pu; ?>">
<input class="adscom" name="button" type="button"
value='Добавить комментарий' onclick="doLoad(document.getElementById('addcom'))">
</form>
</div>
<br><br>
<!--вывод комментариев -->
<?php
$result7 = mysql_query("SELECT text FROM com WHERE post='" . mysql_real_escape_string($id_pu) . "
' ORDER BY id", $db);
$myrow7 = mysql_fetch_array($result7);
if (!empty($myrow7 ['text'])) {
echo "<h1>Комментарии:</h1>";}
$result = mysql_query("SELECT * FROM com WHERE post='" . mysql_real_escape_string($id_pu) . "' ORDER BY id", $db);
if(mysql_num_rows($result) > 0)
{
$comment = mysql_fetch_array($result);
do
{
$text = $comment["text"];
$author = $comment["author"];
$date = $comment["date"];
printf("<div class='content3'><strong>%s</strong><br>Добавлено: %s<br>%s<br><br>
<div class='line'><img src='img/spacer.gif' width='1' height='1'></div></div>
",$author,$date,$text);
}
while ($comment = mysql_fetch_array($result));
}
?>
|
<?
include_once("blocks/bd1.php");
// Запрет на кэширование
header("Expires: Mon, 23 May 1995 02:00:00 GTM");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GTM");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
//****
$log =="";
$error="no"; //флаг наличия ошибки
require_once 'JsHttpRequest.php';
$JsHttpRequest =& new JsHttpRequest("windows-1251");
//Короткие имена переменных и обрезка пробелов img_title
$text = trim($_POST['text']);
$author = trim($_POST['author']);
$id = trim($_POST['id']);
//Проверка email адреса
if($author == ''){
$log .= "<p>Пожалуйста, введите Ваше имя</p><br>";
$error = "yes";
}
//Проверка наличия введенного текста комментария
if (empty($text)){
$log .= "<p>Необходимо указать текст сообщения!</p><br>";
$error = "yes";
}
else{
//Должнен быть хоть один символ на русском языке
$spam=1;
for($i=0;$i<strlen($text);$i++){
if((ord($text[$i])>=192) && (ord($text[$i])<=255)){$spam=0;break;}
}
if ($spam == 1) {
$log .= "<p>Ваше сообщение не содержит ни одной русской буквы.</p><br>";
$error = "yes";
}
}
//Проверка длины текста комментария
if(strlen($text)>1000){
$log .= "<p>Слишком длинный текст, в вашем распоряжении 1000 символов!</p><br>";
$error = "yes";
}
//Проверка на наличие длинных слов
$mas = preg_split("/[\s]+/",$text);
foreach($mas as $index => $val){
if (strlen($val)>40) {
$log .= "<p>Слишком длинные слова (более 40 символов) в тексте записи!</p><br>";
$error = "yes";
break;
}
}
//Экранирование и преобразование опасных символов
if (!get_magic_quotes_gpc()){
$text = addslashes($text);
$author = addslashes($author);
$cod = addslashes($cod);
}
$text = htmlspecialchars($text);
$author = htmlspecialchars($author);
$cod = htmlspecialchars($cod);
//Если нет ошибок добавляем в базу
if($error=="no"){
$date = date("d-m-Y в H:i");
$result2 = mysql_query("INSERT INTO comment_pu (post,author,text,date)
VALUES ('" . mysql_real_escape_string($id) . "','" . mysql_real_escape_string($author) . "','" .
mysql_real_escape_string($text) . "','$date')");
//****
$id_pu = $_REQUEST['id'];
$address = "11klass@mail.ru";
$subject = "ПУ. Новый комментарий на сайте";
$post_title = $myrow3["title"];
$message = "Появился комментарий к заметке - Училища - ".$post_title."<br>
Комментарий добавил(а): ".$author."<br>Текст комментария:
".$text."<br>Ссылка на заметку:<a href='www.11klassniki.ru/post_pu.php?id_pu=".$_REQUEST['id']."'>this is link</a>";
$headers = 'Content-Type: text/html;charset=windows-1251';
mail($address,$subject,$message,$headers);
$ok="<div><p><strong>".$author."</strong><br>Добавлено: ".$date."<br>".$text."</p></div>";
//Помещаем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'no',
'ok' => $ok
);
}
else {//если ошибки есть
$log = "<div><strong><font color='red'> Ошибка! </font></strong><br>".$log."</div>";
//Отправляем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'yes',
'er_mess' => $log);
}
?>
|
| |
|
|
|
|
|
|
|
для: Василий
(28.12.2011 в 19:38)
| | Судя по вашей форме, комментарии добавляются функцией doLoad, и приживляются в блок, который имеет id="addcom", а такой id назначен тегу form. Если вы создадите div id="addcom", который будет находиться ниже закрывающего тега form, то получите нужный результат. Если не заработает, показывайте javascript код добавления комментариев без перезагрузки. | |
|
|
|
|
|
|
|
для: deimand
(28.12.2011 в 20:19)
| | поставил <div id='addcom'></div> в конце формы. так без изменений
<div id='cerror'></div>
<div align="center"><form action="#" method="POST" enctype="multipart/form-data" name="addcom"
id="addcom" onSubmit="return false">
Ваше имя:<br>
<input name="author" type="text" size="30" class="pole" id="author"><br><br>
Текст комментария:<br>
<textarea name="text" rows="5" cols="50" class="text"></textarea><br>
<br>
<input name="id" type="hidden" value="<?php echo $id_pu; ?>">
<input class="adscom" name="button" type="button"
value='Добавить комментарий' onclick="doLoad(document.getElementById('addcom'))">
</form>
</div>
<div id='addcom'></div>
|
| |
|
|
|
|
|
|
|
для: Василий
(28.12.2011 в 20:57)
| | Я же написал "Если не заработает, показывайте javascript код добавления комментариев без перезагрузки." как раз предвидя то, что ничего не изменится.
А еще может быть потому что, новый блок Вы добавили, а у тега form id не убрали. | |
|
|
|
|
|
|
|
для: deimand
(28.12.2011 в 21:37)
| | так вообще не работает
а как показать javascript код добавления комментариев без перезагрузки | |
|
|
|
|
|
|
|
для: Василий
(28.12.2011 в 21:46)
| | Так же как и php код - взять кусочек кода, который описывает функцию doLoad и запостить сюда. | |
|
|
|
|
|
|
|
для: deimand
(28.12.2011 в 21:51)
| | простите вас не понял.
будьте добры, поподробнее обяъсните | |
|
|
|
|
|
|
|
для: Василий
(28.12.2011 в 22:32)
| | Вы же где-то в коде подключаете javascript, с помощью которого добавляются комментарии?
Вы сами писали
Нашел скрипт - вывод комменатриев без перезагрущки страницы.
Работатет. Но первоначально комментарии отображаюся не там где надо
|
Этот скрипт, который Вы нашли, нужно немного исправить - и будет Вас счастье.
Можете прикрепить архив с тем что Вы нашли? Под формой ввода сообщения (здесь, на форуме) имеется поле для загрузки файлов на сервер. | |
|
|
|
|
|
|
|
для: deimand
(28.12.2011 в 23:09)
| | и вправду, вот подключение. снизу привожу два этих файла.
и что с ними сделать? Один из них ссылает на comment.php
<!-- Для комментариев-->
<script type="text/javascript" src="js/comment_pu.js"></script>
<script type="text/javascript" src="js/JsHttpRequest.js"></script>
|
// JavaScript Document
function doLoad(value){
err=document.getElementById('cerror');
err.innerHTML = "<img src='images/upload.gif' width='32' height='8'><br>
<p>Ваш комментарий обрабатывается...</p>";
// Create new JsHttpRequest object.
var req = new JsHttpRequest();
// Code automatically called on load finishing.
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.responseJS.error == 'no') {
// Clear error information.
err.innerHTML = "";
// Write req.responseJS to page element (_req.responseJS become responseJS).
err.innerHTML = req.responseJS.ok;
form = document.getElementById('addcom');
form.text.value = "";
form.author.value = "";
}
else
{
err.innerHTML = req.responseJS.er_mess;
}
}
}
// Prepare request object (automatically choose GET or POST).
req.open(null, 'comment_pu.php', true);
// Send data to backend.
req.send( { q: value } );
}
|
/**
* JsHttpRequest: JavaScript "AJAX" data loader (form support only!)
* Minimized version: see debug directory for the complete one.
*
* @license LGPL
* @author Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/
* @version 5.x $Id$
*/
function JsHttpRequest(){
var t=this;
t.onreadystatechange=null;
t.readyState=0;
t.responseText=null;
t.responseXML=null;
t.status=200;
t.statusText="OK";
t.responseJS=null;
t.caching=false;
t.loader=null;
t.session_name="PHPSESSID";
t._ldObj=null;
t._reqHeaders=[];
t._openArgs=null;
t._errors={inv_form_el:"Invalid FORM element detected: name=%, tag=%",must_be_single_el:"If used,
<form> must be a single HTML element in the list.",js_invalid:"JavaScript code generated by backend is
invalid!\n%",url_too_long:"Cannot use so long query with GET request (URL is larger than %
bytes)",unk_loader:"Unknown loader: %",no_loaders:"No loaders registered at all, please check
JsHttpRequest.LOADERS array",no_loader_matched:"Cannot find a loader which may process the
request. Notices are:\n%"};
t.abort=function(){
with(this){
if(_ldObj&&_ldObj.abort){
_ldObj.abort();
}
_cleanup();
if(readyState==0){
return;
}
if(readyState==1&&!_ldObj){
readyState=0;
return;
}
_changeReadyState(4,true);
}
};
t.open=function(_2,_3,_4,_5,_6){
with(this){
if(_3.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){
this.loader=RegExp.$2?RegExp.$2:null;
_2=RegExp.$3;
_3=RegExp.$4;
}
try{
if(document.location.search.match(new RegExp("[&?]"+session_name+"=([^&?]*)"))||document.cookie.match(new RegExp("(?:;|^)\\s*"+session_name+"=([^;]*)"))){
_3+=(_3.indexOf("?")>=0?"&":"?")+session_name+"="+this.escape(RegExp.$1);
}
}
catch(e){
}
_openArgs={method:(_2||"").toUpperCase(),url:_3,asyncFlag:_4,username:_5!=null?_5:"",password:_6!=null?_6:""};
_ldObj=null;
_changeReadyState(1,true);
return true;
}
};
t.send=function(_7){
if(!this.readyState){
return;
}
this._changeReadyState(1,true);
this._ldObj=null;
var _8=[];
var _9=[];
if(!this._hash2query(_7,null,_8,_9)){
return;
}
var _a=null;
if(this.caching&&!_9.length){
_a=this._openArgs.username+":"+this._openArgs.password+"@"+this._openArgs.url+"|"+_8+"#"+this._openArgs.method;
var _b=JsHttpRequest.CACHE[_a];
if(_b){
this._dataReady(_b[0],_b[1]);
return false;
}
}
var _c=(this.loader||"").toLowerCase();
if(_c&&!JsHttpRequest.LOADERS[_c]){
return this._error("unk_loader",_c);
}
var _d=[];
var _e=JsHttpRequest.LOADERS;
for(var _f in _e){
var ldr=_e[_f].loader;
if(!ldr){
continue;
}
if(_c&&_f!=_c){
continue;
}
var _11=new ldr(this);
JsHttpRequest.extend(_11,this._openArgs);
JsHttpRequest.extend(_11,{queryText:_8.join("&"),queryElem:_9,id:(new
Date().getTime())+""+JsHttpRequest.COUNT++,hash:_a,span:null});
var _12=_11.load();
if(!_12){
this._ldObj=_11;
JsHttpRequest.PENDING[_11.id]=this;
return true;
}
if(!_c){
_d[_d.length]="- "+_f.toUpperCase()+": "+this._l(_12);
}else{
return this._error(_12);
}
}
return _f?this._error("no_loader_matched",_d.join("\n")):this._error("no_loaders");
};
t.getAllResponseHeaders=function(){
with(this){
return _ldObj&&_ldObj.getAllResponseHeaders?_ldObj.getAllResponseHeaders():[];
}
};
t.getResponseHeader=function(_13){
with(this){
return _ldObj&&_ldObj.getResponseHeader?_ldObj.getResponseHeader(_13):null;
}
};
t.setRequestHeader=function(_14,_15){
with(this){
_reqHeaders[_reqHeaders.length]=[_14,_15];
}
};
t._dataReady=function(_16,js){
with(this){
if(caching&&_ldObj){
JsHttpRequest.CACHE[_ldObj.hash]=[_16,js];
}
responseText=responseXML=_16;
responseJS=js;
if(js!==null){
status=200;
statusText="OK";
}else{
status=500;
statusText="Internal Server Error";
}
_changeReadyState(2);
_changeReadyState(3);
_changeReadyState(4);
_cleanup();
}
};
t._l=function(_18){
var i=0,p=0,msg=this._errors[_18[0]];
while((p=msg.indexOf("%",p))>=0){
var a=_18[++i]+"";
msg=msg.substring(0,p)+a+msg.substring(p+1,msg.length);
p+=1+a.length;
}
return msg;
};
t._error=function(msg){
msg=this._l(typeof (msg)=="string"?arguments:msg);
msg="JsHttpRequest: "+msg;
if(!window.Error){
throw msg;
}else{
if((new Error(1,"test")).description=="test"){
throw new Error(1,msg);
}else{
throw new Error(msg);
}
}
};
t._hash2query=function(_1e,_1f,_20,_21){
if(_1f==null){
_1f="";
}
if((""+typeof (_1e)).toLowerCase()=="object"){
var _22=false;
if(_1e&&_1e.parentNode&&_1e.parentNode.appendChild&&_1e.tagName&&_1e.tagName.toUpperCase()=="FORM"){
_1e={form:_1e};
}
for(var k in _1e){
var v=_1e[k];
if(v instanceof Function){
continue;
}
var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k);
var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName;
if(_26){
var tn=v.tagName.toUpperCase();
if(tn=="FORM"){
_22=true;
}else{
if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){
}else{
return this._error("inv_form_el",(v.name||""),v.tagName);
}
}
_21[_21.length]={name:_25,e:v};
}else{
if(v instanceof Object){
this._hash2query(v,_25,_20,_21);
}else{
if(v===null){
continue;
}
if(v===true){
v=1;
}
if(v===false){
v="";
}
_20[_20.length]=_25+"="+this.escape(""+v);
}
}
if(_22&&_21.length>1){
return this._error("must_be_single_el");
}
}
}else{
_20[_20.length]=_1e;
}
return true;
};
t._cleanup=function(){
var _28=this._ldObj;
if(!_28){
return;
}
JsHttpRequest.PENDING[_28.id]=false;
var _29=_28.span;
if(!_29){
return;
}
_28.span=null;
var _2a=function(){
_29.parentNode.removeChild(_29);
};
JsHttpRequest.setTimeout(_2a,50);
};
t._changeReadyState=function(s,_2c){
with(this){
if(_2c){
status=statusText=responseJS=null;
responseText="";
}
readyState=s;
if(onreadystatechange){
onreadystatechange();
}
}
};
t.escape=function(s){
return escape(s).replace(new RegExp("\\+","g"),"%2B");
};
}
JsHttpRequest.COUNT=0;
JsHttpRequest.MAX_URL_LEN=2000;
JsHttpRequest.CACHE={};
JsHttpRequest.PENDING={};
JsHttpRequest.LOADERS={};
JsHttpRequest._dummy=function(){
};
JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout};
JsHttpRequest.setTimeout=function(_2e,dt){
window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s;
if(typeof (_2e)=="string"){
id=window.JsHttpRequest_tmp(_2e,dt);
}else{
var id=null;
var _31=function(){
_2e();
delete JsHttpRequest.TIMEOUTS[id];
};
id=window.JsHttpRequest_tmp(_31,dt);
JsHttpRequest.TIMEOUTS[id]=_31;
}
window.JsHttpRequest_tmp=null;
return id;
};
JsHttpRequest.clearTimeout=function(id){
window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c;
delete JsHttpRequest.TIMEOUTS[id];
var r=window.JsHttpRequest_tmp(id);
window.JsHttpRequest_tmp=null;
return r;
};
JsHttpRequest.query=function(url,_35,_36,_37){
var req=new this();
req.caching=!_37;
req.onreadystatechange=function(){
if(req.readyState==4){
_36(req.responseJS,req.responseText);
}
};
req.open(null,url,true);
req.send(_35);
};
JsHttpRequest.dataReady=function(d){
var th=this.PENDING[d.id];
delete this.PENDING[d.id];
if(th){
th._dataReady(d.text,d.js);
}else{
if(th!==false){
throw "dataReady(): unknown pending id: "+d.id;
}
}
};
JsHttpRequest.extend=function(_3b,src){
for(var k in src){
_3b[k]=src[k];
}
};
JsHttpRequest.LOADERS.form={loader:function(req){
JsHttpRequest.extend(req._errors,{form_el_not_belong:"Element \"%\" does not belong to any
form!",form_el_belong_diff:"Element \"%\" belongs to a different form. All elements must belong to the
same form!",form_el_inv_enctype:"Attribute \"enctype\" of the form must be \"%\" (for IE), \"%\" given."});
this.load=function(){
var th=this;
if(!th.method){
th.method="POST";
}
th.url+=(th.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+th.id+"-"+"form";
if(th.method=="GET"){
if(th.queryText){
th.url+=(th.url.indexOf("?")>=0?"&":"?")+th.queryText;
}
if(th.url.length>JsHttpRequest.MAX_URL_LEN){
return ["url_too_long",JsHttpRequest.MAX_URL_LEN];
}
var p=th.url.split("?",2);
th.url=p[0];
th.queryText=p[1]||"";
}
var _41=null;
var _42=false;
if(th.queryElem.length){
if(th.queryElem[0].e.tagName.toUpperCase()=="FORM"){
_41=th.queryElem[0].e;
_42=true;
th.queryElem=[];
}else{
_41=th.queryElem[0].e.form;
for(var i=0;i<th.queryElem.length;i++){
var e=th.queryElem[i].e;
if(!e.form){
return ["form_el_not_belong",e.name];
}
if(e.form!=_41){
return ["form_el_belong_diff",e.name];
}
}
}
if(th.method=="POST"){
var _45="multipart/form-data";
var _46=(_41.attributes.encType&&_41.attributes.encType.nodeValue)||(_41.attributes.enctype&&
_41.attributes.enctype.value)||_41.enctype;
if(_46!=_45){
return ["form_el_inv_enctype",_45,_46];
}
}
}
var d=_41&&(_41.ownerDocument||_41.document)||document;
var _48="jshr_i_"+th.id;
var s=th.span=d.createElement("DIV");
s.style.position="absolute";
s.style.display="none";
s.style.visibility="hidden";
s.innerHTML=(_41?"":"<form"+(th.method=="POST"?" enctype=\"multipart/form-data\" method=\"post
\"":"")+"></form>")+"<iframe name=\""+_48+"\" id=\""+_48+"\" style=\"width:0px; height:0px; overflow:hidden;
border:none\"></iframe>";
if(!_41){
_41=th.span.firstChild;
}
d.body.insertBefore(s,d.body.lastChild);
var _4a=function(e,_4c){
var sv=[];
var _4e=e;
if(e.mergeAttributes){
var _4e=d.createElement("form");
_4e.mergeAttributes(e,false);
}
for(var i=0;i<_4c.length;i++){
var k=_4c[i][0],v=_4c[i][1];
sv[sv.length]=[k,_4e.getAttribute(k)];
_4e.setAttribute(k,v);
}
if(e.mergeAttributes){
e.mergeAttributes(_4e,false);
}
return sv;
};
var _52=function(){
top.JsHttpRequestGlobal=JsHttpRequest;
var _53=[];
if(!_42){
for(var i=0,n=_41.elements.length;i<n;i++){
_53[i]=_41.elements[i].name;
_41.elements[i].name="";
}
}
var qt=th.queryText.split("&");
for(var i=qt.length-1;i>=0;i--){
var _57=qt[i].split("=",2);
var e=d.createElement("INPUT");
e.type="hidden";
e.name=unescape(_57[0]);
e.value=_57[1]!=null?unescape(_57[1]):"";
_41.appendChild(e);
}
for(var i=0;i<th.queryElem.length;i++){
th.queryElem[i].e.name=th.queryElem[i].name;
}
var sv=_4a(_41,[["action",th.url],["method",th.method],["onsubmit",null],["target",_48]]);
_41.submit();
_4a(_41,sv);
for(var i=0;i<qt.length;i++){
_41.lastChild.parentNode.removeChild(_41.lastChild);
}
if(!_42){
for(var i=0,n=_41.elements.length;i<n;i++){
_41.elements[i].name=_53[i];
}
}
};
JsHttpRequest.setTimeout(_52,100);
return null;
};
}};
|
| |
|
|
|
|
|
|
|
для: Василий
(29.12.2011 в 01:22)
| | У Вас просто и положительный и отрицательный результаты, добавляются в блок вывода ошибок, который иммет id="cerror"
Чтобы комментарии вставлялись туда, куда захотите, необходимо сделать следующее:
Создайте на странице блок(div), в том месте, куда хотите чтобы комментарии добавлялись.
Назначьте этому блоку какой-нибудь id, например id="resultid".
Теперь в функии doLoad,
которая начинается со строк
// JavaScript Document
function doLoad(value){
err=document.getElementById('cerror');
|
после строки
if (req.responseJS.error == 'no') {
|
вместо
// Clear error information.
err.innerHTML = "";
// Write req.responseJS to page element (_req.responseJS become responseJS).
err.innerHTML = req.responseJS.ok;
|
напишите
// Clear error information.
err.innerHTML = "";
// Write req.responseJS to page element (_req.responseJS become responseJS).
document.getElementById('resultid').innerHTML = req.responseJS.ok;
|
Таким образом вы даете понять обработчику, что результат нужно вставить в блок с id равным resultid.
Все остальное оставьте без изменений.
Следующая проблема с которой вы столкнетесь - при добавлении первого комментария не появляется заголовок "Комментарии", так как он у вас заранее не выводится, потому что комментарии до этого отсутствовали.
Вам потребуется изменить обработчик "добавления комментариев без перезагрузки страницы", и в случае если был добавлен первый комментарий - вывести его с заголовком "Комментарии", чтобы сразу получить такой же результат, который будет после обновления страницы.
Для этого можно перед добавлением текста комментария, но после проверки данных на корректность, а это у вас после этих строк
<?php
//Если нет ошибок добавляем в базу
if($error=="no"){
$date = date("d-m-Y в H:i");
|
сделать запрос к базе и посчитать количество комментариев к этой статье и если оно равно нулю, то в дополнение к комментарию, вывести заголовок "Комментарии", который приписать к началу этой строки
<?php $ok="<div><p><strong>".$author."</strong><br>Добавлено: ".$date."<br>".$text."</p></div>";
|
| |
|
|
|
|
|
|
|
для: deimand
(29.12.2011 в 10:20)
| | спасибо. все работает.
С Наступащим Вас, уважаемый Deimand!
Все благ и счастья в Новом году! | |
|
|
|
|