Files
PHPShop/moneta/admpanel/admin_moneta.php
T

108 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* Æóðíàë îïåðàöèé ìîäóëÿ «Ìîíåòà» â àäìèíêå PHPShop (Ìîäóëè -> Ìîíåòà -> Æóðíàë îïåðàöèé).
*
* Êàê ôàéë ïîïàäàåò â àäìèíêó: ïóíêò ïîäìåíþ â `install/module.xml` (`podmenu_action` = `dir.moneta`)
* âåä¸ò íà `admin.php?path=modules.dir.moneta`. `admpanel/admin.php` ÿäðà ðåæåò ïóòü ïî òî÷êàì
* è ïîäêëþ÷àåò `admpanel/modules/admin_dir.php`, à òîò — `modules/<òðåòüÿ ÷àñòü ïóòè>/admpanel/
* admin_<òðåòüÿ ÷àñòü ïóòè>.php`, òî åñòü ýòîò ôàéë (èìÿ ôàéëà ìåíÿòü íåëüçÿ). Ïåðåä ýòèì ÿäðî
* çàïîëíÿåò ãëîáàëüíûå `$TitlePage` è `$select_name` (çàãîëîâîê è ïóíêòû ïîäìåíþ), ïîñëå — âûçûâàåò
* ãëîáàëüíóþ ôóíêöèþ `actionStart()`: èìÿ òîæå çàäà¸ò ÿäðî (`$loader_function`). Òàê æå â 6.7 è 7.0.
*
* Ïîäïèñü çàïðîñà è êîä ïðîâåðêè öåëîñòíîñòè â æóðíàë íå ïèøóòñÿ.
*/
require_once dirname(__DIR__) . '/class/autoload.php';
use MonetaPhpShop\callback\CallbackEvent;
use MonetaPhpShop\host\Database;
use MonetaPhpShop\host\HostCharset;
use MonetaPhpShop\host\OperationRepository;
use MonetaPhpShop\protocol\TransactionId;
function actionStart()
{
global $PHPShopInterface, $TitlePage, $select_name;
// Íà ñòðàíèöó îòäà¸ì òîëüêî 500 ïîñëåäíèõ çàïèñåé, íîâûå ñâåðõó. Ïîñòðàíè÷íûé âûâîä, ïîèñê
// è ñîðòèðîâêó äåëàåò DataTables, êîòîðûì ÿäðî îáîðà÷èâàåò òàáëèöó àäìèíêè (admpanel/js/phpshop.js),
// — â áðàóçåðå, ïî óæå âûâåäåííûì ñòðîêàì; áåç ëèìèòà ñòðàíèöà ðîñëà áû âìåñòå ñ æóðíàëîì.
// À îí íå ÷èñòèòñÿ è ðàñò¸ò áûñòðî: íà êàæäîå óâåäîìëåíèå ñòðîêà, íà çàêàç èõ ìèíèìóì äâå
// (Check URL è Pay URL), ïðîâåðî÷íûé çàïðîñ MONETA.RU ìîæåò ïðèñëàòü íåñêîëüêî ðàç, à Pay URL
// ïîñëå îòâåòà FAIL ïîâòîðÿåò äî ñóòîê. Ñòàðûå çàïèñè îñòàþòñÿ â òàáëèöå, íà ýêðàí íå âûâîäÿòñÿ.
$limit = 500;
$escape = static function (string $value): string {
return htmlspecialchars($value, ENT_QUOTES, 'Windows-1251');
};
// Íà ìàãàçèíå ñ áàçîé utf-8 ÿäðî ïåðåêîäèðóåò çàãîëîâêè setCaption(), íî íå ÿ÷åéêè setRow()
// è íå ðàçìåòêó ïàíåëè — òåêñòû ìîäóëÿ ïåðåêîäèðóþòñÿ çäåñü. Ââåä¸ííîå â ïîèñê è ñòðîêè
// æóðíàëà (ASCII) óæå â êîäèðîâêå ñòðàíèöû.
$page = static function (string $text): string {
return HostCharset::toPage($text);
};
// Ôèëüòð ïî çàêàçó: íîìåð (`33-57`) èëè öåëèêîì MNT_TRANSACTION_ID èç êàáèíåòà MONETA.RU.
// Èùåò ïî âñåìó æóðíàëó, à íå òîëüêî ïî âûâåäåííûì ñòðîêàì, êàê ïîèñê DataTables.
$input = isset($_GET['moneta_order']) && is_string($_GET['moneta_order']) ? trim($_GET['moneta_order']) : '';
$orderUid = $input !== '' ? TransactionId::orderUidFromInput($input) : null;
$PHPShopInterface->checkbox_action = false;
$PHPShopInterface->setActionPanel($TitlePage, $select_name, false);
// Ïîä ïàíåëüþ ñ çàãîëîâêîì, âíå ôîðì ÿäðà: Compile() âûâîäèò actionPanel ïåðåä òàáëèöåé.
$PHPShopInterface->actionPanel .= '<form method="get" class="form-inline" style="margin: 0 0 10px 15px">'
. '<input type="hidden" name="path" value="modules.dir.moneta">'
. '<input type="text" name="moneta_order" value="' . $escape($input) . '" class="form-control input-sm"'
. $page(
' style="width: 300px" placeholder="Íîìåð çàêàçà èëè MNT_TRANSACTION_ID"> '
. '<button type="submit" class="btn btn-default btn-sm">Íàéòè</button> '
. ($input !== '' ? '<a href="?path=modules.dir.moneta" class="btn btn-link btn-sm">Ñáðîñèòü</a>' : '')
. ($input !== '' && $orderUid === null
? ' <span class="text-danger">Íîìåð çàêàçà íå ðàñïîçíàí — ïîêàçàí âåñü æóðíàë</span>'
: '')
. '</form>',
);
$PHPShopInterface->setCaption(
['Äàòà', '12%'],
['Çàêàç', '8%'],
['Çàïðîñ', '8%'],
['Ñîáûòèå', '30%'],
['Îòâåò', '6%'],
['Ñóììà', '8%'],
['Íîìåð îïåðàöèè', '8%'],
['Èäåíòèôèêàòîð çàêàçà', '20%']
);
$rows = (new OperationRepository(Database::fromHost()))->latest($limit, $orderUid);
foreach ($rows as $row) {
$orderId = (int) $row['order_id'];
$order = $orderId > 0
? ['name' => $escape((string) $row['order_uid']), 'link' => '?path=order&id=' . $orderId]
: $page('—');
$command = (string) $row['command'] === 'CHECK' ? 'Ïðîâåðêà' : 'Îïëàòà';
if ((string) $row['test_mode'] === '1') {
$command .= ' (òåñò)';
}
$resultCode = $row['result_code'] === null ? null : (int) $row['result_code'];
$icon = CallbackEvent::iconHtml((string) $row['event'], $resultCode);
$event = ($icon === '' ? '' : $icon . ' ') . $escape(CallbackEvent::label((string) $row['event']));
$PHPShopInterface->setRow(
PHPShopDate::get((int) $row['created_at'], true),
$order,
$page($command),
$page($event),
$row['result_code'] === null ? 'FAIL' : (string) $row['result_code'],
['name' => $escape((string) $row['amount']), 'align' => 'right'],
$escape((string) $row['operation_id']),
$escape((string) $row['transaction_id'])
);
}
$PHPShopInterface->Compile();
}