Ajax jQuery PHP обновить данные вовремя
файловый менеджер на php 5 и jquery
интерфейс 2х панельный чтото вроде тотала
Код:
$.get("/index.php/file/copy",{path:escape(cop1),pathTo:escape(cop2)},refresh(pc,pc2));
вот так я обращаюсь к серверу для копирования(к примеру, та же проблема и с удалением и с перемещением итд)
всё срабатывает, папка или файл копируются без проблем но храмает обратная связь
Код:
refresh(pc,pc2)
кто подскажет решение данной проблему
заранее спасибо)
Возможно, сначала отправляется на сервер запрос на копирование, но он выполняется дольше, чем обновление и поэтому список обновляется не правильно.
хочу исправить это но не в ущерб скорости работы
Что значит "не вовремя"? опишите подробнее
Я про это и говорил "не правильно обновляется". Список обновляется, возможно, до того как завершается копирование.
клиент
Код:
<script type="text/javascript" language="javascript">
function cop(){
var pc=$("#p1").text();
var pc2=$("#p2").text();
if(pc==pc2){exit;};
var cop1=$(".work1",$(".trSelected").get(0)).text();
var cop2=$(".work2",$(".trSelected").get(0)).text();
if((cop1=="..")||(cop1=="../")){exit;};
if((cop2=="..")||(cop2=="../")){exit;};
if((cop1==".")||(cop1=="./")){exit;};
if((cop2==".")||(cop2=="./")){exit;};
if((cop2=='')&&(cop1!='')){
cop2=pc2+'/'+cop1;
cop1=pc+'/'+cop1;
$.get("/testdrive/index.php/file/copy",{path:escape(cop1),pathTo:escape(cop2)},refresh(pc,pc2));
}
if((cop1=='')&&(cop2!='')){
cop1=pc+'/'+cop2;
cop2=pc2+'/'+cop2;
$.get("/testdrive/index.php/file/copy",{path:escape(cop2),pathTo:escape(cop1)},refresh(pc,pc2));
}
};
</script>
<table id="opMenu" width="200">
<tbody>
<td id="cop" width="50"><button onclick="cop();">Copy</button></td>
</tbody>
</table>
function cop(){
var pc=$("#p1").text();
var pc2=$("#p2").text();
if(pc==pc2){exit;};
var cop1=$(".work1",$(".trSelected").get(0)).text();
var cop2=$(".work2",$(".trSelected").get(0)).text();
if((cop1=="..")||(cop1=="../")){exit;};
if((cop2=="..")||(cop2=="../")){exit;};
if((cop1==".")||(cop1=="./")){exit;};
if((cop2==".")||(cop2=="./")){exit;};
if((cop2=='')&&(cop1!='')){
cop2=pc2+'/'+cop1;
cop1=pc+'/'+cop1;
$.get("/testdrive/index.php/file/copy",{path:escape(cop1),pathTo:escape(cop2)},refresh(pc,pc2));
}
if((cop1=='')&&(cop2!='')){
cop1=pc+'/'+cop2;
cop2=pc2+'/'+cop2;
$.get("/testdrive/index.php/file/copy",{path:escape(cop2),pathTo:escape(cop1)},refresh(pc,pc2));
}
};
</script>
<table id="opMenu" width="200">
<tbody>
<td id="cop" width="50"><button onclick="cop();">Copy</button></td>
</tbody>
</table>
на сервере
сначало запрос идёт сюда
Код:
public function actionCopy(){
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
{
$this->copy(
realpath(dirname(__FILE__).'\..\..\workDir').str_replace("/","\\",$this->unicodeUrlDecode($_GET['path'])),
realpath(dirname(__FILE__).'\..\..\workDir').str_replace("/","\\",$this->unicodeUrlDecode($_GET['pathTo'])));
}
}
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
{
$this->copy(
realpath(dirname(__FILE__).'\..\..\workDir').str_replace("/","\\",$this->unicodeUrlDecode($_GET['path'])),
realpath(dirname(__FILE__).'\..\..\workDir').str_replace("/","\\",$this->unicodeUrlDecode($_GET['pathTo'])));
}
}
потом вызывается функция копирования
Код:
public function copy($what,$where){
if(realpath($what)==realpath(dirname(__FILE__).'\..\..\workDir')||realpath($what)==realpath(dirname(__FILE__).'\..\..\workDir\\')){
exit;
};
if(is_file($what)){
if(!copy($what,$where)){
return(1);
}
};
if(is_dir($what)){
mkdir($where);
$scr=scandir($what);
array_shift($scr);
array_shift($scr);
foreach($scr as $i)
{
$this->copy($what.'\\'.$i,$where.'\\'.$i);
}
};
return(0);
}
if(realpath($what)==realpath(dirname(__FILE__).'\..\..\workDir')||realpath($what)==realpath(dirname(__FILE__).'\..\..\workDir\\')){
exit;
};
if(is_file($what)){
if(!copy($what,$where)){
return(1);
}
};
if(is_dir($what)){
mkdir($where);
$scr=scandir($what);
array_shift($scr);
array_shift($scr);
foreach($scr as $i)
{
$this->copy($what.'\\'.$i,$where.'\\'.$i);
}
};
return(0);
}
refresh(pc,pc2) показывать не стал потому как это просто обновление и проблема происходит до него
Так вот когда нижимаю кнопу Copy
файл\папка копируется но refresh(pc,pc2) срабатывает раньше и в результате в менеджере мы не видим что файл\папка были скопированы
и приходиться ещё раз обновить данные
А не проще ли сделать чтобы рефреш запускался только после того как скрипт выполняющий копирование ответит что копирование закончено?
это просто мой первый проект вообще работы с веб
тк что местами элементарных вещей не знаю
Код:
$.post("/testdrive/index.php/file/copy",{path: escape(cop2), pathTo: escape(cop1)},
function(data)
{
if(data==1) refresh(pc,pc2);
else alert("Script has returned error. Data="+data);
});
function(data)
{
if(data==1) refresh(pc,pc2);
else alert("Script has returned error. Data="+data);
});
Ну и соответственно функция копирующая файл должна по завершении возвращать 1 в браузер.
Код:
... // код функции
echo 1;
return 0;
echo 1;
return 0;
refresh не вызывается совсем
и сообщения об ошибке нет
Посмотрите присылает ли РНР скрипт ответ о завершении копирования. Обычная отладка и поиск проблемного места
и даже не представляю как такое отлаживать)
FireBug
дело было не в php
а в моём невнимательном чтении докумнтации по ajax jquery
неправильный вариант
Код:
$.get("/testdrive/index.php/file/delete",{path:escape(del2)},refresh(pd,pd2));
исправленный вариант
Код:
$.get("/testdrive/index.php/file/delete",{path:escape(del2)},function(xml){refresh(pd,pd2);});
нужно было передавить ссылку на функцию refresh(pd,pd2);
а вместо этого я вызывал саму функцию refresh(pd,pd2); ещё до завершения запроса
Собственно именно то, что я вам написал в самом начале топика