Вход Регистрация
Файл: contao-3.5.8/system/modules/core/modules/ModuleArticle.php
Строк: 260
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * Provides methodes to handle articles.
 *
 * @property integer $tstamp
 * @property string  $title
 * @property string  $alias
 * @property string  $inColumn
 * @property boolean $showTeaser
 * @property boolean $multiMode
 * @property string  $teaser
 * @property string  $teaserCssID
 * @property string  $classes
 * @property string  $keywords
 * @property boolean $printable
 * @property boolean $published
 * @property integer $start
 * @property integer $stop
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class ModuleArticle extends Module
{

    
/**
     * Template
     * @var string
     */
    
protected $strTemplate 'mod_article';

    
/**
     * No markup
     * @var boolean
     */
    
protected $blnNoMarkup false;


    
/**
     * Check whether the article is published
     *
     * @param boolean $blnNoMarkup
     *
     * @return string
     */
    
public function generate($blnNoMarkup=false)
    {
        if (
TL_MODE == 'FE' && !BE_USER_LOGGED_IN && (!$this->published || ($this->start != '' && $this->start time()) || ($this->stop != '' && $this->stop time())))
        {
            return 
'';
        }

        
$this->type 'article';
        
$this->blnNoMarkup $blnNoMarkup;

        return 
parent::generate();
    }


    
/**
     * Generate the module
     */
    
protected function compile()
    {
        
/** @var PageModel $objPage */
        
global $objPage;

        if (
$this->blnNoMarkup)
        {
            
/** @var FrontendTemplate|object $objTemplate */
            
$objTemplate = new BackendTemplate('mod_article_plain');

            
$this->Template $objTemplate;
            
$this->Template->setData($this->arrData);
        }

        
$alias $this->alias ?: 'article';

        if (
in_array($alias, array('article''top''wrapper''header''container''left''main''right''footer')))
        {
            
$alias .= '-' $this->id;
        }

        
$alias standardize($alias);

        
// Generate the cssID if it is not set
        
if ($this->cssID[0] == '')
        {
            
$this->cssID = array($alias$this->cssID[1]);
        }

        
$this->Template->column $this->inColumn;

        
// Add the modification date
        
$this->Template->timestamp $this->tstamp;
        
$this->Template->date Date::parse($objPage->datimFormat$this->tstamp);

        
// Clean the RTE output
        
if ($objPage->outputFormat == 'xhtml')
        {
            
$this->teaser StringUtil::toXhtml($this->teaser);
        }
        else
        {
            
$this->teaser StringUtil::toHtml5($this->teaser);
        }

        
// Show the teaser only
        
if ($this->multiMode && $this->showTeaser)
        {
            
/** @var FrontendTemplate|object $objTemplate */
            
$objTemplate = new BackendTemplate('mod_article_teaser');

            
$this->Template $objTemplate;
            
$this->Template->setData($this->arrData);

            
$this->cssID = array($alias'');
            
$arrCss deserialize($this->teaserCssID);

            
// Override the CSS ID and class
            
if (is_array($arrCss) && count($arrCss) == 2)
            {
                if (
$arrCss[0] == '')
                {
                    
$arrCss[0] = $alias;
                }

                
$this->cssID $arrCss;
            }

            
$article = (!Config::get('disableAlias') && $this->alias != '') ? $this->alias $this->id;
            
$href '/articles/' . (($this->inColumn != 'main') ? $this->inColumn ':' '') . $article;

            
$this->Template->headline $this->headline;
            
$this->Template->href $objPage->getFrontendUrl($href);
            
$this->Template->teaser $this->teaser;
            
$this->Template->readMore specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['readMore'], $this->headline), true);
            
$this->Template->more $GLOBALS['TL_LANG']['MSC']['more'];

            return;
        }

        
// Get section and article alias
        
list($strSection$strArticle) = explode(':'Input::get('articles'));

        if (
$strArticle === null)
        {
            
$strArticle $strSection;
        }

        
// Overwrite the page title (see #2853 and #4955)
        
