@Silverviql

Как вызвать функцию из подключаемого js файла при выполнение условий в скрипте php файла на yii2?

Возможно я неправильно сформулировал вопрос. У меня подключен сервер websoket и клиент.
На странице index у меня реализован клиент .
<button onclick="send();">Send</button>

<h1>Пример работы с WebSocket</h1>
<form action="" name="messages">
    <div class="row">Имя: <input type="text" name="fname"></div>
    <div class="row">Текст: <input type="text" name="msg"></div>
    <div class="row"><input type="submit" value="Поехали"></div>
</form>
<div id="status"></div>
<?php

echo <<<JS

<script>
    window.onload = function () {
        /*var socket = new WebSocket("ws://echo.websocket.org");*/
        var socket = new WebSocket("ws://localhost:8080");
        var status = document.querySelector("#status");
        console.log(socket)

        socket.onopen = function () {
            status.innerHTML = "cоединение установлено<br>";
        };

        socket.onclose = function (event) {
            if (event.wasClean) {
                status.innerHTML = 'cоединение закрыто';
            } else {
                status.innerHTML = 'соединения как-то закрыто';
            }
            status.innerHTML += '<br>код: ' + event.code + ' причина: ' + event.reason;
        };

        socket.onmessage = function (event) {
            let message = JSON.parse(event.data);
            status.innerHTML += `пришли данные:`+'<b>'+ message.name +'</b>'+  ':'+ message.msg + '<br>';
            if(message.msg!=0){
                 return['class' => 'strRebTabl'];
            }
        };
        
        
        socket.onerror = function (event) {
            status.innerHTML = "ошибка " + event.message;
        };
        document.forms["messages"].onsubmit = function () {
            let message = {
                name: this.fname.value,
                msg: this.msg.value
            }
            socket.send(JSON.stringify(message));
            return false;
        }
    }
    </script>
JS;
?>

Сервер:
<?php

namespace frontend\components;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class SocketServer implements MessageComponentInterface
{
    protected $clients;
    public function __construct()
    {
        $this->clients = new \SplObjectStorage; // Для хранения технической информации об присоединившихся клиентах используется технология SplObjectStorage, встроенная в PHP
    }

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})\n";
    }

    /*public function onMessage(ConnectionInterface $from, $msg)
    {
        $data = json_decode($msg, true); //для приема сообщений в формате json
        if (is_null($data))
        {
            echo "invalid data\n";
            return $from->close();
        }
        echo $from->resourceId."\n";//id, присвоенное подключившемуся клиенту
    }*/
    public function onMessage(ConnectionInterface $from, $msg) {
        $numRecv = count($this->clients) - 1;
        echo sprintf('Connection %d sending message "%s" to %d other connections' . "\n"
            , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');

        foreach ($this->clients as $client) {
           /* if ($from !== $client) {*/
                // The sender is not the receiver, send to each client connected
                $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();
    }
}


Я хочу вызывать функцию обновления (из подключаемого файла script.js) таблиц gridview когда кто то из клиентов посылает сообщение. С начало у меня каждый 3 секунды таблицы обновлялись. Сейчас стоит задача обновлять таблицы только когда кто то из пользователей произвел какое то действие или изменение поэтому я хочу через веб сокет посылать сообщения от клиента кто произвел изменение и те кто подключены запустили скрипт на обновление таблиц gridview. Спасибо за ответ.
function startRebTabl{
        $pjaxContainers = ['#10-pjax', '#11-pjax', '#12-pjax'];

        $.each($pjaxContainers , function(index, container) {
            if (index+1 < $pjaxContainers.length) {
                $(container).one('pjax:end', function (xhr, options) {
                    $.pjax.reload({container: $pjaxContainers[index+1]}) ;
                });
            }
        });

        $.pjax.reload({container: $pjaxContainers[0]}) ;

    }
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
@Silverviql Автор вопроса
Короче, 1 проблема была в том , что asset в yii подключает файлы скриптов вконце. То есть если вызывать какую то функцию из тела , о ней еще не будет известно и будет выдавать ошибку о том, что функция not defined. Подключил вручную в файле $this->registerJsFile('/frontend/web/js/script.js'); , он наконец увидел эту функцию, но вылезла другая ошибка ,Cannot read property 'reload' of undefined т.к у меня в подключаемом скрипте выполняется функция $.pjax.reload({container: $pjaxContainers[0]}) ; , вызывал я ее со страницы где не использовалось это свойство и он выдавал эту ошибку. Подключил к странице где gridview и все заработало . То есть теперь если отправить сообщение то таблицы обновятся у всех кто подписан в на сервере webсокета.
Это сырое решение чтобы было понимание , будет это вообще работать или нет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Возвращаете с сервера json в котором имя нужной функции, вызываете функцию
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы