Список форумов КЛУБ FileMaker.RU КЛУБ FileMaker.RU

 
new forum: www.fmforum.ru
FileMaker DevCon Rus 2017.IV коенференция российских разработчиков на платформе FileMaker.
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

FileMaker и 54-ФЗ
На страницу Пред.  1, 2, 3, 4  След.
 
Начать новую тему   Ответить на тему    Список форумов КЛУБ FileMaker.RU -> Практика FM
Предыдущая тема :: Следующая тема  
Автор Сообщение
khalex



Зарегистрирован: 30.01.2007
Сообщения: 37

СообщениеДобавлено: Вт Апр 11, 2017 7:41 pm    Заголовок сообщения: Ответить с цитатой

Если есть возможность, расскажите подробнее, как это работает и что вы уже сделали.. Спасибо
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Чт Апр 13, 2017 12:11 pm    Заголовок сообщения: Ответить с цитатой

khalex писал(а):
Если есть возможность, расскажите подробнее, как это работает и что вы уже сделали.. Спасибо


Ну собственно есть ККМ сервер, ссылку я давал. Далее взяли ПС комп. установили на него винду и сервер, подключили к нему кассовые аппараты.
Через web интерфейс все заработало, чеки печатает, ответы шлёт.
Осталось достучаться до него из под FM.
Пример команды LIST для ККМ сервера:
Код:

data:text/html,<!DOCTYPE html>
 <html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>
 <body>
 <div id="response"></div>
 <script type="text/javascript">
  function SendXHRRequest(options, callback) {
     var xhr = new XMLHttpRequest();
     var response = 0;
 
 
     var url = options.protocol + '://' + options.host;
      if (options.port) {
         url += ':' + options.port;
     }
      if (options.path) {
         url += options.path;
   
  }
     xhr.onload = function() {
 
         if (callback) {
             console.log('Parsing response from server');
 
             try {
 
                 response = JSON.parse(this.responseText);
 
             } catch (error) {
 
                 console.error('Could not parse response as JSON object');
 
              response = {
                     'ok': false,
                     'error': 'JSONPARSE',
                     'message': 'Could not parse response as JSON object'
                 };
             }
 
                         return callback(response);
         }
     };
 
     xhr.onerror = function (error) {
 
         if (callback) {
 
             response = {
                 'ok': false,
                 'error': error.errno,
                 'message': error.message
             };
 
                         return callback(response);
         }
     }
 
     try {
          xhr.open(options.method, url, true);
         //xhr.timeout = 2000;
          if (options.auth) {
             xhr.setRequestHeader('Authorization', 'Basic ' + btoa(options.auth));
         }
         
         if (options.method == 'POST' && options.body) {
 
             xhr.setRequestHeader('Content-type', 'application/json; charset=UTF-8');
             xhr.send(JSON.stringify(options.body));
 
         } else {
             xhr.send();
         }
 
         var timeout = setTimeout( function() {
 
             if (response == 0) {
 
                 xhr.abort();
 
                 console.error('Connection timeout');
 
                 if (callback) {
 
                     response = {
                         'ok': false,
                         'error': "TIMEOUT",
                         'message': "Connection timeout"
                     };
 
                                         return callback(response);
                 }
             }
 
         }, 10000);
 
     } catch (error) {
 
         if (callback) {
 
             response = {
                 'ok': false,
                 'error': error.errno,
                 'message': error.message
             };
 
             console.error(error.message);
 
             return callback(response);
         }
     }
 }
 
  function List(NumDevice) {
    var body = {
        Command: "List",
       NumDevice:0,
       InnKkm: "",
        Active: null,
       OnOff: null,
        OFD_Error: null,
         FN_MemOverflowl: null,
        FN_IsFiscal: null,
   };
       var options = {
       auth: 'User:',
       protocol: 'http',
       host: '192.168.0.34',
       port: 5893,
       method: 'POST',
       body: body,
        path: '/Execute/sync'
    };     
         
   // Вызов команды
     SendXHRRequest(options, function(response) {
 
       document.getElementById("response").innerHTML = JSON.stringify(response);
 
       console.log(response);
 
      if (response.ok == false) {
 
       } 
   });
}
 
List(0);
</script>
</body>
</html>