if (!$this->blnNoMarkup && $strArticle != '' && ($strArticle == $this->id || $strArticle == $this->alias) && $this->title != '')
        {
            
$objPage->pageTitle strip_tags(strip_insert_tags($this->title));

            if (
$this->teaser != '')
            {
                
$objPage->description $this->prepareMetaDescription($this->teaser);
            }
        }

        
$this->Template->printable false;
        
$this->Template->backlink false;

        
// Back link
        
if (!$this->multiMode && $strArticle != '' && ($strArticle == $this->id || $strArticle == $this->alias))
        {
            
$this->Template->backlink 'javascript:history.go(-1)'// see #6955
            
$this->Template->back specialchars($GLOBALS['TL_LANG']['MSC']['goBack']);
        }

        
$arrElements = array();
        
$objCte ContentModel::findPublishedByPidAndTable($this->id'tl_article');

        if (
$objCte !== null)
        {
            
$intCount 0;
            
$intLast $objCte->count() - 1;

            while (
$objCte->next())
            {
                
$arrCss = array();

                
/** @var ContentModel $objRow */
                
$objRow $objCte->current();

                
// Add the "first" and "last" classes (see #2583)
                
if ($intCount == || $intCount == $intLast)
                {
                    if (
$intCount == 0)
                    {
                        
$arrCss[] = 'first';
                    }

                    if (
$intCount == $intLast)
                    {
                        
$arrCss[] = 'last';
                    }
                }

                
$objRow->classes $arrCss;
                
$arrElements[] = $this->getContentElement($objRow$this->strColumn);
                ++
$intCount;
            }
        }

        
$this->Template->teaser $this->teaser;
        
$this->Template->elements $arrElements;

        if (
$this->keywords != '')
        {
            
$GLOBALS['TL_KEYWORDS'] .= (($GLOBALS['TL_KEYWORDS'] != '') ? ', ' '') . $this->keywords;
        }

        
// Backwards compatibility
        
if ($this->printable == 1)
        {
            
$this->Template->printable true;
            
$this->Template->pdfButton true;
        }

        
// New structure
        
elseif ($this->printable != '')
        {
            
$options deserialize($this->printable);

            if (!empty(
$options) && is_array($options))
            {
                
$this->Template->printable true;
                
$this->Template->printButton in_array('print'$options);
                
$this->Template->pdfButton in_array('pdf'$options);
                
$this->Template->facebookButton in_array('facebook'$options);
                
$this->Template->twitterButton in_array('twitter'$options);
                
$this->Template->gplusButton in_array('gplus'$options);
            }
        }

        
// Add syndication variables
        
if ($this->Template->printable)
        {
            
$request Environment::get('indexFreeRequest');

            
$this->Template->print '#';
            
$this->Template->encUrl rawurlencode(Environment::get('base') . Environment::get('request'));
            
$this->Template->encTitle rawurlencode($objPage->pageTitle);
            
$this->Template->href $request . ((strpos($request'?') !== false) ? '&amp;' '?') . 'pdf=' $this->id;

            
$this->Template->printTitle specialchars($GLOBALS['TL_LANG']['MSC']['printPage']);
            
$this->Template->pdfTitle specialchars($GLOBALS['TL_LANG']['MSC']['printAsPdf']);
            
$this->Template->facebookTitle specialchars($GLOBALS['TL_LANG']['MSC']['facebookShare']);
            
$this->Template->twitterTitle specialchars($GLOBALS['TL_LANG']['MSC']['twitterShare']);
            
$this->Template->gplusTitle specialchars($GLOBALS['TL_LANG']['MSC']['gplusShare']);
        }

        
// HOOK: add custom logic
        
if (isset($GLOBALS['TL_HOOKS']['compileArticle']) && is_array($GLOBALS['TL_HOOKS']['compileArticle']))
        {
            foreach (
$GLOBALS['TL_HOOKS']['compileArticle'] as $callback)
            {
                
$this->import($callback[0]);
                
$this->{$callback[0]}->{$callback[1]}($this->Template$this->arrData$this);
            }
        }
    }


    
/**
     * Print an article as PDF and stream it to the browser
     */
    
