316 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * @author          Tassos Marinos <info@tassos.gr>
 | |
|  * @link            https://www.tassos.gr
 | |
|  * @copyright       Copyright © 2024 Tassos All Rights Reserved
 | |
|  * @license         GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
 | |
|  */
 | |
| 
 | |
| namespace NRFramework;
 | |
| 
 | |
| use NRFramework\Factory;
 | |
| use NRFramework\Conditions\ConditionsHelper;
 | |
| 
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| // @deprecated  - Use \NRFramework\Condnitions\ConditionsHelper;
 | |
| class Assignments
 | |
| {
 | |
|     /**
 | |
| 	 *  Assignment Type Aliases
 | |
| 	 *
 | |
| 	 *  @var  array
 | |
|      * 
 | |
|      *  @deprecated To be removed on Jan 1st 2023.
 | |
| 	 */
 | |
| 	public $typeAliases = array(
 | |
| 		'device|devices'                     => 'Device',
 | |
| 		'urls|url'                           => 'URL',
 | |
| 		'os'			                     => 'OS',
 | |
| 		'browsers|browser'		             => 'Browser',
 | |
| 		'referrer'                           => 'Referrer',
 | |
| 		'php'                                => 'PHP',
 | |
| 		'timeonsite'                         => 'TimeOnSite',
 | |
| 		'pageviews|user_pageviews'           => 'Pageviews',
 | |
| 		'lang|language|languages'            => 'Joomla\Language',
 | |
| 		'usergroups|usergroup|user_groups'   => 'Joomla\UserGroup',
 | |
| 		'user_id|userid'		             => 'Joomla\UserID',
 | |
| 		'menu'                               => 'Joomla\Menu',
 | |
|         'components|component'	             => 'Joomla\Component',
 | |
|         'datetime|daterange|date'            => 'Date\Date',
 | |
|         'weekday|days|day'                   => 'Date\Day',
 | |
|         'months|month'                       => 'Date\Month',
 | |
| 		'timerange|time'                     => 'Date\Time',
 | |
|         'acymailing'                         => 'AcyMailing',
 | |
|         'akeebasubs'                         => 'AkeebaSubs',
 | |
|         'engagebox|onotherbox'               => 'EngageBox',
 | |
|         'convertforms'	                     => 'ConvertForms',
 | |
|         'geo_country|country|countries'	     => 'Geo\Country',
 | |
|         'geo_continent|continent|continents' => 'Geo\Continent',
 | |
|         'geo_city|city|cities'               => 'Geo\City',
 | |
|         'geo_region|region|regions'          => 'Geo\Region',
 | |
|         'cookiename|cookie'                  => 'Cookie',
 | |
|         'ip_addresses|iprange|ip'            => 'IP',
 | |
|         'k2_items|k2item'                    => 'Component\K2Item',
 | |
|         'k2_cats|k2category'                 => 'Component\K2Category',
 | |
|         'k2_tags|k2tag'                      => 'Component\K2Tag',
 | |
|         'k2_pagetypes|k2pagetype'            => 'Component\K2Pagetype',
 | |
|         'contentcats|category'               => 'Component\ContentCategory',
 | |
|         'contentarticles|article'            => 'Component\ContentArticle',
 | |
|         'contentview'                        => 'Component\ContentView',
 | |
|         'eventbookingsingle'                 => 'Component\EventBookingSingle',
 | |
|         'eventbookingcategory'               => 'Component\EventBookingCategory',
 | |
|         'j2storesingle'                      => 'Component\J2StoreSingle',
 | |
|         'j2storecategory'                    => 'Component\J2StoreCategory',
 | |
|         'hikashopsingle'                     => 'Component\HikashopSingle',
 | |
|         'hikashopcategory'                   => 'Component\HikashopCategory',
 | |
|         'sppagebuildersingle'                => 'Component\SPPageBuilderSingle',
 | |
|         'sppagebuildercategory'              => 'Component\SPPageBuilderCategory',
 | |
|         'virtuemartcategory'                 => 'Component\VirtueMartCategory',
 | |
|         'virtuemartsingle'                   => 'Component\VirtueMartSingle',
 | |
|         'jshoppingsingle'                    => 'Component\JShoppingSingle',
 | |
|         'jshoppingcategory'                  => 'Component\JShoppingCategory',
 | |
|         'rsblogsingle'                       => 'Component\RSBlogSingle',
 | |
|         'rsblogcategory'                     => 'Component\RSBlogCategory',
 | |
|         'rseventsprosingle'                  => 'Component\RSEventsProSingle',
 | |
|         'rseventsprocategory'                => 'Component\RSEventsProCategory',
 | |
|         'easyblogcategory'                   => 'Component\EasyBlogCategory',
 | |
|         'easyblogsingle'                     => 'Component\EasyBlogSingle',
 | |
|         'zoosingle'                          => 'Component\ZooSingle',
 | |
|         'zoocategory'                        => 'Component\ZooCategory',
 | |
|         'eshopcategory'                      => 'Component\EshopCategory',
 | |
|         'eshopsingle'                        => 'Component\EshopSingle',
 | |
|         'jeventssingle'                      => 'Component\JEventsSingle',
 | |
|         'jeventscategory'                    => 'Component\JEventsCategory',
 | |
|         'djcatalog2category'                 => 'Component\DJCatalog2Category',
 | |
|         'djcatalog2single'                   => 'Component\DJCatalog2Single',
 | |
|         'quixsingle'                         => 'Component\QuixSingle',
 | |
|         'djclassifiedssingle'                => 'Component\DJClassifiedsSingle',
 | |
|         'djclassifiedscategory'              => 'Component\DJClassifiedsCategory',
 | |
|         'sobiprocategory'                    => 'Component\SobiProCategory',
 | |
|         'sobiprosingle'                      => 'Component\SobiProSingle',
 | |
|         'gridboxcategory'                    => 'Component\GridboxCategory',
 | |
|         'gridboxsingle'                      => 'Component\GridboxSingle',
 | |
|         'djeventscategory'                   => 'Component\DJEventsCategory',
 | |
|         'djeventssingle'                     => 'Component\DJEventsSingle',
 | |
|         'jcalprocategory'                    => 'Component\JCalProCategory',
 | |
|         'jcalprosingle'                      => 'Component\JCalProSingle',
 | |
|         'dpcalendarcategory'                 => 'Component\DPCalendarCategory',
 | |
|         'dpcalendarsingle'                   => 'Component\DPCalendarSingle',
 | |
|         'icagendacategory'                   => 'Component\ICagendaCategory',
 | |
|         'icagendasingle'                     => 'Component\ICagendaSingle',
 | |
|         'jbusinessdirectorybusinesscategory' => 'Component\JBusinessDirectoryBusinessCategory',
 | |
|         'jbusinessdirectorybusinesssingle'   => 'Component\JBusinessDirectoryBusinessSingle',
 | |
|         'jbusinessdirectoryeventcategory'    => 'Component\JBusinessDirectoryEventCategory',
 | |
|         'jbusinessdirectoryeventsingle'      => 'Component\JBusinessDirectoryEventSingle',
 | |
|         'jbusinessdirectoryoffercategory'    => 'Component\JBusinessDirectoryOfferCategory',
 | |
|         'jbusinessdirectoryoffersingle'      => 'Component\JBusinessDirectoryOfferSingle',
 | |
|         'jreviewscategory'                   => 'Component\JReviewsCategory',
 | |
|         'jreviewssingle'                     => 'Component\JReviewsSingle'
 | |
|     );
 | |
| 
 | |
|     /**
 | |
|      *  Factory object 
 | |
|      * 
 | |
|      *  @var \NRFramework\Factory
 | |
|      */
 | |
|     protected $factory;
 | |
| 
 | |
|     /**
 | |
|      *  Class constructor
 | |
|      */
 | |
|     public function __construct($factory = null)
 | |
|     {
 | |
|         $this->factory = is_null($factory) ? new Factory() : $factory;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
| 	 *  Legacy method to check a set of rules. 
 | |
|      * 
 | |
|      *  At the moment of writing this and the moment we're going to release a new version for EngageBox 
 | |
|      *  which is going to introduce the new ConditionBuilder field, ACF and GSD will still be using the passAll() method. 
 | |
|      * 
 | |
|      *  This forces us to keep this method for backwards compatibiliy reasons.
 | |
|      *  Additionally, it helps us to catch a special case where both ACF and GSD expect to pass all rules even if the array passed is null.
 | |
| 	 *
 | |
| 	 *  @param   array|object   $assignments_info   Array/Object containing assignment info
 | |
| 	 *  @param   string         $match_method       The matching method (and|or) - Deprecated
 | |
| 	 *  @param   bool           $debug              Set to true to request additional debug information about assignments
 | |
|      *
 | |
|      *  @deprecated Use passSets() instead. To be removed on Jan 1st 2023
 | |
| 	 */
 | |
| 	public function passAll($assignments_info, $match_method = 'and')
 | |
| 	{
 | |
|         $assignments = $this->prepareAssignments($assignments_info, $match_method);
 | |
| 
 | |
|         $ch = new ConditionsHelper($this->factory);
 | |
|         $pass = $ch->passSets($assignments);
 | |
| 
 | |
|         // If the checks return null, consider this as Success. This is required for both ACF and GSD.
 | |
|         return is_null($pass) ? true : $pass;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *  Returns the classname for a given assignment alias
 | |
|      *
 | |
|      *  @param  string       $alias
 | |
|      *  @return string|void
 | |
|      * 
 | |
|      *  @deprecated To be removed on Jan 1st 2023
 | |
|      */
 | |
|     public function aliasToClassname($alias)
 | |
|     {
 | |
|         $alias = strtolower($alias);
 | |
|         foreach ($this->typeAliases as $aliases => $type)
 | |
|         {
 | |
|             if (strtolower($type) == $alias)
 | |
|             {
 | |
|                 return $type;
 | |
|             }
 | |
| 
 | |
|             $aliases = explode('|', strtolower($aliases));
 | |
|             if (in_array($alias, $aliases))
 | |
|             {
 | |
|                 return $type;                
 | |
|             }   
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *  Checks and prepares the given array of assignment information
 | |
|      * 
 | |
|      *  @param   array $assignments_info
 | |
|      *  @return  array
 | |
|      * 
 | |
|      *  @deprecated To be removed on Jan 1st 2023
 | |
|      */
 | |
|     protected function prepareAssignments($data, $matching_method = 'all')
 | |
|     {
 | |
|         if (is_object($data))
 | |
|         {
 | |
|             return $this->prepareAssignmentsFromObject($data, $matching_method);
 | |
|         }
 | |
| 
 | |
|         if (!is_array($data) OR empty($data)) 
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $rules = array_pop($data);
 | |
| 
 | |
|         if (!is_array($rules) OR empty($rules)) 
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         foreach ($rules as &$rule)
 | |
|         {
 | |
|             if (is_array($rule))
 | |
|             {
 | |
|                 foreach ($rule as &$_rule)
 | |
|                 {
 | |
|                     $_rule = $this->prepareAssignmentRule($_rule);
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 $rule = $this->prepareAssignmentRule($rule);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $data = [
 | |
|             [
 | |
|                 'matching_method' => $matching_method == 'and' ? 'all' : 'any',
 | |
|                 'rules' => $rules
 | |
|             ]
 | |
|         ];
 | |
| 
 | |
|         return $data;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Prepares the assignment rule.
 | |
|      * 
 | |
|      * @param   object  $rule
 | |
|      * 
 | |
|      * @return  object
 | |
|      */
 | |
|     private function prepareAssignmentRule($rule)
 | |
|     {
 | |
|         return [
 | |
|             'name'     => $this->aliasToClassname($rule->alias),
 | |
|             'operator' => (int) $rule->assignment_state == 1 ? 'includes' : 'not_includes',
 | |
|             'value'    => isset($rule->value) ? $rule->value : null,
 | |
|             'params'   => isset($rule->params) ? $rule->params : null,
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *  Converts an object of assignment information to an array of groups
 | |
|      *  Used by existing extensions
 | |
|      * 
 | |
|      *  @param  object $assignments_info
 | |
|      *  @param  string $matching_method
 | |
|      * 
 | |
|      *  @deprecated To be removed on Jan 1st 2023
 | |
|      */
 | |
|     public function prepareAssignmentsFromObject($assignments_info, $matching_method)
 | |
|     {
 | |
|         if (!isset($assignments_info->params))
 | |
|         {
 | |
|             return [];
 | |
|         }
 | |
| 
 | |
|         $params = json_decode($assignments_info->params);
 | |
| 
 | |
|         if (!is_object($params))
 | |
|         {
 | |
|             return [];
 | |
|         }
 | |
| 
 | |
|         $assignments_info = [];
 | |
|         
 | |
|         foreach ($this->typeAliases as $aliases => $type)
 | |
|         {
 | |
|             $aliases = explode('|', $aliases);
 | |
| 
 | |
|             foreach ($aliases as $alias)
 | |
|             {
 | |
|                 if (!isset($params->{'assign_' . $alias}) || !$params->{'assign_' . $alias})
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 // Discover assignment params
 | |
|                 $assignment_params = new \stdClass();
 | |
|                 foreach ($params as $key => $value)
 | |
|                 {
 | |
|                     if (strpos($key, "assign_" . $alias . "_param") !== false)
 | |
|                     {
 | |
|                         $key = str_replace("assign_" . $alias . "_param_", "", $key);
 | |
|                         $assignment_params->$key = $value;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 $assignments_info[] = [
 | |
|                     'name'      => $this->aliasToClassname($alias),
 | |
|                     'operator'  => (int) $params->{'assign_' . $alias} == 1 ? 'includes' : 'not_includes',
 | |
|                     'value'     => isset($params->{'assign_' . $alias . '_list'}) ? $params->{'assign_' . $alias . '_list'} : [],
 | |
|                     'params'    => $assignment_params
 | |
|                 ];
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $data = [
 | |
|             [
 | |
|                 'matching_method' => $matching_method == 'and' ? 'all' : 'any',
 | |
|                 'rules' => $assignments_info
 | |
|             ]
 | |
|         ];
 | |
| 
 | |
|         return $data;
 | |
|     }
 | |
| } |