Я получаю эти этикетки для кабинета врача, и они должны быть напечатаны. Печать выполняется с помощью пользовательской надстройки меню календаря C # Outlook, вызываемой правой кнопкой мыши, поэтому локальные принтеры не используются. Кроме того, эта установка PHP была установлена задолго до моего времени и не переписывается для клиента.
ArrivalHelper.php
Система вызывает скрипт ниже, «PrintersMgmt.php», а затем вызывает PinnaclePDO.php
подключиться к экземпляру MySQL, работающему на сервере Ubuntu, чтобы найти местоположение офиса (в данном случае locID равно 2), а затем находит принтер в этой таблице MySQL и на каком сервере (в данном случае cc-fp2), который его размещает, и отправляет эта информация возвращается к печати.
Мне нужно найти способ сделать это лучше. Я думал об использовании JavaScript, чтобы открыть диалоговое окно печати, но я понятия не имею, как реализовать это здесь. Может кто-нибудь дать нубу PHP несколько указателей?
<?php
class PrintersMgmt {
const PRINT_ALL_LABELS = 0x1;
const PRINT_ONE_LABEL = 0x10;
const PRINT_PASSPORT = 0x100;
const PRINT_REFERRAL = 0x1000;
const PRINTER_TYPE_LETTER = 1;
const PRINTER_TYPE_LABEL = 2;
const
ARRIVAL_URL = 'http://localhost/arrival.php';
const QUERY_GET_PRINTER_BY_LOC_TYPE =
'SELECT * FROM LocationPrinters
WHERE locID = :loc AND printerType = :type
ORDER BY printerPriority
LIMIT 1';
private $dbh;
public function __construct() {
$this->dbh = new PinnaclePDO();
}
public function getByLocationType( $loc, $type ) {
$stmt = $this->dbh->prepare( self::QUERY_GET_PRINTER_BY_LOC_TYPE );
$stmt->bindValue( ':loc', $loc );
$stmt->bindValue( ':type', $type );
$stmt->execute();
return $stmt->fetch();
}
public function printPassport( $locId, $hin, $date, $userName, $method ) {
$printFlags = $this->getPrintFlags($method);
$referral = ( ! ($printFlags & self::PRINT_REFERRAL) == 0 );
$passport = ( ! ($printFlags & self::PRINT_PASSPORT) == 0 );
$printer = $this->getByLocationType( $locId, 1 );
if ( $printer ) {
$cmd = '.\firefox.exe';
$args = sprintf(
' -print "%s?method=%s&hin=%s&user=%s&referral=%d&passport=%d"' .
' -printprinter "\\\\' . $printer[ 'printerHost' ] . '\\' . $printer[ 'printerName' ] .'"',
self::ARRIVAL_URL, 'listconfirmed',
$hin, urlencode( $userName ), $referral, $passport
);
if ( isset( $_GET[ 'debug' ] ) ) {
print "Print with args: '$cmd $args'<br/>";
}
chdir( "C:/Program Files/Mozilla Firefox2/" );
shell_exec($cmd.$args);
}
return true;
}
public function printLabel( $locId, $hin, $date, $method ) {
$printFlags = $this->getPrintFlags($method);
$printer = $this->getByLocationType( $locId, 2 );
$number = ( ( $printFlags & self::PRINT_ONE_LABEL ) == 0 ) ? 'all' : 'one' ;
$cmd = 'LabelPrinter.exe';
$args = sprintf(
' /print %s %s "%s" %s',
$hin, $date, $printer[ 'printerName' ], $number );
if ( isset( $_GET[ 'debug' ] ) ) {
print sprintf( 'Printing \'%s\' labels \'%s %s\'<br/>',
$number, $cmd, $args );
} else {
chdir( "C:/Program Files/(truncated)/(truncated) Tools" );
shell_exec( $cmd . $args);
}
return true;
}
public function getPrintFlags( $arriveMethod ) {
$printFlags = 0x1101;
switch ( $arriveMethod ) {
case 'arrive':
$printFlags =
( self::PRINT_ALL_LABELS
| self::PRINT_PASSPORT
| self::PRINT_REFERRAL );
break;
case 'reprintpassport':
$printFlags = self::PRINT_PASSPORT;
break;
case 'reprintreferral':
$printFlags = self::PRINT_REFERRAL;
break;
case 'reprintlabel':
$printFlags = self::PRINT_ONE_LABEL;
break;
default:
$printFlags = null;
}
return $printFlags;
}
}
?>
Задача ещё не решена.
Других решений пока нет …