Подсовываем этот код WebViever у и получаем ответ от сервера.
Но забрать его можно только через клипбоард . Выделить скопировать и вставить.
Всё дело в том, что javascript приложение исполняется в WebViever, общается с сервером ККМ, получает ответ и демонстрирует его, и все.
Inscert from URL не сработал, как сказал наш js разработчик там крайне ограниченные возможности POST

Есть еще вариант вызвать скрипт Filemaker из javascript и передать ему результаты. Но тут меня одолели сомнения, Система многопользовательская, стоит на сервере, в какого пользователя попадет результат....
В общем не нашел я красивого решения по связке FM с сервером ККМ напрямую.
У меня есть своя лазейка - для интеграции FM со всякими внешними сервисами мы используем свое приложение на js с которым FM общается через url.
В общем я транслировал задание на включение в это приложение поддержку сервера ККМ.
Должны на днях написать.
Как то так
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Andrey Volkov



Зарегистрирован: 26.10.2009
Сообщения: 1609
Откуда: Ярославль

СообщениеДобавлено: Чт Апр 13, 2017 1:37 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Подсовываем этот код WebViever у и получаем ответ от сервера.
Но забрать его можно только через клипбоард . Выделить скопировать и вставить.
поясните, пожалуйста, зачем вам нужен этот ответ и куда приходится его вставлять?


Цитата:
В общем не нашел я красивого решения по связке FM с сервером ККМ напрямую


красивое решение вам уже подсказали. Берете плагин BE и ставите его на сервер. Скрипт можно вызывать через Perform Script On Server
посему, заботиться о том, чтобы у всех пользователей был установлен плагин, вам не придется.
Собственно, вы будете считывать Get(ScriptResult), если вам этот самый результат важно увидеть.

По факту
Джава скрипт здесь банальный. Он собирает в кучу данные (body, options), формирует тело и заголовки POST запроса и отправляет body в формате json. Все то же самое может выполнить плагин с помощью CURL OPTIONS
соответственно, он сформирует запрос и отправит его и получит ответ. А json body можно сформировать вручную или поручить плагину.

Ответ от сервера в формате JSON. Можно парсить плагином же, а можно получить json в качестве результата скрипта и попытаться распарсить файлмейкером.

Не хотите связываться с плагином, закажите PHP скрипт, который будет делать то же самое. Или попросите у разработчиков PHP API , наверняка что-то такое должно уже появиться в природе.
К PHP скрипту можно будет обращаться через INSERT FROM URL, используя метод GET, то есть передавая все параметры (а их очень мало) через URL
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Andrey Volkov



Зарегистрирован: 26.10.2009
Сообщения: 1609
Откуда: Ярославль

СообщениеДобавлено: Чт Апр 13, 2017 1:40 pm    Заголовок сообщения: Ответить с цитатой

если бы у меня была такая задача, я бы помог с написанием PHP. Но времени мало. Я думаю, это ерундовая задача для любого PHP разработчика, и даже вы справитесь, если вам удастся получить от техподдержки образец запроса с полным набором заголовков и телом.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Andrey Volkov



Зарегистрирован: 26.10.2009
Сообщения: 1609
Откуда: Ярославль

СообщениеДобавлено: Чт Апр 13, 2017 1:49 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
поясните, пожалуйста, зачем вам нужен этот ответ и куда приходится его вставлять?

не отвечайте. вы пытаетесь получить список ККМ-устройств и их параметры.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Николай К



Зарегистрирован: 04.09.2015
Сообщения: 120
Откуда: Кишинев

СообщениеДобавлено: Чт Апр 13, 2017 1:58 pm    Заголовок сообщения: Ответить с цитатой

Простите, пропустил момент с JavaScript в WebViewer.

Скабление страницы в вебвюере не будет работать, всегда дает изнчалное состояние, а не результат.

Добавте в конце JavaScript кода вызов через fmp:// протокол, зовите скрипт в вашем ФайлМэйкер файле и передайте результат JavaScript обратно в ФайлМэйкер как параметр к этому скрипту или переменную.

Ссылка на fmp:// протокол:

https://www.filemaker.com/help/14/fmp/en/html/sharing_data.17.6.html
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Чт Апр 13, 2017 2:48 pm    Заголовок сообщения: Ответить с цитатой

Короче дорога-которую знаешь.
Не приходилось никогда сталкиваться с PHP ни с java.
Поэтому затрудняюсь прикрутить к готовому js скрипту вызов скрипта FM
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Andrey Volkov



