<?php 
/** 
 * WordTemplateEngine - creation of WORD documents from .docx templates, 
 * conversion of the documents through LibreOffice to other formats: PDF, HTML, XHTML, HTML adapted to email. 
 * 
 * PHP Version 7.1 
 * 
 * @see        https://github.com/philip-sorokin/word-template-engine The WordTemplateEngine GitHub project 
 * @see        https://addondev.com/opensource/word-template-engine The project manual 
 * 
 * @version    1.0.2 
 * @author     Philip Sorokin <[email protected]> 
 * @copyright  2021 - Philip Sorokin 
 * @license    http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License 
 * @note       This program is distributed in the hope that it will be useful - WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 */ 
 
/** 
 * WordTemplateEngineExamples is a sample class for demonstrating WordTemplateEngine methods. 
 * 
 */ 
class WordTemplateEngineExamples 
{ 
    /** 
     * Template getter example. 
     * 
     * @static 
     * 
     * @return   WordTemplateEngine 
     * 
     */ 
    public static function getTemplate(): WordTemplateEngine 
    { 
        $templatePath = __DIR__ . DIRECTORY_SEPARATOR . 'template.docx'; 
 
        $tmpDir_optional = $_SERVER['DOCUMENT_ROOT']; 
        $errorHandler_optional  = [__CLASS__, 'self::errorHandler']; 
 
        return new WordTemplateEngine($templatePath, $tmpDir_optional, $errorHandler_optional); 
    } 
 
 
    /** 
     * Example of variable replacement. 
     * 
     * @param    WordTemplateEngine   $template 
     * @static 
     * 
     * @return   WordTemplateEngine 
     * 
     */ 
    public static function replaceVariables(WordTemplateEngine $template): WordTemplateEngine 
    { 
        // Clone the table row with the variable ${qty} five times 
        $template->cloneRow('qty', 5); 
 
        // The row variables 
        $products = [ 
            1 => [ 
                'qty' => 3, 
                'item_sku' => '1-ATF-5', 
                'description' => 'Full Arch Bed Grey', 
                'unit_price' => '500 ?', 
                'discount' => '15 ?', 
                'total_item' => '1485 ?', 
            ], 
            2 => [ 
                'qty' => 1, 
                'item_sku' => '4-YMJ-7', 
                'description' => 'Night Stand White', 
                'unit_price' => '200 ?', 
                'discount' => '10 ?', 
                'total_item' => '190 ?', 
            ], 
            3 => [ 
                'qty' => 2, 
                'item_sku' => '15-IMA-6', 
                'description' => 'Mirror Driftwood', 
                'unit_price' => '400 ?', 
                'discount' => '', 
                'total_item' => '800 ?', 
            ], 
            4 => [ 
                'qty' => 4, 
                'item_sku' => '5-MJ8-16', 
                'description' => 'Dresser Grey', 
                'unit_price' => '600 ?', 
                'discount' => '', 
                'total_item' => '2400 ?', 
            ], 
            5 => [ 
                'qty' => 2, 
                'item_sku' => '9-ODA-8', 
                'description' => 'Twin Bunk Driftwood', 
                'unit_price' => '800 ?', 
                'discount' => '20 ?', 
                'total_item' => '1580 ?', 
            ], 
        ]; 
 
        foreach($products as $key => $product) 
        { 
            foreach($product as $prop => $value) 
            { 
                $name = $prop . '#' . $key; 
                $template->setValue($name, $value); 
            } 
        } 
 
        // Other variables 
        $orderInfo = [ 
            'subtotal' => '6455 ?', 
            'sales_tax' => '700 ?', 
            'total_discount' => '45 ?', 
            'total_sum' => '7155 ?', 
            'salesperson' => 'Jane Doe', 
            'job' => 'Sales assistant', 
            'shipping_method' => 'FedEx', 
            'shipping_terms' => 'Delivered At Place', 
            'delivery_date' => '2030/12/31', 
            'payment_terms' => 'Cash on delivery', 
            'due_date' => '2030/12/30', 
            'to_name' => 'Elisha Barton', 
            'to_company_name' => 'Ondricka LLC', 
            'to_street_address' => '375 Nikko Fall Apt. 358', 
            'to_phone' => '+19(440)554-5942', 
            'ship_to_name' => 'Ila Gutmann', 
            'ship_to_company_name' => 'Bartoletti Group', 
            'ship_to_street_address' => '1707 Berge Viaduct Suite 724', 
            'ship_to_phone' => '+13813440037', 
            'invoice_date' => '2030/12/01', 
            'invoice_id' => 'A19583', 
            'customer_id' => 'U385', 
            'company_name' => 'Witting Group', 
            'company_director' => 'John Doe', 
            'company_address' => '1250 Lula River Suite 965', 
            'company_phone' => '+1-653-572-8295', 
            'company_fax' => '+1-653-572-8787', 
            'company_email' => '[email protected]', 
        ]; 
 
        foreach($orderInfo as $name => $value) 
        { 
            $template->setValue($name, $value); 
        } 
 
        return $template; 
    } 
 
 
    /** 
     * Example of alternative variable syntax. 
     * 
     * @param    WordTemplateEngine   $template 
     * @static 
     * 
     * @return   WordTemplateEngine 
     * 
     */ 
    public static function replaceAlternativeVariables(WordTemplateEngine $template): WordTemplateEngine 
    { 
        // Switch to the alternative variable syntax like ~(var_name) if you like it more, it also allows to replace the variables in hyperlinks. 
        $template->alternativeSyntax(true); 
 
        $orderInfo = [ 
            'company_name' => 'AddonDev', 
            'company_phone' => '+79264104108', 
            'company_email' => '[email protected]', 
            'company_website' => 'https://addondev.com', 
            'github_url' => 'https://github.com/philip-sorokin/word-template-engine', 
            'donate_url' => 'https://addondev.com/donate', 
        ];  
 
        foreach($orderInfo as $name => $value) 
        { 
            $template->setValue($name, $value); 
        } 
 
        // Switch back to the default syntax like ${var_name} if you need. 
        $template->alternativeSyntax(false); 
 
        return $template; 
    } 
 
 
    /** 
     * Example of defining document metadata. 
     * 
     * @param    WordTemplateEngine   $template 
     * @static 
     * 
     * @return   WordTemplateEngine 
     * 
     */ 
    public static function setDocumentInfo(WordTemplateEngine $template): WordTemplateEngine 
    { 
        // Drop all metadata  
        // Warning! After calling this method you have to redefine the document creation time, the title and the document creator! 
        $template->dropMetaData(); 
 
        // Set new metadata 
        $template->setTime(); 
        $template->setCompany('Witting Group'); 
        $template->setManager('John Doe'); 
        $template->setTitle('Invoice A19583'); 
        $template->setAuthor('Jane Doe'); 
        $template->setSubject('Invoice for Elisha Barton'); 
        $template->setKeywords('Documents, payment, order'); 
 
        // Delete this metadata (actually, it's already removed, we use this as an example). 
        $template->setDescription(''); 
        $template->setCategory(''); 
        $template->setStatus(''); 
 
        return $template; 
    } 
 
 
    /** 
     * Example of outputting a document in DOCX format. 
     * 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function outputDocument(): void 
    { 
        // Get the template. 
        $template = self::getTemplate(); 
 
        // Set document metadata. 
        $template = self::setDocumentInfo($template); 
 
        // Replace the variables written in default syntax. 
        $template = self::replaceVariables($template); 
 
        // Replace the variables written in alternative syntax. 
        $template = self::replaceAlternativeVariables($template); 
 
        // Output the document. 
        $template->output('docx', 'Invoice A19583.docx'); 
    } 
 
 
    /** 
     * Example of outputting a document in PDF format. 
     * 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function outputPDF(): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
 
        $template->output('pdf', 'Invoice A19583.pdf'); 
    } 
 
 
    /** 
     * Example of saving a document in different formats. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function saveDocument(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
        $template = self::setDocumentInfo($template); 
 
        // Use the full path outside the working directory. 
        $template->save($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . "Invoice A19583.$format", $format); 
    } 
 
 
    /** 
     * Example of outputting the first document section in different formats. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function outputFirstSection(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
 
        // Truncate the document to the first section. 
        // If you have images in removed sections, you need to remove them manually BEFORE truncating the document to reduce its size. 
        // You can also copy the working section after truncating, only the first section. 
        $template->useSection(1); 
 
        // Replace the variables AFTER copying, as we do not need to process deleted content. 
        $template = self::replaceVariables($template); 
        $template->output($format, "Invoice A19583.$format"); 
    } 
 
 
    /** 
     * Example of copying the whole document and outputting it in different formats. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function copyDocument(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
 
        // Replace variables BEFORE copying. It may be faster to replace AFTER copying, which depends on your document. 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
 
        // Make one copy of the whole document 
        $template->repeat(1); 
        $template->output($format, "Invoice A19583.$format"); 
    } 
 
 
    /** 
     * Example of copying the first document section and outputting it in different formats. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function copyFirstSection(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
 
        // Make one copy of the first section and append it to the end of the document. 
        $template->repeat(1, 1); 
 
        // Replace variables AFTER copying. It may be faster to replace BEFORE copying, which depends on your document. 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
 
        $template->output($format, "Invoice A19583.$format"); 
    } 
 
 
    /** 
     * Example of deleting an image and outputting a document in different formats. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function deleteSignature(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
 
        // Refer to an image id according to the Word enumerator. 
        $template->deleteImage(2); 
 
        $template->output($format, "Invoice A19583.$format"); 
    } 
 
 
    /** 
     * Example of replacing an image with another image. 
     * 
     * @param   string   $format 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function replaceSignature(string $format = 'docx'): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
        $template = self::replaceVariables($template); 
        $template = self::replaceAlternativeVariables($template); 
 
        // The path of a new image. 
        $new_img_path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'img_samples' . DIRECTORY_SEPARATOR . 'xx_signature.png'; 
 
        // Refer to an image id according to the Word enumerator. 
        $template->replaceImage(2, $new_img_path); 
 
        $template->output($format, "Invoice A19583.$format"); 
    } 
 
 
    /** 
     * Example of outputting a document in HTML/XHTML format. 
     * 
     * @param   bool  $xhtml 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function outputHTML(bool $xhtml = false): void 
    { 
        $template = self::getTemplate(); 
        $template = self::setDocumentInfo($template); 
 
        $template->useSection(1); 
        $template = self::replaceVariables($template); 
 
        // Set any styles and scripts. 
        $template->embedStyleSheet('table:first-of-type tr:first-of-type td:last-child span {color: red}'); 
        $template->embedStyleSheet('.Table4_E10 {position: relative} .P7 {position: absolute; bottom: -14px}'); 
        $template->embedScript("console.log('Hello World!');"); 
 
        $template->output($xhtml ? 'xhtml' : 'html'); 
    } 
 
 
    /** 
     * Example of creating an HTML document adapted to email and mailing it to a reciever. 
     * 
     * @param   string   $from   Sender email. 
     * @param   string   $to     Reciever email. 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function mailHTML(string $from, string $to): void 
    { 
        $template = self::getTemplate(); 
        $template->useSection(1); 
        $template = self::replaceVariables($template); 
 
        // Set some simple styles like .class, #id, table.class, p#id, *, div, span, p, table... other elements. 
        $template->embedStyleSheet('.T1 {color: purple}'); 
 
        // Use a temporary working directory, that is removed by the destructor. 
        // As we do not need this file after sending an email. 
        $path = $template->save('invoice.html', 'mail'); 
 
        $contents = file_get_contents($path); 
 
        $path = preg_replace('#^[/\\\]+#', '', str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__))) . '/img_samples/'; 
        $imageDirUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $path; 
 
        // Set images instead of placeholders. We remove the document images, because they can be invalid for the mail. We replace them with HTML comments. 
        // You can also replace the comments and variables with HTML elements, but AFTER generating the HTML document. 
        $contents = str_ireplace('<!--[image_1]-->', '<img src="' . $imageDirUrl . 'logo.png" />', $contents); 
        $contents = str_ireplace('<!--[image_2]-->', '<img src="' . $imageDirUrl . 'jd_signature.png" style="width: 107px; height: 32px;" widht="107" height="32" />', $contents); 
 
        $headers = [ 
            'MIME-Version: 1.0', 
            'Content-type: text/html; charset=utf-8', 
            'To: Customer <' . $to . '>', 
            'From: Your company <' . $from . '>', 
        ]; 
 
        // Example of mail function. 
        mail($to, 'Invoice A19583', $contents, implode("\r\n", $headers)); 
    } 
 
 
    /** 
     * Trigger an error to process it with a custom error handler. 
     * 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function simulateError(): void 
    { 
        $template = self::getTemplate(); 
 
        // Use a not existing section to trigger an error. 
        $template->useSection(100500); 
    } 
 
 
    /** 
     * Custom error handler example. 
     * 
     * @param    string   $errorText 
     * @param    string   $errorStatus 
     * @static 
     * 
     * @return  void 
     * 
     */ 
    public static function errorHandler(string $errorText, string $errorStatus): void 
    { 
        printf('Error processing using custom error handler. Error status: <b>%s</b>, error text: <b>%s</b>', $errorStatus, $errorText); 
         
        exit; 
    } 
} 
 
 |