<?php /** * @package RSForm! Pro * @copyright (C) 2007-2019 www.rsjoomla.com * @license GPL, http://www.gnu.org/copyleft/gpl.html */ defined('_JEXEC') or die; use Joomla\CMS\Factory; class RSFormProConditions { protected static function getFields($formId, $published = 1) { static $cache = array(); if (!isset($cache[$formId])) { $cache[$formId] = array(); $db = Factory::getDbo(); $query = $db->getQuery(true); $query->select($db->qn('p.PropertyValue', 'ComponentName')) ->select($db->qn('p.ComponentId')) ->from($db->qn('#__rsform_components', 'c')) ->join('LEFT', $db->qn('#__rsform_properties', 'p') . ' ON (' . $db->qn('c.ComponentId') . '=' . $db->qn('p.ComponentId') . ')') ->where($db->qn('c.FormId') . '=' . $db->q($formId)) ->where($db->qn('p.PropertyName') . '=' . $db->q('NAME')) ->order($db->qn('c.Order') . ' ' . $db->escape('ASC')); if ($published !== null) { $query->where($db->qn('c.Published') . ' = ' . $db->q($published)); } $cache[$formId] = $db->setQuery($query)->loadObjectList('ComponentId'); } return $cache[$formId]; } public static function parseComponentIds($value) { if ((int) $value) { return array((int) $value); } elseif (is_string($value)) { $tmp_ids = json_decode($value); if (is_array($tmp_ids)) { return $tmp_ids; } } return array(); } public static function getConditions($formId, $lang = null, $published = 1) { if ($lang === null) { $lang = RSFormProHelper::getCurrentLanguage(); } if (RSFormProHelper::getConfig('global.disable_multilanguage')) { $lang = RSFormProHelper::getConfig('global.default_language'); } $fields = self::getFields($formId, $published); $db = Factory::getDbo(); $query = $db->getQuery(true) ->select('*') ->from($db->qn('#__rsform_conditions')) ->where($db->qn('form_id') . ' = ' . $db->q($formId)) ->where($db->qn('lang_code') . ' = ' . $db->q($lang)) ->order($db->qn('id') . ' ' . $db->escape('ASC')); if ($conditions = $db->setQuery($query)->loadObjectList()) { // put them all in an array so we can use only one query $cids = array(); foreach ($conditions as $condition) { $condition->component_id = self::parseComponentIds($condition->component_id); $condition->ComponentNames = array(); foreach ($condition->component_id as $component_id) { if (!isset($fields[$component_id])) { continue; } $condition->ComponentNames[] = $fields[$component_id]->ComponentName; } $cids[] = $condition->id; } if ($cids) { $query->clear() ->select('*') ->from($db->qn('#__rsform_condition_details')) ->where($db->qn('condition_id') . ' IN (' . implode(',', $db->q($cids)) . ')'); if ($details = $db->setQuery($query)->loadObjectList()) { // arrange details within conditions foreach ($conditions as $condition) { $condition->details = array(); foreach ($details as $detail) { if ($detail->condition_id != $condition->id || !isset($fields[$detail->component_id])) { continue; } $detail->ComponentName = $fields[$detail->component_id]->ComponentName; $condition->details[] = $detail; } } } } // all done return $conditions; } // nothing found return false; } public static function buildJS($formId, $conditions) { $script = ''; if ($conditions) { $functions = array(); foreach ($conditions as $condition) { if (!empty($condition->details)) { // Create an object clone $data = clone $condition; // Remove unneeded data unset($data->lang_code, $data->id, $data->component_id); // This is our function name $functions[] = $function = 'rsfp_runCondition' . $condition->id; // Add condition events $uniques = array(); $scriptConditions = ''; foreach ($data->details as $detail) { // Remove unneeded data unset($detail->id, $detail->condition_id, $detail->component_id); // Run script just once if (!in_array($detail->ComponentName, $uniques)) { $scriptConditions .= sprintf('window.addEventListener(\'DOMContentLoaded\', function() { RSFormPro.Conditions.add(%1$d, %2$s, %3$s); });', $formId, json_encode($detail->ComponentName), $function); $uniques[] = $detail->ComponentName; } } // The script we're outputting $script .= sprintf('function %1$s(){RSFormPro.Conditions.run(%2$s);}', $function, json_encode($data)); $script .= $scriptConditions; } } if ($functions) { $script .= sprintf('function rsfp_runAllConditions%1$d(){%2$s};RSFormPro.Conditions.delayRun(%1$d);', $formId, implode('();', $functions) . '();'); $script .= sprintf('window.addEventListener(\'DOMContentLoaded\', function(){ RSFormPro.Conditions.addReset(%d); });', $formId); } } return $script; } }