در این مقاله با نحوه تغییر یک متغییر در قالب whmcs با استفاده از هوک درخدمت شما هستیم.
گاهی مواقع برای تغییر مقدار متغییری در قالب باید فایل مورد نظر رو پیدا کنید و بعد از ویرایش آن اقدام به تغییر متغییر مدنظر خود کنید. این روش دردسرها و مشکلات خود را دارد.
ویژگی که در whmcs تعبیه شده است باعث میشود با استفاده از هوک بتوانید مقدار متغییر مربوطه رو تغییر بدید. برای اینکار ابتدا باید یک فایل با نام دلخواه (my_file.php) در مسیر زیر با نام دلخواه بسازید :
includes > hooks
برای اینکه بتوانید مقدار متغییر را تغییر دهید باید مقدار دلخواه را به متغییر موجود با return برگشت دهید.
به عنوان مثال داخل پوشه قالب فایل viewinvoice.tpl را باز میکنیم. محتوای این فایل به شرح زیر میباشد :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="{$charset}" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{$companyname} - {$pagetitle}</title> <link href="{$WEB_ROOT}/templates/{$template}/css/all.min.css" rel="stylesheet"> <link href="{$WEB_ROOT}/assets/css/fontawesome-all.min.css" rel="stylesheet"> <link href="{$WEB_ROOT}/templates/{$template}/css/invoice.css" rel="stylesheet"> <script src="{$WEB_ROOT}/templates/{$template}/js/scripts.min.js?v={$versionHash}"></script> </head> <body> <div class="container-fluid invoice-container"> {if $invalidInvoiceIdRequested} {include file="$template/includes/panel.tpl" type="danger" headerTitle=$LANG.error bodyContent=$LANG.invoiceserror bodyTextCenter=true} {else} <div class="row invoice-header"> <div class="invoice-col"> {if $logo} <p><img src="{$logo}" title="{$companyname}" /></p> {else} <h2>{$companyname}</h2> {/if} <h3>{$pagetitle}</h3> </div> <div class="invoice-col text-center"> <div class="invoice-status"> {if $status eq "Draft"} <span class="draft">{$LANG.invoicesdraft}</span> {elseif $status eq "Unpaid"} <span class="unpaid">{$LANG.invoicesunpaid}</span> {elseif $status eq "Paid"} <span class="paid">{$LANG.invoicespaid}</span> {elseif $status eq "Refunded"} <span class="refunded">{$LANG.invoicesrefunded}</span> {elseif $status eq "Cancelled"} <span class="cancelled">{$LANG.invoicescancelled}</span> {elseif $status eq "Collections"} <span class="collections">{$LANG.invoicescollections}</span> {elseif $status eq "Payment Pending"} <span class="paid">{$LANG.invoicesPaymentPending}</span> {/if} </div> {if $status eq "Unpaid" || $status eq "Draft"} <div class="small-text"> {$LANG.invoicesdatedue}: {$datedue} </div> <div class="payment-btn-container hidden-print" align="center"> {$paymentbutton} </div> {/if} </div> </div> <hr> {if $paymentSuccessAwaitingNotification} {include file="$template/includes/panel.tpl" type="success" headerTitle=$LANG.success bodyContent=$LANG.invoicePaymentSuccessAwaitingNotify bodyTextCenter=true} {elseif $paymentSuccess} {include file="$template/includes/panel.tpl" type="success" headerTitle=$LANG.success bodyContent=$LANG.invoicepaymentsuccessconfirmation bodyTextCenter=true} {elseif $paymentInititated} {include file="$template/includes/panel.tpl" type="info" headerTitle=$LANG.success bodyContent=$LANG.invoicePaymentInitiated bodyTextCenter=true} {elseif $pendingReview} {include file="$template/includes/panel.tpl" type="info" headerTitle=$LANG.success bodyContent=$LANG.invoicepaymentpendingreview bodyTextCenter=true} {elseif $paymentFailed} {include file="$template/includes/panel.tpl" type="danger" headerTitle=$LANG.error bodyContent=$LANG.invoicepaymentfailedconfirmation bodyTextCenter=true} {elseif $offlineReview} {include file="$template/includes/panel.tpl" type="info" headerTitle=$LANG.success bodyContent=$LANG.invoiceofflinepaid bodyTextCenter=true} {/if} <div class="row"> <div class="invoice-col right"> <strong>{$LANG.invoicespayto}</strong> <address class="small-text"> {$payto} {if $taxCode}<br />{$taxIdLabel}: {$taxCode}{/if} </address> </div> <div class="invoice-col"> <strong>{$LANG.invoicesinvoicedto}</strong> <address class="small-text"> {if $clientsdetails.companyname}{$clientsdetails.companyname}<br />{/if} {$clientsdetails.firstname} {$clientsdetails.lastname}<br /> {$clientsdetails.address1}, {$clientsdetails.address2}<br /> {$clientsdetails.city}, {$clientsdetails.state}, {$clientsdetails.postcode}<br /> {$clientsdetails.country} {if $clientsdetails.tax_id} <br />{$taxIdLabel}: {$clientsdetails.tax_id} {/if} {if $customfields} <br /><br /> {foreach from=$customfields item=customfield} {$customfield.fieldname}: {$customfield.value}<br /> {/foreach} {/if} </address> </div> </div> <div class="row"> <div class="invoice-col right"> <strong>{$LANG.paymentmethod}</strong><br> <span class="small-text" data-role="paymethod-info"> {if $status eq "Unpaid" && $allowchangegateway} <form method="post" action="{$smarty.server.PHP_SELF}?id={$invoiceid}" class="form-inline"> {$gatewaydropdown} </form> {else} {$paymentmethod}{if $paymethoddisplayname} ({$paymethoddisplayname}){/if} {/if} </span> <br /><br /> </div> <div class="invoice-col"> <strong>{$LANG.invoicesdatecreated}</strong><br> <span class="small-text"> {$date}<br><br> </span> </div> </div> <br /> {if $manualapplycredit} <div class="panel panel-success"> <div class="panel-heading"> <h3 class="panel-title"><strong>{$LANG.invoiceaddcreditapply}</strong></h3> </div> <div class="panel-body"> <form method="post" action="{$smarty.server.PHP_SELF}?id={$invoiceid}"> <input type="hidden" name="applycredit" value="true" /> {$LANG.invoiceaddcreditdesc1} <strong>{$totalcredit}</strong>. {$LANG.invoiceaddcreditdesc2}. {$LANG.invoiceaddcreditamount}: <div class="row"> <div class="col-xs-8 col-xs-offset-2 col-sm-4 col-sm-offset-4"> <div class="input-group"> <input type="text" name="creditamount" value="{$creditamount}" class="form-control" /> <span class="input-group-btn"> <input type="submit" value="{$LANG.invoiceaddcreditapply}" class="btn btn-success" /> </span> </div> </div> </div> </form> </div> </div> {/if} {if $notes} {include file="$template/includes/panel.tpl" type="info" headerTitle=$LANG.invoicesnotes bodyContent=$notes} {/if} <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title"><strong>{$LANG.invoicelineitems}</strong></h3> </div> <div class="panel-body"> <div class="table-responsive"> <table class="table table-condensed"> <thead> <tr> <td><strong>{$LANG.invoicesdescription}</strong></td> <td width="20%" class="text-center"><strong>{$LANG.invoicesamount}</strong></td> </tr> </thead> <tbody> {foreach from=$invoiceitems item=item} <tr> <td>{$item.description}{if $item.taxed eq "true"} *{/if}</td> <td class="text-center">{$item.amount}</td> </tr> {/foreach} <tr> <td class="total-row text-right"><strong>{$LANG.invoicessubtotal}</strong></td> <td class="total-row text-center">{$subtotal}</td> </tr> {if $taxname} <tr> <td class="total-row text-right"><strong>{$taxrate}% {$taxname}</strong></td> <td class="total-row text-center">{$tax}</td> </tr> {/if} {if $taxname2} <tr> <td class="total-row text-right"><strong>{$taxrate2}% {$taxname2}</strong></td> <td class="total-row text-center">{$tax2}</td> </tr> {/if} <tr> <td class="total-row text-right"><strong>{$LANG.invoicescredit}</strong></td> <td class="total-row text-center">{$credit}</td> </tr> <tr> <td class="total-row text-right"><strong>{$LANG.invoicestotal}</strong></td> <td class="total-row text-center">{$total}</td> </tr> </tbody> </table> </div> </div> </div> {if $taxrate} <p>* {$LANG.invoicestaxindicator}</p> {/if} <div class="transactions-container small-text"> <div class="table-responsive"> <table class="table table-condensed"> <thead> <tr> <td class="text-center"><strong>{$LANG.invoicestransdate}</strong></td> <td class="text-center"><strong>{$LANG.invoicestransgateway}</strong></td> <td class="text-center"><strong>{$LANG.invoicestransid}</strong></td> <td class="text-center"><strong>{$LANG.invoicestransamount}</strong></td> </tr> </thead> <tbody> {foreach from=$transactions item=transaction} <tr> <td class="text-center">{$transaction.date}</td> <td class="text-center">{$transaction.gateway}</td> <td class="text-center">{$transaction.transid}</td> <td class="text-center">{$transaction.amount}</td> </tr> {foreachelse} <tr> <td class="text-center" colspan="4">{$LANG.invoicestransnonefound}</td> </tr> {/foreach} <tr> <td class="text-right" colspan="3"><strong>{$LANG.invoicesbalance}</strong></td> <td class="text-center">{$balance}</td> </tr> </tbody> </table> </div> </div> <div class="pull-right btn-group btn-group-sm hidden-print"> <a href="javascript:window.print()" class="btn btn-default"><i class="fas fa-print"></i> {$LANG.print}</a> <a href="dl.php?type=i&id={$invoiceid}" class="btn btn-default"><i class="fas fa-download"></i> {$LANG.invoicesdownload}</a> </div> {/if} </div> <p class="text-center hidden-print"><a href="clientarea.php?action=invoices">{$LANG.invoicesbacktoclientarea}</a></a></p> <div id="fullpage-overlay" class="hidden"> <div class="outer-wrapper"> <div class="inner-wrapper"> <img src="{$WEB_ROOT}/assets/img/overlay-spinner.svg"> <br> <span class="msg"></span> </div> </div> </div> </body> </html>
همانطور که ملاحظه میکنید داخل این فایل متغییر های مختلفی وجود دارد، به عنوان مثال :
همه این مقادیر شامل محتوای پیشفرض whmcs میباشد برای اینکه بتوانیم مقدار هر متغییر را تغییر دهیم به شرح زیر عمل میکنیم :
return [ "companyname" => "محتوای جدید متغییر", ];
حال باید با استفاده از هوک مربوطه این مقدار را در صفحه ای که میخواهیم برگشت دهیم که در مثال زیر از هوک ClientAreaPageViewInvoice که مربوط به صفحه فاکتور ها میباشد استفاده میکنیم
add_hook('ClientAreaPageViewInvoice', 1, function() { return [ "companyname" => "محتوای جدید متغییر", ]; }
کدهای بالا را داخل فایلی که (my_file.php) در پوشه ذکر شده ایجاد کرده بودیم مینویسیم و ذخیره میکنیم. درنهایت در صفحه مربوط به فاکتور ها (ClientAreaPageViewInvoice) محتوای متغییر companyname با مقداری که وارد کردید جایگزین خواهد شد و کاربران محتوای جدید را مشاهده خواهند کرد.
امیدواریم مقاله “نحوه تغییر یک متغییر در قالب whmcs با استفاده از هوک” مورد رضایت کاربران قرار گرفته باشد.