Fix @page header activation for body-only template CSS

This commit is contained in:
DevSoftTech Server 2026-08-18 16:13:53 +05:30
parent d87b38e7f0
commit b068fc3be2

View File

@ -7369,25 +7369,12 @@ class Ipd_discharge extends BaseController
$useHeader = $withHeader && $headerHtml !== ''; $useHeader = $withHeader && $headerHtml !== '';
$useFooter = $footerHtml !== ''; $useFooter = $footerHtml !== '';
// Auto-inject header/footer name bindings into @page if CSS has one but misses the binding. // Build @page block from margin fields — always prepend it so the header/footer bindings work.
if ($templateCss !== '') {
if ($useHeader && !preg_match('/header\s*:\s*html_myHeader/i', $templateCss)) {
$templateCss = preg_replace_callback('/@page\s*\{/', function ($m) {
return $m[0] . "\n header: html_myHeader;";
}, $templateCss, 1) ?? $templateCss;
}
if ($useFooter && !preg_match('/footer\s*:\s*html_myFooter/i', $templateCss)) {
$templateCss = preg_replace_callback('/@page\s*\{/', function ($m) {
return $m[0] . "\n footer: html_myFooter;";
}, $templateCss, 1) ?? $templateCss;
}
} else {
// No CSS: build a minimal @page block from the margin form fields.
$marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8); $marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8);
$marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8); $marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8);
$marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5); $marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5);
$marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5); $marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5);
$templateCss = '@page {' $pageBlock = '@page {'
. "\n margin-top: {$marginTopCm}cm;" . "\n margin-top: {$marginTopCm}cm;"
. "\n margin-bottom: {$marginBottomCm}cm;" . "\n margin-bottom: {$marginBottomCm}cm;"
. "\n margin-header: {$marginHeaderCm}cm;" . "\n margin-header: {$marginHeaderCm}cm;"
@ -7395,10 +7382,26 @@ class Ipd_discharge extends BaseController
. ($useHeader ? "\n header: html_myHeader;" : '') . ($useHeader ? "\n header: html_myHeader;" : '')
. ($useFooter ? "\n footer: html_myFooter;" : '') . ($useFooter ? "\n footer: html_myFooter;" : '')
. "\n}"; . "\n}";
// If the user wrote their own @page in the CSS, merge by replacing ours (theirs takes precedence).
if ($templateCss !== '' && preg_match('/@page\s*\{/i', $templateCss)) {
// Inject header/footer bindings if missing in the user's @page block.
if ($useHeader && !preg_match('/header\s*:\s*html_myHeader/i', $templateCss)) {
$templateCss = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
return $m[0] . "\n header: html_myHeader;";
}, $templateCss, 1);
}
if ($useFooter && !preg_match('/footer\s*:\s*html_myFooter/i', $templateCss)) {
$templateCss = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
return $m[0] . "\n footer: html_myFooter;";
}, $templateCss, 1);
}
$pageBlock = ''; // user's CSS already has @page
} }
// Assemble exactly as shown in mPDF documentation: CSS → named blocks → content. // Assemble: @page block → template CSS → named header/footer blocks → content.
$pdfHtml = '<style>' . "\n" . $templateCss . "\n" . '</style>' . "\n"; $pdfHtml = '<style>' . "\n" . $pageBlock . "\n" . '</style>' . "\n";
$pdfHtml .= ($templateCss !== '' ? '<style>' . "\n" . $templateCss . "\n" . '</style>' . "\n" : '');
if ($useHeader) { if ($useHeader) {
$pdfHtml .= '<htmlpageheader name="myHeader">' . "\n" . $headerHtml . "\n" . '</htmlpageheader>' . "\n"; $pdfHtml .= '<htmlpageheader name="myHeader">' . "\n" . $headerHtml . "\n" . '</htmlpageheader>' . "\n";
} }