<?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\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;
class RsformModelFormajax extends BaseDatabaseModel
{
public static function sortFields($a,$b)
{
if ($a->Ordering == $b->Ordering) return 0;
return ($a->Ordering < $b->Ordering) ? -1 : 1;
}
protected function getTooltip($name)
{
$tooltip = '';
if (Factory::getLanguage()->hasKey('RSFP_COMP_FIELD_'.$name.'_DESC')) {
$title = Text::_('RSFP_COMP_FIELD_'.$name);
$content = Text::_('RSFP_COMP_FIELD_'.$name.'_DESC');
$tooltip .= ' class="fieldHasTooltip" data-content="'. $content .'" data-title="' . $title . '"';
}
return $tooltip;
}
public function getComponentFields()
{
$db = Factory::getDbo();
$lang = Factory::getLanguage();
$return = array(
'general' => array(),
'validations' => array(),
'attributes' => array(),
'editor' => array()
);
$data = $this->getComponentData();
$general = array('NAME','CAPTION','LABEL','DEFAULTVALUE','ITEMS','DESCRIPTION','COMPONENTTYPE');
$validations = array('REQUIRED','VALIDATIONRULE','VALIDATIONMESSAGE','VALIDATIONEXTRA', 'VALIDATIONDATE');
$editor = array('TEXT');
$componentId = $this->getComponentId();
$componentType = $this->getComponentType();
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__rsform_component_type_fields'))
->where($db->qn('ComponentTypeId') . ' = ' . $db->q($componentType))
->order($db->qn('Ordering') . ' ' . $db->escape('asc'));
$results = $db->setQuery($query)->loadObjectList();
$translatable = RSFormProHelper::getTranslatableProperties();
foreach ($results as $i => $result)
{
if ($result->FieldName == 'ADDITIONALATTRIBUTES')
{
$results[$i]->Ordering = 1001;
}
}
usort($results, array($this, 'sortFields'));
$multilanguageDisabled = RSFormProHelper::getConfig('global.disable_multilanguage');
$translateIcon = RSFormProHelper::translateIcon();
foreach ($results as $result)
{
$field = new stdClass();
$field->name = $result->FieldName;
$field->caption = $lang->hasKey('RSFP_COMP_FIELD_'.$field->name) ? Text::_('RSFP_COMP_FIELD_'.$field->name) : $field->name;
$field->label = '<label for="'.$field->name.'" id="caption' . $field->name.'" '.$this->getTooltip($field->name).'>'.$field->caption.'</label>';
$field->body = '';
$field->type = $result->FieldType;
$field->translatable = !$multilanguageDisabled && in_array($result->FieldName, $translatable) && $result->FieldType != 'hiddenparam' && $result->FieldType != 'hidden';
$additional = 'class="form-control"';
switch ($result->FieldType)
{
case 'color':
case 'textbox':
{
if ($componentId > 0)
$value = isset($data[$field->name]) ? $data[$field->name] : '';
else
{
$values = RSFormProHelper::isCode($result->FieldValues);
if ($lang->hasKey('RSFP_COMP_FVALUE_'.$values))
$value = Text::_('RSFP_COMP_FVALUE_'.$values);
else
$value = $values;
}
if ($result->Properties != ''){
$additional .= ' data-properties="'. $result->Properties .'"';
}
$type = $result->FieldType == 'textbox' ? 'text' : 'color';
$field->body .= '<input type="' . $type . '" id="'.$field->name.'" name="param['.$field->name.']" value="'.RSFormProHelper::htmlEscape($value).'" '.$additional.' />';
if ($field->translatable)
{
$field->body = RSFormProAdapterGrid::inputAppend($field->body, $translateIcon);
}
}
break;
case 'textarea':
{
if ($componentId > 0)
{
if (!isset($data[$field->name]))
{
$data[$field->name] = '';
}
if ($lang->hasKey('RSFP_COMP_FVALUE_'.$data[$field->name]))
{
$value = Text::_('RSFP_COMP_FVALUE_'.$data[$field->name]);
}
else
{
$value = $data[$field->name];
}
}
else
{
$values = RSFormProHelper::isCode($result->FieldValues);
if ($lang->hasKey('RSFP_COMP_FVALUE_'.$values))
{
$value = Text::_('RSFP_COMP_FVALUE_'.$values);
}
else
{
$value = $values;
}
}
if ($result->Properties != '')
{
$additional .= ' data-properties="'. $result->Properties .'"';
$additional .= ' data-tags="' .RSFormProHelper::htmlEscape($value). '" ';
}
$field->body .= '<textarea id="'.$field->name.'" name="param['.$field->name.']" rows="5" cols="20" '. $additional .'>'.RSFormProHelper::htmlEscape($value).'</textarea>';
if ($field->translatable)
{
$field->body = RSFormProAdapterGrid::inputAppend($field->body, $translateIcon);
}
}
break;
case 'select':
case 'selectmultiple':
{
$additional = 'class="form-select"';
/**
* determine if we have a json in the properties.
* used to create the conditional fields
* the JSON should have the following structure
* case -> value -> array (fields to be toggled)
*/
if (json_decode($result->Properties))
{
$additional .= ' data-toggle="' . RSFormProHelper::htmlEscape($result->Properties) . '" data-properties="toggler"';
}
// set the multiple attribute and select size if needed
if ($result->FieldType == 'selectmultiple') {
$additional .= ' size="5" multiple="multiple"';
}
if (in_array($field->name, array('VALIDATIONRULE', 'VALIDATIONMULTIPLE')))
{
$additional .= 'onchange="changeValidation(this);"';
}
$field->body .= '<select name="param['.$field->name.']'.($result->FieldType == 'selectmultiple' ? '[]' : '').'" '. $additional .' id="'.$field->name.'">';
if (!isset($data[$field->name]))
$data[$field->name] = '';
if ($result->FieldType == 'selectmultiple') {
if(!empty($data[$field->name])) {
$data[$field->name] = explode(',', $data[$field->name]);
}
}
$result->FieldValues = str_replace("\r", '', $result->FieldValues);
$items = RSFormProHelper::isCode($result->FieldValues);
$items = explode("\n",$items);
foreach ($items as $item)
{
$buf = explode('|', $item, 2);
$option_value = $buf[0];
$option_shown = count($buf) == 1 ? $buf[0] : $buf[1];
if ($lang->hasKey('RSFP_COMP_FVALUE_'.$option_shown))
$label = Text::_('RSFP_COMP_FVALUE_'.$option_shown);
else
$label = $option_shown;
$field->body .= '<option '.($componentId > 0 && ((!is_array($data[$field->name]) && $data[$field->name] == $option_value) || (is_array($data[$field->name]) && in_array($option_value, $data[$field->name]))) ? 'selected="selected"' : '').' value="'.$option_value.'">'.RSFormProHelper::htmlEscape($label).'</option>';
}
$field->body .= '</select>';
}
break;
case 'hidden':
{
$values = $result->FieldValues;
if (defined('RSFP_COMP_FVALUE_'.$values))
$value = constant('RSFP_COMP_FVALUE_'.$values);
else
$value = $values;
$field->body = '<input type="hidden" id="'.$field->name.'" name="'.$field->name.'" value="'.RSFormProHelper::htmlEscape($value).'" />';
}
break;
case 'hiddenparam':
$field->body = '<input type="hidden" id="'.$field->name.'" name="param['.$field->name.']" value="'.RSFormProHelper::htmlEscape($result->FieldValues).'" />';
break;
}
if (in_array($field->name, $general) || $result->FieldType == 'hidden' || $result->FieldType == 'hiddenparam')
$return['general'][] = $field;
elseif (in_array($field->name, $validations) || strpos($field->name, 'VALIDATION') !== false)
$return['validations'][] = $field;
elseif (in_array($field->name, $editor))
$return['editor'][] = $field;
else
$return['attributes'][] = $field;
}
return $return;
}
public function getComponentData()
{
$componentId = $this->getComponentId();
$data = array();
if ($componentId > 0)
{
$data = RSFormProHelper::getComponentProperties($componentId);
}
return $data;
}
public function getComponentType()
{
return Factory::getApplication()->input->get->getInt('componentType');
}
public function getComponentId()
{
$cid = Factory::getApplication()->input->getInt('componentId');
$cids = Factory::getApplication()->input->get('cid', array(), 'array');
if (is_array($cids) && count($cids)) {
$cids = array_map('intval', $cids);
$cid = $cids;
}
return $cid;
}
public function getComponent()
{
$componentId = $this->getComponentId();
$return = new stdClass();
$return->published = 1;
if ($componentId)
{
$db = $this->getDbo();
$query = $db->getQuery(true)
->select($db->qn('Published'))
->from($db->qn('#__rsform_components'))
->where($db->qn('ComponentId') . ' = ' . $db->q($componentId));
$return->published = $db->setQuery($query)->loadResult();
}
// required?
$data = $this->getComponentData();
if (isset($data['REQUIRED']))
{
$return->required = $data['REQUIRED'] == 'YES';
}
return $return;
}
public function componentsChangeStatus()
{
$componentId = $this->getComponentId();
$task = strtolower(Factory::getApplication()->input->getWord('task'));
$published = $task == 'componentspublish' ? 1 : 0;
$db = $this->getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__rsform_components'))
->set($db->qn('Published') . ' = ' . $db->q($published));
if (is_array($componentId))
{
$query->where($db->qn('ComponentId') . ' IN (' . implode(',', $componentId) . ')');
}
else
{
$query->where($db->qn('ComponentId') . ' = ' . $db->q($componentId));
}
$db->setQuery($query)->execute();
}
public function componentsChangeRequired()
{
$componentId = $this->getComponentId();
$task = strtolower(Factory::getApplication()->input->getWord('task'));
$required = $task == 'componentssetrequired' ? 'YES' : 'NO';
$db = $this->getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__rsform_properties'))
->set($db->qn('PropertyValue') . ' = ' . $db->q($required))
->where($db->qn('PropertyName') . ' = ' . $db->q('REQUIRED'));
if (is_array($componentId))
{
$query->where($db->qn('ComponentId') . ' IN (' . implode(',', $componentId) . ')');
}
else
{
$query->where($db->qn('ComponentId') . ' = ' . $db->q($componentId));
}
$db->setQuery($query)->execute();
}
public function getPublished()
{
$component = $this->getComponent();
return HTMLHelper::_('select.booleanlist', 'Published', '', $component->published);
}
}