Зарегистрирован: 26.10.2009
Сообщения: 1609
Откуда: Ярославль

СообщениеДобавлено: Чт Апр 13, 2017 3:33 pm    Заголовок сообщения: Ответить с цитатой

вас ведь кто-то консультирует по js?
в кусок кода

Код:
 // Вызов команды
     SendXHRRequest(options, function(response) {
 
       document.getElementById("response").innerHTML = JSON.stringify(response);
 
       console.log(response);
 
      if (response.ok == false) {
 
       } 
   });


вогнать что-то типа

Код:
 // Вызов команды
     SendXHRRequest(options, function(response) {
 
       document.getElementById("response").innerHTML = JSON.stringify(response);
       
       window.open('fmp://$/MyFileName.fmp12?script=HTML_Handler&param='  + JSON.stringify(response) , '_blank');
 
       console.log(response);
 
      if (response.ok == false) {
 
       } 
   });


ключевая строка здесь: window.open
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Николай К



Зарегистрирован: 04.09.2015
Сообщения: 120
Откуда: Кишинев

СообщениеДобавлено: Чт Апр 13, 2017 4:52 pm    Заголовок сообщения: Ответить с цитатой

Другой вариант с https://blog.beezwax.net/2015/08/07/communicating-with-a-web-viewer-in-filemaker/

Код:
var body = document.getElementsByTagName('body')[0];
var a = document.createElement('a');
a.href = 'fmp://netaddress/database?script=scriptname';
a.style.display = 'none';
body.appendChild(a);
a.click();
a.parentNode.removeChild(a);


Лист с ссылками по fmp://

http://blog.jsfmp.com/post/95206822956/collection-of-fmp-url-web-viewer-data-url-examples
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Чт Апр 13, 2017 7:18 pm    Заголовок сообщения: Ответить с цитатой

Спасибо за помощь!
Andrey Volkov
ваш вариант не сработал Crying or Very sad
Буду изучать ссылку Николай К
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Andrey Volkov



Зарегистрирован: 26.10.2009
Сообщения: 1609
Откуда: Ярославль

СообщениеДобавлено: Пт Апр 14, 2017 8:37 am    Заголовок сообщения: Ответить с цитатой

за этой веткой мы сейчас наблюдаем пристальнее, чем за полетом Гагарина.
Принципиально важное направление интеграции. И очень обрадует, если все получится.
Я считаю, нужно реально обратиться за помощью к спецам по js или php.

Николаю спасибо за полезные ссылки. И вообще, хотелось бы встретиться на конференции
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Пт Апр 14, 2017 12:01 pm    Заголовок сообщения: Ответить с цитатой

Пока никак, не удается прикрутить к этому js вызов FM скрипта.
Понимаю что есть масса вариантов, вплоть до записи в файл.
Но это как то некрасиво.
Истина где то рядом Exclamation
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Пт Апр 14, 2017 1:26 pm    Заголовок сообщения: Ответить с цитатой

Николай К писал(а):
Простите, пропустил момент с JavaScript в WebViewer.

Скабление страницы в вебвюере не будет работать, всегда дает изнчалное состояние, а не результат.

Добавте в конце JavaScript кода вызов через fmp:// протокол, зовите скрипт в вашем ФайлМэйкер файле и передайте результат JavaScript обратно в ФайлМэйкер как параметр к этому скрипту или переменную.

Ссылка на fmp:// протокол:

https://www.filemaker.com/help/14/fmp/en/html/sharing_data.17.6.html


Из браузера отлично отрабатывает fmp:// протокол, правда сначала просит разрешения открыть программу FileMaker pro, потом лихо вызывает скрипт и передаёт параметры.
А вот из js пока не удаётся.
Придется просить js разработчика, возможно поможет, вечером обещал. Cool
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Пт Апр 14, 2017 2:25 pm    Заголовок сообщения: Ответить с цитатой

Николай К писал(а):
Другой вариант с https://blog.beezwax.net/2015/08/07/communicating-with-a-web-viewer-in-filemaker/

Код:
var body = document.getElementsByTagName('body')[0];
var a = document.createElement('a');
a.href = 'fmp://netaddress/database?script=scriptname';
a.style.display = 'none';
body.appendChild(a);
a.click();
a.parentNode.removeChild(a);


Лист с ссылками по fmp://

