system/modules/pct_autogrid/PCT/AutoGrid/Core.php line 210

Open in your IDE?
  1. <?php
  2. /**
  3.  * Contao Open Source CMS
  4.  * 
  5.  * Copyright (C) 2005-2013 Leo Feyer
  6.  * 
  7.  * @copyright    Tim Gatzky 2019
  8.  * @author        Tim Gatzky <info@tim-gatzky.de>
  9.  * @package        pct_autogrid
  10.  * @link        http://contao.org
  11.  */
  12. /**
  13.  * Namespace
  14.  */
  15. namespace PCT\AutoGrid;
  16. /**
  17.  * Imports
  18.  */
  19. use Contao\FilesModel;
  20. use Contao\StringUtil;
  21. use Contao\Validator;
  22. use PCT\AutoGrid\Models\ContentModel;
  23. /**
  24.  * Class file
  25.  * Core
  26.  */
  27. class Core
  28. {
  29.     /**
  30.      * Include grid css on page generation
  31.      */
  32.     public function loadAssets()
  33.     {
  34.         $GLOBALS['TL_CSS'][] = $GLOBALS['PCT_AUTOGRID']['css'];
  35.     }
  36.     
  37.         
  38.     /**
  39.      * Add AG related template variables to a template object
  40.      * @param object    FrontendTemplate
  41.      * @param object    Database Result or Model
  42.      * @return object    FrontendTemplate
  43.      */
  44.     // !addToTemplate
  45.     public static function addToTemplate($objTemplate,$objRow=null)
  46.     {
  47.         if( $objRow === null )
  48.         {
  49.             $objRow $objTemplate;
  50.         }
  51.         if( in_array($objRow->type$GLOBALS['PCT_AUTOGRID']['wrapperElements']) )
  52.         {
  53.             $objRow->autogrid true;
  54.         }
  55.         $arrClasses = array();
  56.         
  57.         // @var object
  58.         $objAutoGrid = new \StdClass;
  59.         $objAutoGrid->hasContent false;
  60.         $objAutoGrid->Image null;
  61.         $objAutoGrid->shstart false;
  62.         $objAutoGrid->shstop false;
  63.         $objAutoGrid->hasStyles false;
  64.         $objAutoGrid->hasAttributes false;
  65.         $objAutoGrid->hasCustomGrid false;
  66.         $objAutoGrid->start null;
  67.         $objAutoGrid->stop null;
  68.         $objAutoGrid->isActive = (boolean)$objRow->autogrid;
  69.         $objAutoGrid->desktop $objRow->autogrid_css;
  70.         $objAutoGrid->align $objRow->autogrid_align;
  71.         if( $objRow->autogrid_align_mobile )
  72.         {
  73.             $objAutoGrid->align_mobile 'm_'.$objRow->autogrid_align_mobile;
  74.         }
  75.         $objAutoGrid->tablet $objRow->autogrid_tablet;
  76.         $objAutoGrid->mobile $objRow->autogrid_mobile;
  77.         $objAutoGrid->offset $objRow->autogrid_offset;
  78.         $objAutoGrid->gutter $objRow->autogrid_gutter;
  79.         $objAutoGrid->same_height $objRow->autogrid_sameheight;
  80.         $objAutoGrid->class $objRow->autogrid_class;
  81.         $objAutoGrid->preset $objRow->autogrid_grid;
  82.         $objAutoGrid->no_gutter false// deprecated
  83.         $objAutoGrid->styles = array();
  84.         
  85.         if( in_array($objRow->type$GLOBALS['PCT_AUTOGRID']['startElements']) )
  86.         {
  87.             $objAutoGrid->start true;
  88.         }
  89.         if( in_array($objRow->type$GLOBALS['PCT_AUTOGRID']['stopElements']) )
  90.         {
  91.             $objAutoGrid->stop true;
  92.         }
  93.         // margins
  94.         $objMargins = new \StdClass;
  95.         $objMargins->top $objRow->margin_t;
  96.         $objMargins->top_mobile $objRow->margin_t_m;
  97.         $objMargins->bottom $objRow->margin_b;
  98.         $objMargins->bottom_mobile $objRow->margin_b_m;
  99.         $objMargins->classes implode(' 'array_filter(array($objRow->margin_t,$objRow->margin_t_m,$objRow->margin_b,$objRow->margin_b_m)) ); 
  100.         $objAutoGrid->Margins $objMargins;
  101.         // data collection
  102.         $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR'][$objRow->type] = $objRow;
  103.         if( in_array($objRow->type$GLOBALS['PCT_AUTOGRID']['startElements']) )
  104.         {
  105.             $k $objRow->type;
  106.             $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR'][$k] = $objRow;
  107.             
  108.             $objAutoGrid->GridStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridGridStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridGridStart'] : null);
  109.             $objAutoGrid->ColStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridColStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridColStart'] : null);
  110.             $objAutoGrid->RowStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridRowStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridRowStart'] : null);
  111.         }
  112.         else if( in_array($objRow->type$GLOBALS['PCT_AUTOGRID']['stopElements']) )
  113.         {
  114.             $k str_replace('Stop','Start',$objRow->type);
  115.             
  116.             $objAutoGrid->GridStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridGridStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridGridStart'] : null);
  117.             $objAutoGrid->ColStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridColStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridColStart'] : null);
  118.             $objAutoGrid->RowStart = (isset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridRowStart']) ? $GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR']['autogridRowStart'] : null);
  119.             unset($GLOBALS['PCT_AUTOGRID_DATA_COLLECTOR'][$k]);
  120.             $objAutoGrid->stop true;
  121.         }
  122.         
  123.         // Grid presets
  124.         if($objRow->type == 'autogridGridStart')
  125.         {
  126.             $arrGridPreset $GLOBALS['PCT_AUTOGRID']['GRID_PRESETS'][$objRow->autogrid_grid] ?: array();
  127.             
  128.             // grid preset default values
  129.             if( empty($objRow->autogrid_tablet) && empty($arrGridPreset) === false 
  130.             { 
  131.                 $objRow->autogrid_tablet $GLOBALS['PCT_AUTOGRID']['GRID_PRESETS'][$objRow->autogrid_grid]['grid']['tablet'];
  132.             }
  133.             if( empty($objRow->autogrid_mobile) && empty($arrGridPreset) === false 
  134.             { 
  135.                 $objRow->autogrid_mobile $GLOBALS['PCT_AUTOGRID']['GRID_PRESETS'][$objRow->autogrid_grid]['grid']['mobile'];
  136.             }
  137.             
  138.             // @var object
  139.             $objGrid = new \StdClass;
  140.             $objGrid->config $arrGridPreset;
  141.             $objGrid->name $objRow->autogrid_grid;
  142.             $objGrid->desktop $objRow->autogrid_css;
  143.             $objGrid->tablet $objRow->autogrid_tablet;
  144.             $objGrid->mobile $objRow->autogrid_mobile;
  145.             
  146.             if( !empty($arrGridPreset) )
  147.             {
  148.                 // compile grid classes
  149.                 if( $objRow->autogrid_css )
  150.                 {
  151.                     $objGrid->desktop 'd_'.rtrim(str_replace(array('%',' '), array('_'), $objRow->autogrid_css),'_');
  152.                 }
  153.                 if( $objGrid->tablet )
  154.                 {
  155.                     $objGrid->tablet 't_'.rtrim(str_replace(array('%',' '), array('_'), $objRow->autogrid_tablet),'_');
  156.                 }
  157.                 if( $objGrid->mobile )
  158.                 {
  159.                     $objGrid->mobile 'm_'.rtrim(str_replace(array('%',' '), array('_'), $objRow->autogrid_mobile),'_');
  160.                 }
  161.                 // add to classes
  162.                 $arrClasses array_merge($arrClasses, array($objGrid->desktop,$objGrid->tablet,$objGrid->mobile) );
  163.                 
  164.                 // override AutoGrid vars
  165.                 $objAutoGrid->desktop $objGrid->desktop;
  166.                 $objAutoGrid->tablet $objGrid->tablet;
  167.                 $objAutoGrid->mobile $objGrid->mobile;
  168.             }
  169.             // flag as custom grid definition
  170.             else
  171.             {
  172.                 $objGrid->isCustomGrid true;
  173.             }
  174.             
  175.             if( trim($objRow->autogrid_css) != trim($arrGridPreset['grid']['desktop']) )
  176.             {
  177.                 $objAutoGrid->hasCustomGrid true;
  178.             }
  179.             if( trim($objRow->autogrid_tablet) != trim($arrGridPreset['grid']['tablet']) )
  180.             {
  181.                 $objAutoGrid->hasCustomGrid true;
  182.             }
  183.             if( trim($objRow->autogrid_mobile) != trim($arrGridPreset['grid']['mobile']) )
  184.             {
  185.                 $objAutoGrid->hasCustomGrid true;
  186.             }
  187.             // add to AutoGrid object
  188.             $objAutoGrid->Grid $objGrid;
  189.         }
  190.         else
  191.         {
  192.             $arrClasses[] = $objRow->autogrid_css;
  193.             $arrClasses[] = $objRow->autogrid_tablet;
  194.             $arrClasses[] = $objRow->autogrid_mobile;
  195.         }
  196.         
  197.         // append more classes
  198.         $arrClasses array_merge($arrClasses, array($objRow->autogrid_offset,$objRow->autogrid_align,@$objAutoGrid->align_mobile,$objRow->autogrid_gutter,$objRow->autogrid_class));
  199.         // collect styles
  200.         $arrStyles = array();
  201.         
  202.         // color
  203.         $arrColor StringUtil::deserialize($objRow->autogrid_bgcolor) ?: array();
  204.         if( empty(array_filter($arrColor)) === false )
  205.         {
  206.             $color $arrColor[0];
  207.             $rgb = array();
  208.             //-- @see Contao\StyleSheets::convertHexColor
  209.             
  210.             // Try to convert using bitwise operation
  211.             if (strlen($color) == 6)
  212.             {
  213.                 $dec hexdec($color);
  214.                 $rgb['red'] = 0xFF & ($dec >> 0x10);
  215.                 $rgb['green'] = 0xFF & ($dec >> 0x8);
  216.                 $rgb['blue'] = 0xFF $dec;
  217.             }
  218.             // Shorthand notation
  219.             elseif (strlen($color) == 3)
  220.             {
  221.                 $rgb['red'] = hexdec(str_repeat(substr($color01), 2));
  222.                 $rgb['green'] = hexdec(str_repeat(substr($color11), 2));
  223.                 $rgb['blue'] = hexdec(str_repeat(substr($color21), 2));
  224.             }
  225.             //--
  226.             
  227.             $alpha '1';
  228.             if($arrColor[1])
  229.             {
  230.                 $alpha = (int)$arrColor[1] / 100;
  231.             }
  232.             $style 'background-color:rgba('.implode(','$rgb).','.$alpha.');';
  233.             $arrStyles['background-color'] = $style;
  234.         }
  235.         
  236.         // background image
  237.         if( empty($objRow->autogrid_bgimage) === false )
  238.         {
  239.             $objFile FilesModel::findByPath($objRow->autogrid_bgimage);
  240.             if ( (boolean)Validator::isStringUuid($objRow->autogrid_bgimage) === true )
  241.             {
  242.                 $objFile FilesModel::findByUuid($objRow->autogrid_bgimage);
  243.             }
  244.             if( $objFile === null && \file_exists(TL_ROOT.'/'.$objRow->autogrid_bgimage) === true )
  245.             {
  246.                 $objFile \Contao\Dbafs::addResource($objRow->autogrid_bgimage);
  247.             }
  248.             if( $objFile !== null )
  249.             {
  250.                 $style "background-image:url('".$objFile->path."');";
  251.                 $arrStyles['background-image'] = $style;
  252.                 // generate an image object
  253.                 $tmp = new \StdClass;
  254.                 // add image to temp object
  255.                 \Contao\Controller::addImageToTemplate$tmp, array('singleSRC' => $objFile->path) );
  256.                 $objAutoGrid->Image $tmp;
  257.                 unset($tmp);
  258.             }
  259.             
  260.             // check if column is empty or not
  261.             $objNext null;
  262.             if( in_array($objRow->ptable, array('tl_article','tl_news','tl_calender_events')) === true || empty($objRow->ptable) === true )
  263.             {
  264.                 $objNext ContentModel::findNextPublished($objRow);
  265.             }
  266.             
  267.             if( in_array($objNext->type$GLOBALS['PCT_AUTOGRID']['wrapperElements']) === false || $objNext->type == 'autogridRowStart' )
  268.             {
  269.                 $objAutoGrid->hasContent true;
  270.             }
  271.         }
  272.         // background position
  273.         if($objRow->autogrid_bgposition)
  274.         {
  275.             $style 'background-position:'.$objRow->autogrid_bgposition.';';
  276.             $arrStyles['background-position'] = $style;        
  277.         }
  278.         // background repeat
  279.         if($objRow->autogrid_bgrepeat)
  280.         {
  281.             $style 'background-repeat:'.$objRow->autogrid_bgrepeat.';';
  282.             $arrStyles['background-repeat'] = $style;
  283.         }
  284.         // background size
  285.         if($objRow->autogrid_bgsize)
  286.         {
  287.             $style 'background-size:'.$objRow->autogrid_bgsize.';';
  288.             $arrStyles['background-size'] = $style;
  289.         }
  290.         
  291.         // padding
  292.         if($objRow->autogrid_padding)
  293.         {
  294.             $tmp array_filterStringUtil::deserialize($objRow->autogrid_padding) ?: array() );
  295.             $unit $tmp['unit'] ?? '';
  296.             unset($tmp['unit']);
  297.             foreach($tmp as $k => $v)
  298.             {
  299.                 $arrStyles['padding-'.$k] = 'padding-'.$k.':'.$v.$unit.';';
  300.             }
  301.         }
  302.         
  303.         // custom styles
  304.         if($objRow->autogrid_styles)
  305.         {
  306.             $arrStyles['custom'] = $objRow->autogrid_styles;
  307.         }
  308.         
  309.         // clean up
  310.         $arrStyles array_filter(array_map('trim',$arrStyles));
  311.         
  312.         if(!empty($arrStyles))
  313.         {
  314.             $objAutoGrid->hasStyles true;
  315.             $objAutoGrid->styles $arrStyles;
  316.         }
  317.         
  318.         // compile css classes
  319.         $objAutoGrid->classes implode(' 'array_uniquearray_filter($arrClasses) ) );
  320.         
  321.         $objTemplate->AutoGrid $objAutoGrid;
  322.         return $objTemplate;
  323.     }
  324. }