23.08.2019, 12:38
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от teplov
|
Вот именно что пустые сообщения не нужны,получается пользователь жмет Enter и в чат летят пустышки,а где и что зафильтровать я не пойму,все перепробовал,но видимо не хватает у меня на старости лет ума (((
|
У вас где-то должен быть обработчик события submit или click или в худшем случае keydown... там нужно смотреть
|
|
23.08.2019, 12:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Представленный код, это клиентская часть, а не серверная. Кроме проверки сообщения на пустоту также необходимо блокировать кнопку отправления на время запроса и снимать блокировку после его окончания. У вас форма отправляется естественным образом, а значит сервер должен быть защищен от такой напасти как F5.
|
|
23.08.2019, 15:11
|
Интересующийся
|
|
Регистрация: 23.08.2019
Сообщений: 13
|
|
вот обработчик
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
require_once dirname(__FILE__) . '/../../configuration.php';
require_once dirname(__FILE__) . '/Objects/ChatObj.php';
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$p = \Plugin::loadPlugin("Chat");
$object = json_decode($msg);
$canSendMessage = $p->canSendMessage($object->userId);
if(empty($canSendMessage)){
echo "Cant Send message\n";
return false;
}
//var_dump($msg);
echo "Saving message\n";
$lc = new \ChatObj(0);
$lc->setStatus('a');
$lc->setText($object->text);
$lc->setUsers_id($object->userId);
$lc->save();
$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
public function getTags() {
return array('free', 'chat');
}
}
|
|
23.08.2019, 15:47
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Если метод canSendMessage(), это и есть полная проверка принятого сообщения, то пустота не запишется на сервере. А вот дубликаты вполне может принять, то есть обновление страницы по F5 или повторная отправка формы (нет блокировки).
А проблема отправления пустых сообщений клиентом, это в нем разбираться надо.
|
|
23.08.2019, 15:56
|
Интересующийся
|
|
Регистрация: 23.08.2019
Сообщений: 13
|
|
получается нужно искать проблему тут
var getMessageText, sendMessage, Message;
Message = function (arg) {
this.text = arg.text, this.message_side = arg.message_side;
this.draw = function (_this) {
return function () {
var $message;
var json = JSON.parse(_this.text);
alertChat();
return createMessage(json.text, json.name, json.photo, _this.message_side);
};
}(this);
return this;
};
getMessageText = function () {
var $message_input;
$message_input = $('.message_input');
return $message_input.val();
};
sendMessage = function (text, message_side) {
var $messages, message;
if (text.trim() === '') {
return;
}
$messages = $('.messages');
message = new Message({
text: text,
message_side: message_side
});
message.draw();
return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};
function createMessage(text, name, photo, message_side){
$message = $($('.message_template').clone().html());
if(message_side==="left"){
$message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
$message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
$message.find('.name').removeClass("label-info").addClass("label-warning");
$message.find('.avatar').removeClass("pull-right").addClass("pull-left");
}
$message.find('.text').html(text);
$message.find('.name').html(name);
$message.find('.photo').attr('src', photo);
$('.messages').append($message);
$message.addClass('appeared');
}
|
|
23.08.2019, 16:00
|
Интересующийся
|
|
Регистрация: 23.08.2019
Сообщений: 13
|
|
Всем спасибо за подсказки,буду дальше читать литературу может разберусь,а нет снова обращусь )))
|
|
23.08.2019, 16:14
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от teplov
|
получается нужно искать проблему тут
|
Тут if (text.trim() === '') {return;}, что в общем можно записать проще if (!text.trim()) return;, ибо trim() удалит пробелы и переводы строк (если есть), а булево значение пустой строки это false. У вас аля ajax, надо смотреть код отправления, то есть все вкупе.
|
|
24.08.2019, 09:36
|
Интересующийся
|
|
Регистрация: 23.08.2019
Сообщений: 13
|
|
Всем день добрый!вот что нашел по свое проблеме,теперь пустышки в чат не отправляются но и сообщения при f5 не сохранятся ,исходный рабочи код (отправляются пустышки)
var getMessageText, sendMessage, Message;
Message = function (arg) {
this.text = arg.text, this.message_side = arg.message_side;
this.draw = function (_this) {
return function () {
var $message;
var json = JSON.parse(_this.text);
alertChat();
return createMessage(json.text, json.name, json.photo, _this.message_side);
};
}(this);
return this;
};
getMessageText = function () {
var $message_input;
$message_input = $('.message_input');
return $message_input.val();
};
sendMessage = function (text, message_side) {
var $messages, message;
if (text.trim() === '') {
return;
}
$messages = $('.messages');
message = new Message({
text: text,
message_side: message_side
});
message.draw();
return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};
function createMessage(text, name, photo, message_side){
$message = $($('.message_template').clone().html());
if(message_side==="left"){
$message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
$message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
$message.find('.name').removeClass("label-info").addClass("label-warning");
$message.find('.avatar').removeClass("pull-right").addClass("pull-left");
}
$message.find('.text').html(text);
$message.find('.name').html(name);
$message.find('.photo').attr('src', photo);
$('.messages').append($message);
$message.addClass('appeared');
}
а это чем заменил (не проходят пустышки,но и не сохраняются сообщения при перезагрузке)
(function () {
var Message;
Message = function (arg) {
this.text = arg.text, this.message_side = arg.message_side;
this.draw = function (_this) {
return function () {
var $message;
$message = $($('.message_template').clone().html());
$message.addClass(_this.message_side).find('.text').html(_this.text);
$('.messages').append($message);
return setTimeout(function () {
return $message.addClass('appeared');
}, 0);
};
}(this);
return this;
};
$(function () {
var getMessageText, message_side, sendMessage;
message_side = 'right';
getMessageText = function () {
var $message_input;
$message_input = $('.message_input');
return $message_input.val();
};
sendMessage = function (text) {
var $messages, message;
if (text.trim() === '') {
return;
}
$('.message_input').val('');
$messages = $('.messages');
message = new Message({
text: text,
message_side: message_side
});
message.draw();
return $messages.animate({ scrollTop: $messages.prop('scrollHeight') }, 300);
};
$('.send_message').click(function (e) {
return sendMessage(getMessageText());
});
$('.message_input').keyup(function (e) {
if (e.which === 13) {
return sendMessage(getMessageText());
}
});
sendMessage('Hello');
});
}.call(this));
function createMessage(text, name, photo, message_side){
$message = $($('.message_template').clone().html());
if(message_side==="left"){
$message.find('.text_wrapper').removeClass("pull-left").addClass("pull-right");
$message.find('.text_wrapper').removeClass("alert-info").addClass("alert-warning");
$message.find('.name').removeClass("label-info").addClass("label-warning");
$message.find('.avatar').removeClass("pull-right").addClass("pull-left");
}
$message.find('.text').html(text);
$message.find('.name').html(name);
$message.find('.photo').attr('src', photo);
$('.messages').append($message);
$message.addClass('appeared');
}
где что не так сделал
|
|
24.08.2019, 10:30
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от teplov
|
но и сообщения при f5 не сохранятся
|
Этого и не должно происходить, это неприятность для сервера, с которой приходится бороться. Эта ситуация возникает только тогда когда форма отправляется естественным образом, и один из методов борьбы заставляющим "сбросить форму" браузером, это перенаправление после приема формы. В случае программной передачи данных на сервер такого уже не происходит. Но вот для чего у вас отправление формы и ifarame как приемник ответа сервера не понятно, да еще при таком коде.
|
|
24.08.2019, 11:43
|
Интересующийся
|
|
Регистрация: 23.08.2019
Сообщений: 13
|
|
ifarame стоит от перезагрузки страница при отправлении сообщения
|
|
|
|