http://blog.jsfmp.com/post/95206822956/collection-of-fmp-url-web-viewer-data-url-examples



Спасибо, Николай!
С вашей помощью я смог выразиться на неизвестном мне языке js!
Кому интересно вот работающий код
Код:

<!DOCTYPE html>
 <html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>
 <body>
 <div id="response"></div>
 <script type="text/javascript">
  function SendXHRRequest(options, callback) {
     var xhr = new XMLHttpRequest();
     var response = 0;
 
 
     var url = options.protocol + '://' + options.host;
      if (options.port) {
         url += ':' + options.port;
     }
      if (options.path) {
         url += options.path;
   
  }
     xhr.onload = function() {
 
         if (callback) {
             console.log('Parsing response from server');
 
             try {
 
                 response = JSON.parse(this.responseText);
 
             } catch (error) {
 
                 console.error('Could not parse response as JSON object');
 
              response = {
                     'ok': false,
                     'error': 'JSONPARSE',
                     'message': 'Could not parse response as JSON object'
                 };
             }
 
                         return callback(response);
         }
     };
 
     xhr.onerror = function (error) {
 
         if (callback) {
 
             response = {
                 'ok': false,
                 'error': error.errno,
                 'message': error.message
             };
 
                         return callback(response);
         }
     }
 
     try {
          xhr.open(options.method, url, true);
         //xhr.timeout = 2000;
          if (options.auth) {
             xhr.setRequestHeader('Authorization', 'Basic ' + btoa(options.auth));
         }
         
         if (options.method == 'POST' && options.body) {
 
             xhr.setRequestHeader('Content-type', 'application/json; charset=UTF-8');
             xhr.send(JSON.stringify(options.body));
 
         } else {
             xhr.send();
         }
 
         var timeout = setTimeout( function() {
 
             if (response == 0) {
 
                 xhr.abort();
 
                 console.error('Connection timeout');
 
                 if (callback) {
 
                     response = {
                         'ok': false,
                         'error': "TIMEOUT",
                         'message': "Connection timeout"
                     };
 
                                         return callback(response);
                 }
             }
 
         }, 10000);
 
     } catch (error) {
 
         if (callback) {
 
             response = {
                 'ok': false,
                 'error': error.errno,
                 'message': error.message
             };
 
             console.error(error.message);
 
             return callback(response);
         }
     }
 }
 
  function List(NumDevice) {
    var body = {
        Command: "List",
       NumDevice:0,
       InnKkm: "",
        Active: null,
       OnOff: null,
        OFD_Error: null,
         FN_MemOverflowl: null,
        FN_IsFiscal: null,
   };
       var options = {
       auth: 'User:password',
       protocol: 'http',
       host: '192.168.0.34',
       port: 5893,
       method: 'POST',
       body: body,
        path: '/Execute/sync'
    };     
         
   // Вызов команды
     SendXHRRequest(options, function(response) {
 
       document.getElementById("response").innerHTML = JSON.stringify(response);
     window.location.url = "fmp://$/KKM.fmp12?script=Result&param=" + JSON.stringify(response);
    var body = document.getElementsByTagName('body')[0];
    var a = document.createElement('a');
      a.href = 'fmp://$/KKM.fmp12?script=Result&param='+ JSON.stringify(response);
      a.style.display = 'none';
      body.appendChild(a);
      a.click();
       a.parentNode.removeChild(a);
       
    console.log(response);

      if (response.ok == false) {
 
       } 
   });
}
 
List(0);
</script>
</body>
</html>


Фух!
Теперь парсить, ну это знакомо Very Happy
Всем спасибо!


Последний раз редактировалось: vadim (Пт Апр 14, 2017 6:18 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vadim



Зарегистрирован: 14.12.2007
Сообщения: 134

СообщениеДобавлено: Пт Апр 14, 2017 4:54 pm    Заголовок сообщения: Ответить с цитатой

Рано обрадовался.
Не всё гладко работает. Вернее из браузера работает и FM получает ответ в скрипт.
А из WebViewer не передается ответ, вернее передается только в случае ошибки или пароль неверно укажу или адрес сервера -ошибка приходит а нормальный ответ сервера нет.
Продолжаю изыскания.
Оставайтесь на связи!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов КЛУБ FileMaker.RU -> Практика FM Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3, 4  След.
Страница 2 из 4

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB