acf
This commit is contained in:
316
plugins/system/nrframework/NRFramework/Assignments.php
Normal file
316
plugins/system/nrframework/NRFramework/Assignments.php
Normal file
@ -0,0 +1,316 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user