修改打印的.js函数[QZ托盘、WooCommerce POS]

时间:2019-12-26 作者:Curtis B

我相信这是一个简单的问题,但我很难理解我在这里遗漏了什么。跳到底部查看实际问题。

背景我正在修改Wordpress POS插件,以使用QZ托盘直接打印POS的收据,而无需打印对话。当前,现有插件中的打印功能如下所示:

function posPrintReceipt(url, gift_receipt) {
    gift_receipt = gift_receipt || false;
    var find = \'&\';
    var re = new RegExp(find, \'g\');

    url = url.replace(re, \'&\');
    url = url + \'&gift_receipt=\' + gift_receipt;
    if (wc_pos_params.tabs_management) {
        url = url + \'&tab_id=\' + jQuery(\'.woocommerce_order_items_wrapper .tab.active\').data(\'tab_number\');
    }
    openModal(\'modal-printing-receipt\');
    if (jQuery(\'#printable\').length)
        jQuery(\'#printable\').html(\'\');

    var newHTML = jQuery(\'<div></div>\');

    //var container = ;
    newHTML.load(url + \'#pos_receipt\', function () {
        newHTML.find(\'title, meta\').remove();
        jQuery(\'#printable\').append(newHTML.html());
        if (jQuery(\'#print_barcode img\').length) {
            var src = jQuery(\'#print_barcode img\').attr(\'src\');
            if (src != \'\') {
                jQuery("<img>").load(function () {
                    window.print();
                    closeModal(\'modal-printing-receipt\');
                    wp.heartbeat.connectNow();
                    if (change_user && typeof APP_auth_show != \'undefined\') {
                        APP.user_logout();
                    }
                }).attr(\'src\', src);
            } else {
                window.print();
                closeModal(\'modal-printing-receipt\');
                wp.heartbeat.connectNow();
                if (change_user && typeof APP_auth_show != \'undefined\') {
                    APP.user_logout();
                }
            }
        }
        else if (jQuery(\'#print_receipt_logo\').length) {
            var src = jQuery(\'#print_receipt_logo\').attr(\'src\');
            if (src != \'\') {
                jQuery("<img>").load(function () {
                    window.print();
                    closeModal(\'modal-printing-receipt\');
                    wp.heartbeat.connectNow();
                    if (change_user && typeof APP_auth_show != \'undefined\') {
                        APP.user_logout();
                    }
                }).attr(\'src\', src);
            } else {
                window.print();
                closeModal(\'modal-printing-receipt\');
                wp.heartbeat.connectNow();
                if (change_user && typeof APP_auth_show != \'undefined\') {
                    APP.user_logout();
                }
            }
        }
        else {
            window.print();
            closeModal(\'modal-printing-receipt\');
            wp.heartbeat.connectNow();
            if (change_user && typeof APP_auth_show != \'undefined\') {
                APP.user_logout();
            }
        }
    });
}
你会注意到有5扇窗户。打印();命令在那里。我发现一些成功的方法是,将承诺链的打印命令切换到QZ托盘上,就像他们在wiki中所展示的那样。

我为每个窗口替换的命令。print()位于下面。我们的目标是一次将两张单独的收据发送给两台单独的打印机,因此这条长链几乎是重复的:

qz.websocket.connect().then(function() {      // Start of WriteDrive Modification - 1 of 5
   return qz.printers.find("Star");              // Pass the Star printer name into the next Promise
   }).then(function(printer) {
      var config = qz.configs.create(printer);       // Create a default config for the found printer
      var colA = \'<h2>*&nbsp; Star HTML Printing &nbsp;*</h2>\' +
                                      \'<span style="color: #F00;">Find, Config & Print in 1 Function</span><br/>\' +
                                      \'<span style="color: #F00;">Testing for new POS</span>\';
      var colB = \'<img src="https://www.domain.com/logo.png">\';

      var printData = [
         {
            type: \'html\',
            format: \'plain\',
            data: \'<html>\' +
            \'   <table style="font-family: monospace; border: 1px;">\' +
            \'       <tr style="height: 6cm;">\' +
            \'           <td valign="top">\' + colA + \'</td>\' +
            \'           <td valign="top">\' + colB + \'</td>\' +
            \'       </tr>\' +
            \'   </table>\' +
            \'</html>\'
            }
         ];  // Raw HTML Output
      return qz.print(config, printData);
   }).then(function() {
      return qz.printers.find("Boca");              // Pass the Boca printer name into the next Promise
      }).then(function(printer2) {
         var config = qz.configs.create(printer2);       // Create a default config for the found printer
         var colA = \'<h2>*&nbsp; Boca HTML Printing &nbsp;*</h2>\' +
            \'<span style="color: #F00;">Find, Config & Print in 1 Function</span><br/>\' +
            \'<span style="color: #F00;">Testing for new POS</span>\';
         var colB = \'<img src="https://domain.com/logo2.png">\';

         var printTicketData = [
            {
            type: \'html\',
            format: \'plain\',
            data: \'<html>\' +
            \'   <table style="font-family: monospace; border: 1px;">\' +
            \'       <tr style="height: 6cm;">\' +
            \'           <td valign="top">\' + colA + \'</td>\' +
            \'           <td valign="top">\' + colB + \'</td>\' +
            \'       </tr>\' +
            \'   </table>\' +
            \'</html>\'
            }
            ];  // Raw HTML Output
         return qz.print(config, printTicketData);
    }).then(function () {qz.websocket.disconnect()}).catch(function(e) { console.error(e); });
所有这些测试都很好-在交换打印时。window()命令用于QZ链,测试html打印到每个打印机。

问题首先,我对这里的设置感到困惑。从初始posPrintReceipt函数中,我是否尝试打印newHTML变量中的内容?还是别的什么?

第二,我不确定我是否在HTML中正确地布局了数据。到目前为止,我主要在其中一个打印链中尝试了以下内容:

function(printer) {
   var config = qz.configs.create(printer);       // Create a default config for the found printer

   var printable = newHTML;

   var printData = [
      {
      type: \'html\',
      format: \'plain\',
      data: \'<html>\' +
      \'   <table style="font-family: monospace; border: 1px;">\' +
      \'       <tr style="height: 6cm;">\' +
      \'           <td valign="top">\' + printable + \'</td>\' +
      \'       </tr>\' +
      \'   </table>\' +
      \'</html>\'
      }
      ];  // Raw HTML Output
   return qz.print(config, printData);
将“printable”变量替换为一些想法。到目前为止,所有内容在最终打印中只打印出一行[对象对象]。我在该变量中加入了其他一些想法:

JSON.stringify(data);  // \'data\' is from another function, seems to hold all of the order\'s data from WooCommerce
jQuery(\'#printable\');
jQuery(\'#pos_receipt\');
在将JQuery对象转换为可打印的HTML时,我是否缺少了一些简单的东西?或者在QZ托盘printData区域内有没有一种方法可以简单地从其内部的函数中提取信息?

任何帮助都将不胜感激。非常感谢。

1 个回复
SO网友:tresf

首先,我对这里的设置感到困惑。从首字母开始posPrintReceipt 函数,我是否尝试打印newHTML 变量还是别的什么?

是的,但WooCommerce代码似乎附加了newHTML 现有页面的内容(通过使用window.print();), 可能利用@media print 样式表。

不幸的是,QZ托盘使用JavaFX\'s WebView 在封面下,(在撰写本文时)无法兑现@media print 样式表。

更糟糕的是,QZ托盘并不真正了解flavor: "plain", 所以所有相关的link, src, 标签(例如。./style.css) 如果提供的是flavor: "plain" 文本(而不是URL作为flavor: "file").

第三,QZ托盘对多页的支持非常有限,因此,如果需要适当的多页支持,请做好布局问题的准备。此限制不适用于PDF printing.

最后newHTML 是一个HTML元素(从技术上讲是jQuery包装的HTML元素),因此您必须调用newHTML.html() to append it to a JavaScript string variable.

第二,我不确定我是否在HTML中正确地布局了数据。到目前为止,我主要在其中一个打印链中尝试了以下内容[…]目前只打印出一张[object Object] 最终打印中的行

如果使用QZ Tray 2.1, 它现在一次支持多个打印机和数据对象。这在unit tests of the bug report that tracked this feature. 这将简化Promise chain.

除了元素与字符串问题以及相对link|src 如上所述,代码似乎已正确格式化为QZ托盘API。

相关推荐

JQuery不再加载,找不到Load-Scripts.php(404)

当我打开我的wordpress网站管理面板时,jquery已经不起作用了(它昨天起作用了,我看不出我做了什么改变可以解释这一点)。我遇到的第一个javascript错误是GET https://mywebsite/wp-admin/load-scripts.php?c=0&load%5B%5D=jquery-core,jquery-migrate,utils,underscore,wp-util,wp-sanitize,wp-a11y,updates,jquery-ui-core,jquery-u