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;
|
|
}
|
|
} |