public static function getInstance($customfields) { if (!self::$_instance instanceof self) { self::$_instance = new self($customfields); } return self::$_instance; }
/** Создание новых и удаление удаленных полей из таблицы * @param $context * @param $table * @param bool $isNew * @return bool * @throws Exception */ public function onExtensionAfterSave($context, $table, $isNew = false) { if ($context !== 'com_plugins.plugin' || $table->element != 'minicck') { return true; } $params = json_decode($table->params); $customfields = $params->customfields; if (!is_array($customfields) || count($customfields) == 0) { throw new Exception('Custom Fields is Empty'); return false; } $newColumn = $oldColumn = array(); $db = JFactory::getDbo(); $table = $db->replacePrefix('#__minicck'); $query = $db->getQuery(true); $query->select('COLUMN_NAME')->from('INFORMATION_SCHEMA.COLUMNS')->where('TABLE_NAME = ' . $db->quote($table)); $db->setQuery($query); $columns = $db->loadColumn(); if (!is_array($columns) || count($columns) == 0) { throw new Exception('Table Columns is Empty'); return false; } include_once JPATH_ROOT . '/plugins/system/minicck/classes/html.class.php'; $minicck = MiniCCKHTML::getInstance(self::$customfields); $flipColumns = array_flip($columns); //удаляем из массива служебные поля if (isset($flipColumns['id'])) { unset($columns[$flipColumns['id']]); } if (isset($flipColumns['content_id'])) { unset($columns[$flipColumns['content_id']]); } if (isset($flipColumns['field_values'])) { unset($columns[$flipColumns['field_values']]); } if (isset($flipColumns['content_type'])) { unset($columns[$flipColumns['content_type']]); } //формируем новые и удаленные поля foreach ($customfields as $k => $v) { if (!in_array($v->name, $columns)) { $tmp = array('name' => $v->name, 'type' => $v->type); $classname = $minicck->loadElement($tmp); $tmp['columnType'] = !empty($classname::$columnType) ? $classname::$columnType : 'varchar(250)'; $newColumn[] = $tmp; } else { unset($columns[$flipColumns[$v->name]]); } } //если есть новые поля, то создаем if (count($newColumn)) { foreach ($newColumn as $v) { $db->setQuery('ALTER IGNORE TABLE `#__minicck` ADD `' . $v['name'] . '` ' . $v['columnType'] . ' NOT NULL')->execute(); } } //если есть удаленные поля, то удаляем if (count($columns)) { foreach ($columns as $v) { $db->setQuery('ALTER IGNORE TABLE `#__minicck` DROP `' . $v . '`')->execute(); } } return true; }
function getInput() { JHtml::_('behavior.framework'); $doc = JFactory::getDocument(); $doc->addScript(JUri::root() . 'plugins/system/minicck/assets/js/minicck_jq.js'); $htmlClass = new MiniCCKHTML(0, ''); $numFields = 1; $plugin = JPluginHelper::getPlugin('system', 'minicck'); $pluginParams = !empty($plugin->params) ? json_decode($plugin->params) : new stdClass(); $typeOptions = array(JHtml::_('select.option', '', JText::_('JSELECT'))); $fields = JFolder::folders(JPATH_ROOT . '/plugins/system/minicck/fields'); $scriptArr = $extraOptionsSettings = array(); foreach ($fields as $field) { $className = $htmlClass->loadElement(array('type' => $field)); if (!$className) { continue; } $typeOptions[] = JHtml::_('select.option', $field, $className::getTitle()); if (method_exists($className, 'extraOptions')) { $scriptArr[] = "{$field}: [" . $className::extraOptions(true) . "]"; $extraOptionsSettings[$field] = $className::extraOptions(false); } } $script = "\nvar fieldsExtraOptions = {\n"; $script .= implode(', ', $scriptArr) . "\n"; $script .= "};\n"; $doc->addScriptDeclaration($script); $fadd = JText::_('PLG_MINICCK_ADD_FIELD'); $fname = JText::_("PLG_MINICCK_FIELD_NAME"); $ftitle = JText::_("PLG_MINICCK_FIELD_TITLE"); $ftype = JText::_("PLG_MINICCK_FIELD_TYPE"); $fparams = JText::_("PLG_MINICCK_FIELD_PARAMS"); $fdel = JText::_('PLG_MINICCK_DEL_FIELD'); $html = <<<HTML <input type="button" class="btn btn-small btn-success del_button" value="{$fadd}" onclick="fieldAdd()" /> <fieldset class="panelform"> HTML; if (empty($pluginParams->customfields)) { $selectType = JHTML::_('select.genericlist', $typeOptions, 'jform[params][customfields][0][type]', 'class="type inputbox" onchange="loadExtraFields(this, 0)"', 'value', 'text'); $html .= <<<HTML <div id="field_0" class="field_contayner"> <hr style="clear:both"/> <div style="width: 50%; float: left"> <div class="control-group"> \t<div class="control-label"> <label for="jform_params_name_0">{$fname}</label> \t</div> \t<div class="controls"> <input type="text" id="name_field_1" name="jform[params][customfields][0][name]" id="jform_params_name_0" value="field_1" size="20" class="name inputbox" aria-invalid="false"> \t</div> </div> <div class="control-group"> \t<div class="control-label"> <label for="jform_params_title_0">{$ftitle}</label> \t</div> \t<div class="controls"> <input type="text" name="jform[params][customfields][0][title]" id="jform_params_title_0" value="" size="20" class="title inputbox" aria-invalid="false"> \t</div> </div> <div class="control-group"> \t<div class="control-label"> <label for="jform_params_title_0">{$ftype}</label> \t</div> \t<div class="controls">{$selectType}</div> </div> <div class="control-group"> \t<div class="control-label"> <label for="jform_params_params_0">{$fparams}</label> \t</div> \t<div class="controls"> <textarea name="jform[params][customfields][0][params]" id="jform_params_params_0" cols="40" rows="5" class="params inputbox"></textarea> \t</div> </div> </div> <div style="width: 50%; float: left" id="extra_params_0" class="extra_params"></div> <div style="clear: both;"></div> <input type="button" class="btn btn-danger del-button" value="{$fdel}" onclick="fieldDel(\\'field_0\\')"> </div> HTML; } else { $numFields = count($pluginParams->customfields); $k = 0; foreach ($pluginParams->customfields as $custom) { $extraparams = ''; if (!empty($extraOptionsSettings[$custom->type])) { foreach ($extraOptionsSettings[$custom->type] as $extraparam) { $value = !empty($custom->extraparams->{$extraparam}['name']) ? $custom->extraparams->{$extraparam}['name'] : ''; $attr = ''; if (isset($extraparam['attr']) && is_array($extraparam['attr']) && count($extraparam['attr'])) { foreach ($extraparam['attr'] as $key => $val) { $attr .= $key . '="' . $val . '" '; } } if ($extraparam['type'] == 'textarea') { $input = '<textarea name="jform[params][customfields][' . $k . '][extraparams][' . $extraparam['name'] . ']" ' . $attr . '>' . $value . '</textarea>'; } else { if ($extraparam['type'] == 'select') { $options = array(); if (isset($extraparam['options']) && is_array($extraparam['options']) && count($extraparam['options'])) { foreach ($extraparam['options'] as $key => $val) { $options[] = JHtml::_('select.option', $key, $val); } } $input = JHTML::_('select.genericlist', $options, 'jform[params][customfields][' . $k . '][extraparams][' . $extraparam['name'] . ']', $attr, 'value', 'text', $value); } else { $input = '<input type="' . $extraparam['type'] . '" name="jform[params][customfields][' . $k . '][extraparams][' . $extraparam['name'] . ']" value="' . $value . '" ' . $attr . '/>'; } } $extraparams .= <<<HTML <div class="control-group"> \t<div class="control-label"> <label>{$extraparam['title']}</label> \t</div> \t<div class="controls"> {$input} \t</div> </div> HTML; } } $selectType = JHTML::_('select.genericlist', $typeOptions, 'jform[params][customfields][' . $k . '][type]', 'class="type inputbox" onchange="loadExtraFields(this.value, ' . $k . ')"', 'value', 'text', $custom->type); $html .= <<<HTML <div id="field_{$k}" class="field_contayner"> <hr style="clear:both"/> <div style="width: 50%; float: left"> <div class="control-group"> \t<div class="control-label"> <label>{$fname}</label> \t</div> \t<div class="controls"> <input type="text" id="name_{$custom->name}" name="jform[params][customfields][{$k}][name]" value="{$custom->name}" size="20" class="name inputbox" aria-invalid="false" readonly="readonly" onblur="checkEnter(this)"/> \t</div> </div> <div class="control-group"> \t<div class="control-label"> <label>{$ftitle}</label> \t</div> \t<div class="controls"> <input type="text" name="jform[params][customfields][{$k}][title]" value="{$custom->title}" size="20" class="title inputbox" aria-invalid="false" /> \t</div> </div> <div class="control-group"> \t<div class="control-label"> <label>{$ftype}</label> \t</div> \t<div class="controls">{$selectType}</div> </div> <div class="control-group"> \t<div class="control-label"> <label>{$fparams}</label> \t</div> \t<div class="controls"> <textarea name="jform[params][customfields][{$k}][params]" cols="40" rows="5" class="params inputbox">{$custom->params}</textarea> \t</div> </div> </div> <div style="width: 50%; float: left" id="extra_params_{$k}" class="extra_params">{$extraparams}</div> <div style="clear: both;"></div> <input type="button" class="btn btn-danger del-button" value="{$fdel}" onclick="fieldDel('field_{$k}')"> </div> HTML; $k++; } } $html .= <<<HTML <input type="hidden" id="numFields" value="{$numFields}"/> </fieldset> HTML; return $html; }
/** * Метод для обновления компонента. * * @param object $parent Класс, который вызывает этом метод. * * @return void */ public function update($parent) { $plugin = JPluginHelper::getPlugin('system', 'minicck'); $params = json_decode($plugin->params); $customfields = $params->customfields; if (is_array($customfields) && count($customfields) > 0) { $newColumn = array(); $db = JFactory::getDbo(); $table = $db->replacePrefix('#__minicck'); $query = $db->getQuery(true); $query->select('COLUMN_NAME')->from('INFORMATION_SCHEMA.COLUMNS')->where('TABLE_NAME = ' . $db->quote($table)); $db->setQuery($query); $columns = $db->loadColumn(); if (!is_array($columns) || count($columns) == 0 || !in_array('field_values', $columns)) { return; } include_once JPATH_ROOT . '/plugins/system/minicck/classes/html.class.php'; $minicck = MiniCCKHTML::getInstance(array()); $flipColumns = array_flip($columns); //удаляем из массива служебные поля unset($columns[$flipColumns['id']], $columns[$flipColumns['content_id']], $columns[$flipColumns['field_values']]); $db->setQuery('ALTER IGNORE TABLE `#__minicck` ADD `content_type` varchar(50) NOT NULL')->execute(); //формируем новые и удаленные поля foreach ($customfields as $v) { if (!in_array($v->name, $columns)) { $tmp = array('name' => $v->name, 'type' => $v->type); $classname = $minicck->loadElement($tmp); $tmp['columnType'] = !empty($classname::$columnType) ? $classname::$columnType : 'varchar(250)'; $newColumn[] = $tmp; $db->setQuery('ALTER IGNORE TABLE `#__minicck` ADD `' . $v->name . '` ' . $tmp['columnType'] . ' NOT NULL')->execute(); } } //запрашиваем все данные $query = $db->getQuery(true); $query->select('*')->from('`#__minicck`'); $data = $db->setQuery($query)->loadObjectList(); if (!$data || !is_array($data) || !count($data)) { return; } //очищаем таблицу $query = "TRUNCATE `#__minicck`"; $db->setQuery($query); $db->execute(); foreach ($data as $v) { $values = (array) json_decode($v->field_values); $object = new stdClass(); $object->content_id = $v->content_id; $object->content_type = $values['content_type']; foreach ($newColumn as $column) { $columnName = $column['name']; if (isset($values[$columnName])) { $value = $values[$columnName]; $classname = $minicck->loadElement($column); if (method_exists($classname, 'prepareToSaveValue')) { $value = $classname::prepareToSaveValue($value); } else { $value = is_array($value) ? implode(',', $value) : $value; } $object->{$columnName} = $value; } } $db->insertObject('#__minicck', $object); } $db->setQuery('ALTER IGNORE TABLE `#__minicck` DROP `field_values`')->execute(); } }