Цитата:
|
Представленный код, это клиентская часть, а не серверная. Кроме проверки сообщения на пустоту также необходимо блокировать кнопку отправления на время запроса и снимать блокировку после его окончания. У вас форма отправляется естественным образом, а значит сервер должен быть защищен от такой напасти как F5.
|
вот обработчик
<?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'); } } |
Если метод canSendMessage(), это и есть полная проверка принятого сообщения, то пустота не запишется на сервере. А вот дубликаты вполне может принять, то есть обновление страницы по 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'); } |
Всем спасибо за подсказки,буду дальше читать литературу может разберусь,а нет снова обращусь )))
|
Цитата:
|
Всем день добрый!вот что нашел по свое проблеме,теперь пустышки в чат не отправляются но и сообщения при 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'); }где что не так сделал |
Цитата:
|
ifarame стоит от перезагрузки страница при отправлении сообщения
|
Часовой пояс GMT +3, время: 13:21. |