Печать напрямую на принтер без отображения диалогового окна с php или javascript - PullRequest
1 голос
/ 14 апреля 2019

У меня есть система для ресторана, работающая на веб-сервере, и мне нужно распечатать сделанный заказ на POS-принтере, но мне бы хотелось, чтобы, когда пользователь нажимал кнопку «Сохранить заказ», билет автоматически печатается со всеми деталями заказа, без отображения какого-либо диалогового окна печати (диалоговое окно отображается, когда я печатаю с использованием JavaScript, и я этого не хочу). Я попытался сделать это с помощью библиотеки php "Mike42" и настройки общего принтера, но он ничего не печатает.

Если я делаю это из локальной системы с XAMPP, она печатается, но если я делаю это из системы, размещенной на моем веб-хостинге, она ничего не печатает.

Здесь я показываю код php-файлов, который выполняет отправку на печать:

windows-usb.php (этот файл включен в библиотеку Mike42):

     /* Change to the correct path if you copy this example! */
                require __DIR__ . '/../../autoload.php';
                use Mike42\Escpos\Printer;
                use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;

                /**
                 * Install the printer using USB printing support, and the "Generic / Text Only" driver,
                 * then share it (you can use a firewall so that it can only be seen locally).
                 *
                 * Use a WindowsPrintConnector with the share name to print.
                 *
                 * Troubleshooting: Fire up a command prompt, and ensure that (if your printer is shared as
                 * "Receipt Printer), the following commands work:
                 *
                 *  echo "Hello World" > testfile
                 *  copy testfile "\\%COMPUTERNAME%\Receipt Printer"
                 *  del testfile
                 */
                try {
                    // Enter the share name for your USB printer here
                    //$connector = null;

                    $connector = new WindowsPrintConnector("THERMAL PRINTER");

                    /* Print a "Hello world" receipt" */

                    $printer = new Printer($connector);

                    $printer -> text("<table border='0' align='center' width='385px'><tr><td align='center'>.::<strong> ". $restaurent ." </strong>::.\n ". $celphone ." - ID: ". $IDRest ."</td></tr><tr><td align='center'>Date/Time:" . date('d-m-Y H:i:s') . "</td></tr><tr><td align='left'></td></tr><tr><td>Client: ".$name."</td></tr><tr><td>ID Client: ".$ID_Client."</td></tr><tr><td>Order Nº: ".$orderNum."</td></tr><tr><td colspan='3' align='left'>Type of Order: ".$type_orders."</td></tr></table>\n"."<table border='0' align='center' width='300px'><tr><td><span id='cantDragg'>QUANTITY.</span></td><td><span id='descripDragg'>DETAILS</span></td><td align='right'><span id='importDragg'>TOTAL</span></td></tr><tr><td colspan='3'>==========================================</td></tr>"."<tr><td>Here Quantity</td><td>Here Dish Name</td><td align='right'>Here price</td></tr><tr><td>2</td><td>Pizza 4 cheese</td><td align='right'>330 CHF</td></tr><tr><td>&nbsp;</td><td align='right'><b>TOTAL:</b></td><td align='right'><b>360 CHF</b></td></tr><tr><td colspan='3'>Nº of Dishes: 2</td></tr><tr><td colspan='3'>&nbsp;</td></tr><tr><td colspan='3' align='center'>here other important detail</td></tr></table>");
                    $printer -> cut();
                    /* Close printer */
                    $printer -> close();
                    header("Location:../../../../index.php");


                } catch (Exception $e) {
                    echo "Couldn't print to this printer: " . $e -> getMessage() . "\n";
                }