public function generatePdf()
    {
        
$this->headline $this->title;
        
$this->printable false;

        
// Generate article
        
$strArticle $this->replaceInsertTags($this->generate(), false);
        
$strArticle html_entity_decode($strArticleENT_QUOTESConfig::get('characterSet'));
        
$strArticle $this->convertRelativeUrls($strArticle''true);

        
// Remove form elements and JavaScript links
        
$arrSearch = array
        (
            
'@<form.*</form>@Us',
            
'@<a [^>]*href="[^"]*javascript:[^>]+>.*</a>@Us'
        
);

        
$strArticle preg_replace($arrSearch''$strArticle);

        
// HOOK: allow individual PDF routines
        
if (isset($GLOBALS['TL_HOOKS']['printArticleAsPdf']) && is_array($GLOBALS['TL_HOOKS']['printArticleAsPdf']))
        {
            foreach (
$GLOBALS['TL_HOOKS']['printArticleAsPdf'] as $callback)
            {
                
$this->import($callback[0]);
                
$this->{$callback[0]}->{$callback[1]}($strArticle$this);
            }
        }

        
// URL decode image paths (see #6411)
        
$strArticle preg_replace_callback('@(src="[^"]+")@', function ($arg) {
            return 
rawurldecode($arg[0]);
        }, 
$strArticle);

        
// Handle line breaks in preformatted text
        
$strArticle preg_replace_callback('@(<pre.*</pre>)@Us', function ($arg) {
            return 
str_replace("n"'<br>'$arg[0]);
        }, 
$strArticle);

        
// Default PDF export using TCPDF
        
$arrSearch = array
        (
            
'@<span style="text-decoration: ?underline;?">(.*)</span>@Us',
            
'@(<img[^>]+>)@',
            
'@(<div[^>]+block[^>]+>)@',
            
'@[nrt]+@',
            
'@<br( /)?><div class="mod_article@',
            
'@href="([^"]+)(pdf=[0-9]*(&|&amp;)?)([^"]*)"@'
        
);

        
$arrReplace = array
        (
            
'<u>$1</u>',
            
'<br>$1',
            
'<br>$1',
            
' ',
            
'<div class="mod_article',
            
'href="$1$4"'
        
);

        
$strArticle preg_replace($arrSearch$arrReplace$strArticle);

        
// TCPDF configuration
        
$l['a_meta_dir'] = 'ltr';
        
$l['a_meta_charset'] = Config::get('characterSet');
        
$l['a_meta_language'] = substr($GLOBALS['TL_LANGUAGE'], 02);
        
$l['w_page'] = 'page';

        
// Include library
        
require_once TL_ROOT '/system/config/tcpdf.php';

        
// Create new PDF document
        
$pdf = new TCPDF(PDF_PAGE_ORIENTATIONPDF_UNITPDF_PAGE_FORMATtrue);

        
// Set document information
        
$pdf->SetCreator(PDF_CREATOR);
        
$pdf->SetAuthor(PDF_AUTHOR);
        
$pdf->SetTitle($this->title);
        
$pdf->SetSubject($this->title);
        
$pdf->SetKeywords($this->keywords);

        
// Prevent font subsetting (huge speed improvement)
        
$pdf->setFontSubsetting(false);

        
// Remove default header/footer
        
$pdf->setPrintHeader(false);
        
$pdf->setPrintFooter(false);

        
// Set margins
        
$pdf->SetMargins(PDF_MARGIN_LEFTPDF_MARGIN_TOPPDF_MARGIN_RIGHT);

        
// Set auto page breaks
        
$pdf->SetAutoPageBreak(truePDF_MARGIN_BOTTOM);

        
// Set image scale factor
        
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

        
// Set some language-dependent strings
        
$pdf->setLanguageArray($l);

        
// Initialize document and add a page
        
$pdf->AddPage();

        
// Set font
        
$pdf->SetFont(PDF_FONT_NAME_MAIN''PDF_FONT_SIZE_MAIN);

        
// Write the HTML content
        
$pdf->writeHTML($strArticletrue0true0);

        
// Close and output PDF document
        
$pdf->lastPage();
        
$pdf->Output(standardize(ampersand($this->titlefalse)) . '.pdf''D');

        
// Stop script execution
        
exit;
    }
}
Онлайн: 0
Реклама