public static function getInstance($customfields)
 {
     if (!self::$_instance instanceof self) {
         self::$_instance = new self($customfields);
     }
     return self::$_instance;
 }
Beispiel #2
0
 /** Создание новых и удаление удаленных полей из таблицы
  * @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;
    }
Beispiel #4
0
 /**
  * Метод для обновления компонента.
  *
  * @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();
     }
 }