Вот файл Printing.php (здесь я делаю несколько запросов к БД для извлечения информации, которую мне нужно напечатать):

          include_once "../../../app/config.inc.php";
              include_once "../../../app/Connection.php";


              //include_once "config.inc.php";
              //include_once "Connection.php";

              class PrintTickets
              {

              public static function CheckOrderToPrint ($connection, $status) 
              {
                    $category = [];

                    if (isset($connection)) {
                      try {

                        $sql = "SELECT * FROM orders WHERE status =:status ORDER BY id ASC";
                        $sentence = $connection ->prepare($sql);
                        $sentence -> bindParam (':status', $status, PDO::PARAM_STR);
                        $sentence -> execute();
                        $result = $sentence -> fetch();

                    if (!empty($result)) {
                        $category = [$result['id'], 
                                    $result['id_preOrder'],
                                    $result['total_amount'], 
                                    $result['discount'],
                                    $result['liefergenbuhr'],
                                    $result['gesamtbetrag'],
                                    $result['order_number'],
                                    $result['status']];
                         }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $category;
                }




                public static function CheckPreOrderToPrint ($connection, $id) 
              {
                  $category = [];

                    if (isset($connection)) {
                      try {

                        $sql = "SELECT * FROM pre_order WHERE id =:id";
                        $sentence = $connection ->prepare($sql);
                        $sentence -> bindParam (':id', $id, PDO::PARAM_INT);
                        $sentence -> execute();
                        $result = $sentence -> fetch();

                    if (!empty($result)) {
                        $category = [$result['id'], 
                                    $result['order_num'],
                                    $result['address'], 
                                    $result['zip_code'],
                                    $result['other_field'],
                                    $result['type_order'],
                                    $result['status']];
                         }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $category;
                }


                public static function CheckOrderDetailsToPrint($connection, $id) 
                  {
                  $category = [];
                    if (isset($connection)) {
                      try {
                        $sql = "SELECT * FROM order_details WHERE id_order = :id_order";
                        $sentence = $connection ->prepare($sql);
                        $sentence -> bindParam (':id_order', $id, PDO::PARAM_INT);
                        $sentence -> execute();
                        $result = $sentence -> fetchAll();

                    if (count($result)) {
                        foreach ($result as $row) 
                          {
                            $category[] = [$row['id'], $row['id_order'], $row['id_dish'], $row['quantity']];
                          } 
                        }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $category;
                }


               public static function CheckOrderDishesToPrint($connection, $id) 
                  {
                  $category = [];
                    if (isset($connection)) {
                      try {
                        $sql = "SELECT p.*, c.name AS category FROM products p INNER JOIN category c ON p.id_category = c.id WHERE p.id = :id";
                        $sentence = $connection ->prepare($sql);
                        $sentence -> bindParam (':id', $id, PDO::PARAM_INT);
                        $sentence -> execute();
                        $result = $sentence -> fetch();

                    if (!empty($result)) {
                        //foreach ($result as $row) {
                            $category[] = [$result['id'], 
                                    $result['id_category'],
                                    $result['name'], 
                                    $result['ingredients'],
                                    $result['price'],
                                    $result['status'],
                                    $result['category']];
                          //}
                         }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $category;
                }


                 public static function UpdateOrdersPrint ($connection, $id, $status) {
                   $preOrder_saved = false;
                   $lastId = 0;
                  if (isset($connection)) {

                    try {
                      $sql = "UPDATE orders SET status = :status WHERE id = :id"; 
                      $sentence = $connection -> prepare($sql);
                      $sentence -> bindParam (':id', $id, PDO::PARAM_INT);
                      $sentence -> bindParam (':status', $status, PDO::PARAM_STR);

                      $preOrder_saved = $sentence -> execute();
                      $lastId = $connection->lastInsertId(); 

                    } catch (PDOException $ex) {
                      print 'ERROR' . $ex -> getMessage();
                    }
                  }
                  return $lastId;
                }



                public static function GlobalGetGeneral($connection, $id) 
                {
                    $orders = null;
                    if (isset($connection)) {
                      try {
                        $sql = "SELECT * FROM global_setting WHERE id = :id";
                        $sentence = $connection ->prepare($sql);
                         $sentence -> bindParam(':id', $id, PDO::PARAM_INT);
                        $sentence -> execute();
                        $result = $sentence -> fetch();

                    if (!empty($result)) 
                       {
                        $orders = [$result['id'], $result['discount'], $result['rest_name'], $result['coin'], $result['address'], $result['phone'], $result['email']];
                         }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $orders;
                }



                public static function GetCustomerOrders($connection, $pre_order_Id) {
                   $orders = null;
                    if (isset($connection)) {
                      try {
                        $sql = "SELECT * FROM costumers WHERE pre_order_Id = :pre_order_Id";
                        $sentence = $connection ->prepare($sql);
                        $sentence -> bindParam(':pre_order_Id', $pre_order_Id, PDO::PARAM_INT);
                        $sentence -> execute();
                        $result = $sentence -> fetch();

                    if (!empty($result)) 
                       {
                        $orders = [$result['id'], $result['first_name'], $result['last_name'], $result['firma'], $result['address'], $result['zip_code'], $result['zip_code2'], $result['zip_address'], $result['telephone'], $result['email'], $result['etage'], $result['nachricht'], $result['pre_order_Id']];
                         }
                      } catch (PDOException $ex) {

                        print 'ERROR' . $ex -> getMessage();
                      }
                    }
                  return $orders;
                }

              }


                    Connection::open_db();
                    $status = "Processed";
                    $poststatus = "Finished";

                    $Result = PrintTickets::CheckOrderToPrint(Connection::GetConnection(), $status);


                    if($Result)
                    {

                    $orderNum = $Result[0];

                    $Result2 = PrintTickets::GlobalGetGeneral(Connection::GetConnection(), 1);
                    $restaurent = $Result2[2];
                    $adresse = $Result2[4];
                    $celphone = $Result2[5];
                    $email = $Result2[6];
                    $coin = $Result2[3];
                    $IDRest = "YG84784FOSJD-00";  

                    $Result3 = PrintTickets::GetCustomerOrders(Connection::GetConnection(), $Result[1]);

                    $name = $Result3[1] ." ". $Result3[2];
                    $telefone = $Result3[8];
                    $emailCos = $Result3[9];
                    $ID_Client = $Result3[10]; 

                    $Result4 = PrintTickets::CheckPreOrderToPrint(Connection::GetConnection(), $Result[1]); 

                    $type_orders = $Result4[5];

                    if ($type_orders == "TAKE_OVER") 
                    {
                      $type_orders = "TAKE OVER";
                    }
                    else if ($type_orders == "DELIVERY")
                    {
                      $type_orders = "DELIVERY";
                    }

                    $dish_details = "";

                    $Result6 = PrintTickets::CheckOrderDetailsToPrint(Connection::GetConnection(), $Result[0]);


                   $DISHES_NUM = count($Result6);

                   $total = $Result[2]; 
                   for ($i=0; $i < count($Result6); $i++) 
                    { 
                      $price = 0;
                      $Result5 = PrintTickets::CheckOrderDishesToPrint(Connection::GetConnection(), $Result6[$i][2]);
                      //print_r($Result5);
                      for ($j=0; $j < $Result6[$i][3]; $j++) 
                      { 
                        $price = ($price + $Result5[0][4]);
                      }

                      $dish_details = $dish_details . "<tr><td>".$Result6[$i][3]."</td><td>".$Result5[0][6]. " " . $Result5[0][2]."</td><td align='right'>".$price."</td></tr>";
                    }

                    include_once "windows-usb.php";

                    $Result7 = PrintTickets::UpdateOrdersPrint(Connection::GetConnection(), $Result[0], $poststatus);

                    }
                    else
                    {
                    echo "No order ticket available to print.";
                    }

                    Connection::close_db();

Это печатает очень хорошо, если я делаю это в Local, используя Xampp, но когда я пытаюсь сделать это из системы, которую я разместил на своем веб-хостинге, это не работает, оно ничего не отправляет на печать.

Я также попытался создать заявку в файле PDF с библиотекой fpdf, а затем вызвать функцию Autoprint (), но недостатком является то, что я должен открыть сгенерированный файл PDF для запуска процесса печати, и это не очень хорошо идея.

¿Есть ли какой-нибудь способ печати напрямую на принтер с помощью php или javascript (без отображения диалоговых окон.)?

...