Initial commit

This commit is contained in:
2026-02-18 22:20:41 +05:00
parent 7e856bdc51
commit a80fd58b3f
13 changed files with 3348 additions and 2 deletions

View File

@@ -1,3 +1,24 @@
# import
### import
Модуль импорта v2.26.0 (Light версия) Только для AVE.CMS ALT
### Модуль импорта v2.26.0 (Light версия)
### Автор: @MadDen
#### `Внимание! Только новая установка модуля!`
### Данный модуль осуществляет импорт документов из файлов различных типов.
### Changelog:
02.09.2019 - версия 2.26.0 - Адаптация для версии cms 3.26
13.04.2017 - версия 2.1
10.08.2016 - версия 2.0.1
08.08.2016 - версия 2.0
### Устанавливать только после удаления из системы предыдущей версии модуля.
03.07.2015 - версия 1.2.2

192
class.import.parsers.php Normal file
View File

@@ -0,0 +1,192 @@
<?
/**
* Класс, включающий все парсеры импорта
*
* @package AVE.cms
* @subpackage module_DocManager
* @filesource
*/
class ModuleImportParsers
{
/* !CSV */
function CSV2Array($csvfile, $sep=';', $protect='"')
{
$data = file_get_contents($csvfile);
if (! $data)
return;
// проверяем кодировку
if (mb_check_encoding($data, 'cp1251'))
{
$utf8_tmp = true;
$csvfile = $csvfile . '.utf8.tmp';
$data = @iconv('cp1251', 'UTF-8', $data);
file_put_contents($csvfile, $data);
}
$handle = fopen($csvfile, 'r');
// берём первую строку как теги
$tags = fgetcsv($handle, 0, $sep, $protect);
array_walk_recursive($tags, 'trim');
$ii = 0;
$items = array();
while ($item = fgetcsv($handle, 0, $sep, $protect))
{
array_walk_recursive($item, 'trim');
foreach($item AS $key => $val)
{
if ($val != '')
$items[$ii][$tags[$key]] = $val;
}
$ii++;
}
fclose($handle);
if ($utf8_tmp)
unlink($csvfile);
$result =
[
'num' => count($items),
'tags' => $tags,
'rows' => $items
];
unset($tags, $items);
return $result;
}
/* !Excel */
function Excel2Array($fname)
{
require_once(dirname(__FILE__).'/excel_reader.php');
$Excel = new Spreadsheet_Excel_Reader(); // создаем объект
$Excel->setOutputEncoding('UTF-8'); // устанавливаем кодировку
$Excel->read($fname); // открываем файл
$tags = $Excel->sheets[0]['cells'][1]; // Определяем теги
$items = array();
$ii = 0;
foreach ($Excel->sheets[0]['cells'] AS $key => $value)
{
if ($key == 1)
continue;
foreach($value AS $k => $val)
{
$items[$ii][$tags[$k]] = $val;
}
$ii++;
}
$result =
[
'num' => count($items),
'tags' => $tags,
'rows' => $items
];
unset($Excel, $tags, $items);
return $result;
}
/* !XML */
function XML2Array($fname)
{
$xml = (simplexml_load_file($fname));
$xml = object2array($xml);
unset ($xml['@attributes']);
$a = array_values($xml);
$tags = array(); // Определяем теги
foreach ($a[0][0] AS $key => $value)
{
$tags[] = $key;
}
$items = array();
foreach ($a[0] AS $key => $row)
{
foreach($row AS $k => $val)
{
if ($val != '')
$items[$key][$k] = $val;
}
}
$result =
[
'num' => count($items),
'tags' => $tags,
'rows' => $items
];
unset($xml, $a, $tags, $items);
return $result;
}
/* !DBF */
public static function DBF2Array($fname)
{
$db = dbase_open($fname, 0);
$cols = dbase_get_header_info($db);
$count = dbase_numrecords($db);
$rows = array();
$tags = array();
foreach($cols AS $k => $v)
{
$tags[] = $v['name'];
}
$ii = 1;
for ($ii; $ii <= $count; $ii++)
{
$rows[] = dbase_get_record_with_names($db, $ii);
}
$result =
[
'num' => $count - $parser_row,
'tags' => $tags,
'rows' => $rows
];
dbase_close($db);
unset($cols, $count, $tags, $rows);
return $result;
}
}

732
class.import.php Normal file
View File

@@ -0,0 +1,732 @@
<?
/**
* Класс, включающий все свойства и методы для управления документами
*
* @package AVE.cms
* @subpackage module_DocManager
* @filesource
*/
class ModuleImport
{
/**
* Свойства класса
*/
/**
* Путь к директории с шаблонами модуля
*/
var $tpl_dir;
/**
* Основные поля документа, предлагаемые для импорта
*/
var $fields_main = array(
'Id',
'document_title',
'document_alias',
'document_meta_keywords',
'document_meta_description',
'document_meta_robots',
'document_published',
'document_expire',
'document_in_search',
'document_status',
'document_deleted',
'document_linked_navi_id',
'document_breadcrum_title',
'document_parent',
'document_count_view',
'document_lang'
);
/**
* Внутренние методы
*/
/**
* Метод получения импорта
* $small - для сохранения памяти при импорте
*/
function _import($import_id, $type='row', $small = false)
{
global $AVE_DB;
// забираем импорт
$import = $AVE_DB->Query("
SELECT " . ($small
? "i.rub_id,i.name,i.parser,i.docs_disable,i.docs_create,i.fields,i.file FROM " . PREFIX . "_module_import AS i"
: "i.*, r.rubric_title AS rub_title
FROM
" . PREFIX . "_module_import AS i
LEFT JOIN
" . PREFIX . "_rubrics AS r ON r.Id = i.rub_id"
) . "
WHERE
i.id=" . (int)$import_id
)->FetchRow();
// поля
$import->fields = $import->fields ? unserialize($import->fields) : array();
// теги
if (isset($import->tags))
$import->tags = $import->tags
? unserialize($import->tags)
: array();
// возвращаем массив, если попросили
if ($type != 'row' && $type != 'r')
$import = (array)$import;
return $import;
}
/**
* Метод рекурсивно создаёт массив замен
*/
function _replace($mixed, $key = '', $new = true)
{
static $arr = array();
if ($new)
$arr = array();
if (! is_array($mixed))
return $arr['[row' . $key . ']'] = $mixed;
$res = $key;
foreach ($mixed as $k => $v)
{
if(is_array($v))
{
$arr['[row:' . $k . ']'] = serialize($v);
}
$this->_replace($v, $res . ':' . $k, false);
}
return $arr;
}
/**
* Метод рекурсивно создаёт массив замен
*/
function _maketag($key)
{
return '[row:' . $key . ']';
}
/**
* Метод заменяет в шаблонах полей теги и выполняет код php
*/
function _parse_tpl(&$item, &$key, $replace)
{
$code = stripslashes(strtr($item,$replace));
$item = trim(eval2var('?>' . $code . '<?'));
if ($unser = unserialize($item))
$item = $unser;
}
/**
* Проверка наличия документа по ключевым полям
*
* @param array $array - массив ID_поля_в_рубрике=>Ключевое_значение
* @param int $rub - id рубрики
*
* @return int/false - возвращает Id документа или false
*/
function _docs_find(&$fields_key, $fields_comp, $item_fields, $rub_id)
{
global $AVE_DB;
if (! $fields_key)
return 0;
foreach($fields_key['main'] as $field_id => &$val)
{
$val = $item_fields['main'][$field_id];
if ($fields_comp['main'][$field_id] == 'LIKE')
$main[] = 'a.' . $field_id . " LIKE '%" . (string)addslashes($item_fields['main'][$field_id]) . "%'";
else
$main[] = 'a.' . $field_id . " = '" . (string)addslashes($item_fields['main'][$field_id]) . "'";
}
if ($main)
$main = ' AND ' . implode(' AND ', $main);
$x = 0;
foreach($fields_key['body'] as $field_id => &$val)
{
$val = $item_fields['body'][$field_id];
$tables[] = PREFIX . "_document_fields AS t" . $x;
if ($fields_comp['body'][$field_id] == 'LIKE')
$body[] = "(a.Id=t" . $x . ".document_id AND (t" . $x . ".rubric_field_id = " . $field_id . " AND t" . $x . ".field_value LIKE '%" . (string)addslashes($item_fields['body'][$field_id]) . "%'))";
else
$body[] = "(a.Id=t" . $x . ".document_id AND (t" . $x . ".rubric_field_id = " . $field_id . " AND t" . $x . ".field_value = '" . (string)addslashes($item_fields['body'][$field_id]) . "'))";
$x++;
}
if ($tables)
$tables = ', ' . implode(', ', $tables);
if ($body)
$body = ' AND ' . implode(' AND ', $body);
$docids = array();
$sql = $AVE_DB->Real_Query("
SELECT
a.Id AS id
FROM
" . PREFIX . "_documents AS a " . $tables . "
WHERE
a.rubric_id = " . $rub_id .
$main .
$body
);
while ($docid = $sql->FetchRow()->id)
$docids[] = $docid;
return $docids;
}
/**
* Внешние методы
*/
/**
* Метод вывода импортов
*/
function importsList ()
{
global $AVE_DB, $AVE_Template;
// Забираем все импорты
$limit = 20;
$start = get_current_page() * $limit - $limit;
$sql = $AVE_DB->Query("
SELECT SQL_CALC_FOUND_ROWS
*
FROM
" . PREFIX . "_module_import
ORDER BY
id ASC
LIMIT
" . $start . "," . $limit
);
while ($import = $sql->FetchAssocArray())
{
$import['rub_title'] = $AVE_DB->Query("
SELECT
rubric_title
FROM
" . PREFIX . "_rubrics
WHERE
id=" . (int)$import['rub_id']
)->GetCell();
$imports[] = $import;
}
$num = $AVE_DB->NumAllRows;
if ($num > $limit)
{
$page_nav = '<a class="pnav" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=1&amp;page={s}&amp;cp=' . SESSION . '">{t}</a>';
$page_nav = get_pagination($pages, 'page', $page_nav);
$AVE_Template->assign('page_nav', $page_nav);
}
$AVE_Template->assign('imports',$imports);
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_list.tpl'));
}
/**
* Метод создания и редактирования импорта
*/
function importEdit ($import_id=null)
{
global $AVE_DB, $AVE_Template;
if ($import_id)
{
$import = $this->_import($import_id, 'array');
$import_fields = array();
// основные поля
foreach ($this->fields_main as $field_id)
{
$import_fields['main'][$field_id] = isset($import['fields']['main'][$field_id]) ? $import['fields']['main'][$field_id] : array();
$import_fields['main'][$field_id]['title'] = $AVE_Template->get_config_vars('field_' . $field_id);
}
// поля рубрики
$sql = $AVE_DB->Query("
SELECT
Id AS id,
rubric_field_title AS title
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . (int)$import['rub_id'] . "'
ORDER BY
rubric_field_position
");
while ($field = $sql->FetchRow())
{
$field_id = $field->id;
$import_fields['body'][$field_id] = isset($import['fields']['body'][$field_id])
? $import['fields']['body'][$field_id]
: array();
$import_fields['body'][$field_id]['title'] = $field->title;
}
$import['fields'] = $import_fields;
}
else
{
// рубрики
$sql = $AVE_DB->Query("
SELECT
Id AS id,
rubric_title AS title
FROM
" . PREFIX . "_rubrics
");
while ($row = $sql->FetchAssocArray())
{
$rubs[] = $row;
}
$AVE_Template->assign('rubs',$rubs);
}
// парсеры
require_once (BASE_DIR . '/modules/import/class.import.parsers.php');
$parsers = get_class_methods('ModuleImportParsers');
$AVE_Template->assign('parsers',$parsers);
$AVE_Template->assign('import_id',$import_id);
$AVE_Template->assign('import',$import);
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_edit.tpl'));
}
/**
* Метод сохранения профиля обмена
*/
function importSave ($import_id=null)
{
global $AVE_DB, $AVE_Template;
// если новый
if (! $import_id)
{
$AVE_DB->Query("
INSERT INTO
" . PREFIX . "_module_import
SET
name = '" . addslashes($_POST['name']) . "',
rub_id = '" . (int)$_POST['rub_id'] . "',
parser = '" . $_POST['parser'] . "',
docs_disable = '" . (int)$_POST['docs_disable'] . "',
docs_create = '" . (int)$_POST['docs_create'] . "',
file = '" . trim(trim($_POST['file']),'/') . "',
monitor = '" . (int)$_POST['monitor'] . "',
time_edited = '" . time() . "'
");
$import_id = $AVE_DB->InsertId();
}
else // если редактирование
{
$import_fields = array(
'main' => array(),
'body' => array()
);
// чистим массив от пустых шаблонов
foreach ($_POST['fields']['main'] as $field_id => $field)
{
$field['tpl'] = trim((string)$field['tpl']);
if ($field['tpl'] === '')
unset($field['tpl']);
if (!$field['comp'])
unset($field['comp']);
elseif ($field['comp'] === 'LIKE' && isset($field['active']))
unset($field['active']);
if (! empty($field))
$import_fields['main'][$field_id] = $field;
}
foreach ($_POST['fields']['body'] as $field_id => $field)
{
$field['tpl'] = trim((string)$field['tpl']);
if ($field['tpl'] === '')
unset($field['tpl']);
if (!$field['comp'])
unset($field['comp']);
elseif ($field['comp'] === 'LIKE' && isset($field['active']))
unset($field['active']);
if (! empty($field)) $import_fields['body'][$field_id] = $field;
}
// записываем изменения в бд
$AVE_DB->Query("
UPDATE
" . PREFIX . "_module_import
SET
name = '" . addslashes($_POST['name']) . "',
parser = '" . $_POST['parser'] . "',
docs_disable = '" . (int)$_POST['docs_disable'] . "',
docs_create = '" . (int)$_POST['docs_create'] . "',
file = '" . trim(trim($_POST['file']),'/') . "',
monitor = '" . (int)$_POST['monitor'] . "',
fields = '" . addslashes(serialize($import_fields)) . "',
time_edited = '" . time() . "'
WHERE
id = '" . $import_id . "'
");
}
if (isAjax())
{
$message = $AVE_Template->get_config_vars('saved');
$header = $AVE_Template->get_config_vars('success');
$theme = 'accept';
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
else
{
return $import_id;
}
}
/**
* Метод удаления импорта
*/
function importDelete ($import_id)
{
global $AVE_DB;
$AVE_DB->Query("
DELETE FROM
" . PREFIX . "_module_import
WHERE
id = " . $import_id
);
}
/**
* Метод копирования импорта
*/
function importCopy ($import_id)
{
global $AVE_DB;
$_POST = $this->_import($import_id,'array');
// сначала создаём и получаем id
$import_id = $this->importSave();
// теперь сохраняем всё остальное
return $this->importSave($import_id);
}
/**
* Импорт
*/
function importRun ($import_id, $tags_only = false, $file = null, $write_log = false)
{
global $AVE_DB;
require_once(BASE_DIR . '/class/class.docs.php');
$AVE_Document = new AVE_Document();
// задаём переменные
$fields_active = array();
$fields_key = array();
$fields_oblig = array();
$fields_comp = array();
$fields = array();
// Получаем параметры импорта и создаём переменные с параметрами полей
$import = $this->_import($import_id, 'row', true);
foreach ($import->fields['main'] as $field_id => &$field)
{
if (!isset($field['tpl']))
$field['tpl'] = '';
if ($field['active'] && $field['comp'] != 'LIKE')
$fields_active['main'][$field_id] = true;
if ($field['key'])
{
$fields_key['main'][$field_id] = '';
$fields_comp['main'][$field_id] = (isset($field['comp']) && $field['comp'] == 'LIKE') ? 'LIKE' : '';
}
if ($field['oblig'])
$fields_oblig['main'][] = $field_id;
if ($field['active'] || $field['tpl'] > '')
$fields['main'][$field_id] = $field['tpl'];
}
foreach ($import->fields['body'] as $field_id => &$field)
{
if (! isset($field['tpl']))
$field['tpl'] = '';
if ($field['active'] && $field['comp'] != 'LIKE')
$fields_active['body'][$field_id] = true;
if ($field['key'])
{
$fields_key['body'][$field_id] = '';
$fields_comp['body'][$field_id] = (isset($field['comp']) && $field['comp'] == 'LIKE') ? 'LIKE' : '';
}
if ($field['oblig'])
$fields_oblig['body'][] = $field_id;
if ($field['active'] || $field['tpl'] > '')
$fields['body'][$field_id] = $field['tpl'];
}
// определяем файл
// если файл не передан как аргумент функции, то берём из настроек
if (! isset($file))
$file = BASE_DIR . '/' . $import->file;
// если файл существует, парсим его
if (file_exists($file) && is_file($file))
{
require_once (BASE_DIR . '/modules/import/class.import.parsers.php');
$ModuleImportParsers = new ModuleImportParsers;
$parser = $import->parser;
$import_data = $ModuleImportParsers->$parser($file);
}
// если в итоге (из файла или из кода) был
// сформирован массив $import_data, то продолжаем
// иначе, выходим
if (! isset($import_data))
exit('Отсутствует файл! В ходе выполнения кода массив $import_data также не был передан!');
// Если просили узнать только теги, проходим весь массив $import_data и собираем теги
/* !tags_only */
if ($tags_only)
{
$tags = array();
foreach ($import_data['tags'] as $item)
{
$tags[] = $this->_maketag($item);
}
$tags = array_unique($tags);
$AVE_DB->Query("
UPDATE
" . PREFIX . "_module_import
SET
tags = '" . serialize($tags) . "'
WHERE
id = " . $import_id
);
return $tags;
}
// Помечаем документы как неактивные в указанной рубрике, если нужно
if($import->docs_disable && !$tags_only)
{
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
document_status = '0'
WHERE
rubric_id=" . $import->rub_id
);
}
// чистим память
unset ($import->fields, $import->code_start, $parser, $ModuleImportParsers, $file);
$i = 0;
$log = array(
'updated' => array(),
'created' => array(),
'notfound' => array()
);
// Обрабатываем по очереди каждый объект
foreach($import_data['rows'] as $item)
{
// создаем массив замен
$replace = array();
$replace = $this->_replace($item);
$replace['[Y-m-d]'] = date('d.m.Y H:i');
// парсим шаблоны
$item_fields = $fields;
array_walk_recursive($item_fields, array($this, '_parse_tpl'), $replace);
// чистим память
unset ($replace,$item);
$pass = true;
// проверяем обязательные поля в параметрах документа
foreach ($fields_oblig['main'] as $field_id)
{
if (trim($item_fields['main'][$field_id]) === '')
{
$pass = false;
break;
}
}
if (! $pass)
continue;
// проверяем обязательные поля в теле документа
foreach ($fields_oblig['body'] as $field_id)
{
if (trim($item_fields['body'][$field_id]) === '')
{
$pass = false;
break;
}
}
if (! $pass)
continue;
// находим документ по ключевым полям
$docids = $this->_docs_find($fields_key, $fields_comp, $item_fields, $import->rub_id);
// если не совпал и не создаём новые
if (! $docids && !$import->docs_create && $write_log)
{
$log['notfound'][] = array('fields_key' => $fields_key, 'fields_values' => $item_fields);
continue;
}
// если указано создавать документы при несовпадении, добавляем нулевой id
elseif (! $docids && $import->docs_create)
$docids[] = 0;
// проходим каждый документ
foreach ($docids as $doc_id)
{
if ($doc_id)
{
$doc = $AVE_DB->Real_Query("
SELECT
*
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $doc_id . "'
")->FetchAssocArray();
// прописываем текущие значения в поля main, которые не надо импортировать
foreach($this->fields_main as $field_id)
{
if(! $fields_active['main'][$field_id])
{
$item_fields['main'][$field_id] = $doc[$field_id];
}
}
unset ($doc);
}
// меняем время, если в UNIX-е
if (strlen((string)$item_fields['main']['document_published']) == 10)
$item_fields['main']['document_published'] = date('d.m.Y H:i', $item_fields['main']['document_published']);
if (strlen((string)$item_fields['main']['document_expire']) == 10)
$item_fields['main']['document_expire'] = date('d.m.Y H:i', $item_fields['main']['document_expire']);
// удаляем ненужные поля из полей рубрики
foreach($item_fields['body'] as $field_id => $field)
{
if (! $fields_active['body'][$field_id])
unset($item_fields['body'][$field_id]);
else
// если поле оказалось пустым, убираем значение из формы
$item_fields['body'][$field_id] = preg_replace('/\[row:(.+?)\]/', '', $item_fields['body'][$field_id]);
}
// удаляем Id документа
unset ($item_fields['main']['Id']);
// сохраняем документ
$data = array();
$data = $item_fields['main'];
$data['doc_title'] = $data['document_title'];
$data['document_expire'] = date("d.m.Y H:i", strtotime('+20 year'));
$data['feld'] = $item_fields['body'];
$data['import'] = 1;
$response = $AVE_Document->documentSave($import->rub_id, $doc_id, $data);
// записываем лог
if ($write_log)
{
// если совпал и обновлён
if ($doc_id)
$log['updated'][$doc_id] = array('fields_key' => $fields_key);
// если не совпал и создан
else
$log['created'][$response] = array('fields_key' => $fields_key);
}
}
}
$AVE_DB->Query("
UPDATE
" . PREFIX . "_module_import
SET
time_run = '" . time() . "'
WHERE
id = " . $import_id
);
return $log;
}
}

1738
excel_reader.php Normal file

File diff suppressed because it is too large Load Diff

4
index.php Normal file
View File

@@ -0,0 +1,4 @@
<?php
header('Location:/');
exit;
?>

20
info.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
if (! defined('BASE_DIR'))
exit;
$module = array(
'ModuleSysName' => 'import',
'ModuleVersion' => '2.26.0',
'ModuleAutor' => 'AVE.cms Team',
'ModuleCopyright' => '&copy; 2007-' . date('Y') . ' AVE.cms',
'ModuleStatus' => 1,
'ModuleIsFunction' => 1,
'ModuleTemplate' => 0,
'ModuleAdminEdit' => 1,
'ModuleFunction' => 'import',
'ModuleTag' => null,
'ModuleTagLink' => null,
'ModuleAveTag' => null,
'ModulePHPTag' => null
);
?>

4
lang/index.php Normal file
View File

@@ -0,0 +1,4 @@
<?php
header('Location:/');
exit;
?>

76
lang/ru.txt Normal file
View File

@@ -0,0 +1,76 @@
[name]
MODULE_NAME = "Импорт (Облегченная версия)"
MODULE_DESCRIPTION = "Осуществляет импорт документов из файлов различных типов"
[admin]
mod_name = "Импорт"
imports = "Список импортов"
import_add = "Добавить импорт"
name = "Название"
rub_name = "Рубрика"
parser = "Парсер"
time_edited = "Последнее&nbsp;изменение"
time_run = "Последний&nbsp;запуск"
actions = "Действия"
create = "Создать"
edit = "Редактировать"
copy = "Копировать"
run = "Запустить"
delete = "Удалить"
delete_t = "Удаление..."
delete_m = "Вы уверены, что хотите удалить<br>импорт и все его настройки?"
noimports = "Нет импортов"
import_edit_tit = "Редактирование импорта"
import_new_tit = "Создание импорта"
import_set = "Настройки импорта"
docs_disable = "Перед импортом пометить все документы рубрики как неактивные"
docs_create = "Создавать новый документ, если не удаётся найти совпадение по ключевому полю"
monitor = "Отслеживать изменения файла и автоматически делать импорт"
file = "Файл по умолчанию"
fields_main = "Основные поля документа"
fields_body = "Поля рубрики"
fields_file = "Теги файла"
check_f_active = "Импортировать поле"
check_f_key = "Ключевое поле. Например, Вы сделали импорт и после изменения файла хотите повторить операцию. Если у какого-либо документа ключевое поле совпало, то он будет изменён, в противном случае - создан заново или пропущен (в зависимости от настроек импорта)."
check_f_oblig = "Обязательное поле"
field = "Поле"
compare_type = "Тип сравнения для ключевого поля. '==' - полностью совпадает, 'LIKE' - содержит подстроку. Обратите внимание, что опция 'LIKE' запрещает импортировать данное поле на уровне исполняемого кода."
field_tpl = "Шаблон импорта поля"
tags = "Теги"
tag_date = "Тег текущей даты. Формат вывода: yyyy-mm-dd"
tag_one = "Значение из элемента массива, где XXX - имя ключа"
tag_many = "Значение из многомерного массива, уровень вложенности через :"
create_cont = "Создать и продолжить редактирование"
save = "Сохранить"
save_cont = "Применить (CTRL+S)"
saved = "Сохранено"
tags_refresh = "Обновить список тегов"
run_btn = "Запустить импорт"
success = "Выполнено"
erorr = "Ошибка"
field_Id = "Id документа"
field_document_title = "Название документа"
field_document_alias = "Псевдоним документа (alias)"
field_document_meta_keywords = "Ключевые слова (meta keywords)"
field_document_meta_description = "Описание страницы (meta description)"
field_document_meta_robots = "Тип индексирования страницы (meta robots)"
field_document_published = "Начало публикации"
field_document_expire = "Окончание публикации"
field_document_deleted = "Временно удалён"
field_document_in_search = "Разрешить поиск по документу (0 или 1)"
field_document_status = "Статус документа (неактивен = 0 или<br>активен = 1)"
field_document_linked_navi_id = "Связать с пунктом меню (navi_id)"
field_document_breadcrum_title = "Название ссылки для хлебных крошек"
field_document_parent = "Связать с документом (doc_id)"
field_document_count_view = "Количество просмотров"
field_document_lang = "Язык документа"
imported = "Импорт успешно выполнен"

74
module.php Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
* AVE.cms - Модуль Импорта
*
* @package AVE.cms
* @subpackage module_import
* @filesource
*/
if(!defined('BASE_DIR')) exit;
/**
* Админка
*/
if (defined('ACP') && (isset($_REQUEST['moduleaction'])))
{
// класс
require_once(BASE_DIR . '/modules/import/class.import.php');
$import = new ModuleImport;
// папка с шаблонами
$import->tpl_dir = BASE_DIR . '/modules/import/templates/';
// ланги
$AVE_Template->config_load(BASE_DIR . '/modules/import/lang/' . $_SESSION['admin_language'] . '.txt', 'admin');
$AVE_Template->assign('config_vars', $AVE_Template->get_config_vars());
$header_list = 'Location:index.php?do=modules&action=modedit&mod=import&moduleaction=1&cp=' . SESSION . '&page=' . $_REQUEST['page'];
switch($_REQUEST['moduleaction'])
{
case '1':
$import->importsList();
break;
case 'edit':
$import->importEdit((int)$_REQUEST['import_id']);
break;
case 'copy':
$import_id = $import->importCopy((int)$_REQUEST['import_id']);
header('Location:index.php?do=modules&action=modedit&mod=import&moduleaction=edit&import_id=' . $import_id . '&cp=' . SESSION);
exit;
case 'save':
$import_id = $import->importSave((int)$_REQUEST['import_id']);
if (! $_REQUEST['import_id'])
header('Location:index.php?do=modules&action=modedit&mod=import&moduleaction=edit&import_id=' . $import_id . '&cp=' . SESSION);
else
header($header_list);
exit;
case 'delete':
$import->importDelete((int)$_REQUEST['import_id']);
header($header_list);
exit;
case 'tags':
$import_id = (int)$_REQUEST['import_id'];
$import->importRun($import_id, true);
header('Location:index.php?do=modules&action=modedit&mod=import&moduleaction=edit&import_id=' . $import_id . '&cp=' . SESSION);
exit;
case 'run':
$import_id = (int)$_REQUEST['import_id'];
$import->importRun($import_id);
header('Location:index.php?do=modules&action=modedit&mod=import&moduleaction=edit&import_id=' . $import_id . '&cp=' . SESSION);
exit;
}
}

48
sql.php Normal file
View File

@@ -0,0 +1,48 @@
<?php
/**
* AVE.cms - Модуль импорта
*
* @package AVE.cms
* @subpackage module_Import
* @filesource
*/
/**
* mySQL-запросы для установки, обновления и удаления модуля
*/
$module_sql_install = array();
$module_sql_deinstall = array();
$module_sql_update = array();
$module_sql_deinstall[] = "DROP TABLE IF EXISTS %%PRFX%%_module_import;";
$module_sql_install[] = "CREATE TABLE %%PRFX%%_module_import (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`rub_id` int(10) unsigned NOT NULL,
`parser` varchar(255) NOT NULL,
`docs_disable` enum('0','1') NOT NULL default '0',
`docs_create` enum('0','1') NOT NULL default '0',
`file` varchar(255) NOT NULL,
`monitor` enum('0','1') NOT NULL default '0',
`tags` text NOT NULL,
`fields` longtext NOT NULL,
`time_edited` int(10) unsigned NOT NULL,
`time_run` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
// Обновление модуля
$module_sql_update[] = "
UPDATE
`%%PRFX%%_module`
SET
ModuleAveTag = '" . $modul['ModuleAveTag'] . "',
ModulePHPTag = '" . $modul['ModulePHPTag'] . "',
ModuleVersion = '" . $modul['ModuleVersion'] . "'
WHERE
ModuleSysName = '" . $modul['ModuleSysName'] . "'
LIMIT 1;
";

337
templates/admin_edit.tpl Normal file
View File

@@ -0,0 +1,337 @@
<script>
var import_id = {$import_id};
</script>
<div class="title">
<h5>{if $import_id}{#import_edit_tit#}{else}{#import_new_tit#}{/if}</h5>
</div>
<div class="breadCrumbHolder module">
<div class="breadCrumb module">
<ul>
<li class="firstB">
<a href="index.php" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a>
</li>
<li>
<a href="index.php?do=modules&amp;cp={$sess}">{#MODULES_SUB_TITLE#}</a>
</li>
<li>
<a href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=1&amp;cp={$sess}">{#mod_name#}</a>
</li>
<li>
{if $import_id}{#import_edit_tit#}{else}{#import_new_tit#}{/if}
</li>
{if $import_id}
<li>
<strong class="code">{$import.name|escape|stripslashes}</strong>
</li>
{/if}
</ul>
</div>
</div>
<form action="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=save&amp;import_id={$import_id}&amp;cp={$sess}" method="post" class="mainForm" id="importSaveForm">
<div class="widget first">
<div class="head {if $import_id}closed{/if}">
<h5 class="iFrames">{#import_set#}</h5>
</div>
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
<tr class="noborder">
<td width="250">{#name#}</td>
<td>
<input name="name" class="mousetrap" type="text" style="width:250px" value="{$import.name|escape|stripslashes}" autocomplete="off" id="importNameInput" />
</td>
</tr>
<tr>
<td>{#rub_name#}</td>
<td>
{if !$import_id}
<select name="rub_id">
{foreach from=$rubs item=rub}
<option value="{$rub.id}">{$rub.title}</option>
{/foreach}
</select>
{else}
{$import.rub_title|escape|stripslashes}
{/if}
</td>
</tr>
<tr>
<td>{#parser#}</td>
<td>
<select name="parser" style="width: 250px;">
{foreach from=$parsers item=parser}
<option value="{$parser}" {if $import.parser == $parser}selected="selected"{/if}>{$parser}</option>
{/foreach}
</select>
</td>
</tr>
<tr>
<td>{#docs_disable#}</td>
<td><input class="mousetrap" type="checkbox" name="docs_disable" value="1" {if $import.docs_disable}checked="checked"{/if} /></td>
</tr>
<tr>
<td>{#docs_create#}</td>
<td><input type="checkbox" name="docs_create" value="1" {if $import.docs_create}checked="checked"{/if} /></td>
</tr>
<tr>
<td>{#monitor#}</td>
<td><input type="checkbox" name="monitor" value="1" {if $import.monitor}checked="checked"{/if} /></td>
</tr>
<tr>
<td>{#file#}</td>
<td>/&nbsp;<input class="mousetrap" type="text" name="file" value="{$import.file|escape|stripslashes}" style="width:300px;" /></td>
</tr>
</table>
<div class="rowElem">
<input type="submit" class="basicBtn" value="{if $import_id}{#save#}{else}{#create#}{/if}" />
{if $import_id}
&nbsp;
<input type="submit" class="blackBtn importSaveContBtn" value="{#save_cont#}" /> &nbsp;
<input type="submit" class="greenBtn" value="{#tags_refresh#}" onClick="location.href='index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=tags&amp;import_id={$import.id}&amp;cp={$sess}';return false;" /> &nbsp;
<input type="submit" class="redBtn" onClick="location.href='index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=run&amp;import_id={$import_id}&amp;cp={$sess}';return false;" value="{#run_btn#} (Ctrl+O)" />
{/if}
</div>
</div>
{if $import_id}
<div style="position:relative;width:73%;float:left">
<div class="widget first">
<div class="head {if $import_id}closed{/if}">
<h5 class="iFrames">{#fields_main#}</h5>
</div>
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
<colgroup>
<col width="1" />
<col width="1" />
<col width="1" />
<col width="250" />
<col width="1" />
<col width="*" />
</colgroup>
<thead>
<tr class="noborder">
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_active#}"></a>
</div>
</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_key#}"></a>
</div>
</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_oblig#}"></a>
</div>
</td>
<td>{#field#}</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#compare_type#}"></a>
</div>
</td>
<td>{#field_tpl#}</td>
</tr>
</thead>
<tbody>
{foreach from=$import.fields.main key=field_id item=field}
<tr>
<td>
<input type="checkbox" value="1" name="fields[main][{$field_id}][active]" {if $field.active}checked="checked"{/if}/>
</td>
<td>
<input type="checkbox" value="1" name="fields[main][{$field_id}][key]" {if $field.key}checked="checked"{/if}/>
</td>
<td>
<input type="checkbox" value="1" name="fields[main][{$field_id}][oblig]" {if $field.oblig}checked="checked"{/if}/>
</td>
<td>{$field.title}</td>
<td>
<select name="fields[main][{$field_id}][comp]" style="width: 80px;">
<option value="">==</option>
<option value="LIKE" {if $field.comp=='LIKE'}selected="selected"{/if}>LIKE</option>
</select>
<td>
<div class="pr12"><textarea class="mousetrap" name="fields[main][{$field_id}][tpl]" style="width:100%; height:24px;">{$field.tpl|escape|stripslashes}</textarea></div>
</td>
</tr>
{/foreach}
</table>
</div>
<div class="widget first">
<div class="head">
<h5 class="iFrames">{#fields_body#}</h5>
</div>
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
<colgroup>
<col width="1" />
<col width="1" />
<col width="1" />
<col width="1" />
<col width="250" />
<col width="1" />
<col width="*" />
</colgroup>
<thead>
<tr class="noborder">
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_active#}"></a>
</div>
</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_key#}"></a>
</div>
</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#check_f_oblig#}"></a>
</div>
</td>
<td align="center">
<div align="center">
ID
</div>
</td>
<td>{#field#}</td>
<td align="center">
<div align="center">
<a href="javascript:void(0);" class="topDir icon_sprite ico_info" title="{#compare_type#}"></a>
</div>
</td>
<td>{#field_tpl#}</td>
</tr>
</thead>
<tbody>
{foreach from=$import.fields.body key=field_id item=field}
<tr>
<td>
<input type="checkbox" value="1" name="fields[body][{$field_id}][active]" {if $field.active}checked="checked"{/if} />
</td>
<td>
<input type="checkbox" value="1" name="fields[body][{$field_id}][key]" {if $field.key}checked="checked"{/if} />
</td>
<td>
<input type="checkbox" value="1" name="fields[body][{$field_id}][oblig]" {if $field.oblig}checked="checked"{/if} />
</td>
<td><strong class="code">{$field_id}</strong></td>
<td>{$field.title}</td>
<td>
<select name="fields[body][{$field_id}][comp]" style="width: 80px;">
<option value="">==</option>
<option value="LIKE" {if $field.comp=='LIKE'}selected="selected"{/if}>LIKE</option>
</select>
<td>
<div class="pr12"><textarea class="mousetrap" name="fields[body][{$field_id}][tpl]" style="width:100%; height:24px;">{$field.tpl|escape|stripslashes}</textarea></div>
</td>
</tr>
{/foreach}
</table>
</div>
</div>
<div class="widget first" style="position:relative;display:block;float:right;clear:none;width:25%">
<div class="head">
<h5 class="iFrames">{#tags#}</h5>
</div>
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
<tbody>
<tr>
<td>
<div class="pr12"><input class="mousetrap topleftDir" readonly style="width:100%" type="text" value="[Y-m-d]" title="{#tag_date#}"></div>
</td>
</tr>
<tr>
<td>
<div class="pr12"><input class="mousetrap topleftDir" readonly style="width:100%" type="text" value="[row:XXX]" title="{#tag_one#}"></div>
</td>
</tr>
<tr>
<td>
<div class="pr12"><input class="mousetrap topleftDir" readonly style="width:100%" type="text" value="[row:XXX:YYY:...]" title="{#tag_many#}"></div>
</td>
</tr>
{if $import.tags}
<tr>
<td align="center">
{#fields_file#}
</td>
</tr>
{foreach from=$import.tags item=tag}
<tr>
<td>
<div class="pr12"><input class="mousetrap" readonly style="width:100%" type="text" value="{$tag}"></div>
</td>
</tr>
{/foreach}
<tr>
{/if}
</table>
</div>
{/if}
</form>
<script type="text/javascript">
$(function() {ldelim}
Mousetrap.bind(['ctrl+s', 'meta+s'], function(event) {ldelim}
event.preventDefault();
{if $import_id}
saveCont();
{else}
$('#importSaveForm').submit();
{/if}
return false;
{rdelim});
{if $import_id}
Mousetrap.bind(['ctrl+o', 'meta+o'], function(event) {ldelim}
event.preventDefault();
importRun ();
return false;
{rdelim});
{/if}
$('.importSaveContBtn').click(function(event) {ldelim}
saveCont();
return false;
{rdelim});
{rdelim});
// функция ajax-сохранения
function saveCont () {ldelim}
$('#importSaveForm').ajaxSubmit({ldelim}
dataType: 'json',
beforeSubmit: function () {ldelim} $.alerts._overlay('show');{rdelim},
success: function (data) {ldelim}
$.alerts._overlay('hide');
$.jGrowl(data['message'], {ldelim}
header: data['header'],
theme: data['theme']
{rdelim});
{rdelim}
{rdelim});
return false;
{rdelim}
// функция запуска импорта
function importRun () {ldelim}
location.href='index.php?do=modules&action=modedit&mod=import&moduleaction=importrun&import_id={$import_id}&cp={$sess}';
/* $.ajax({ldelim}
url: 'index.php?do=modules&action=modedit&mod=import&moduleaction=importrun&import_id={$import_id}&cp={$sess}',
beforeSend: function () {ldelim} $.alerts._overlay('show');{rdelim},
success: function () {ldelim}
$.alerts._overlay('hide');
$.jGrowl('{#imported#}', {ldelim} theme: 'accept'{rdelim});
{rdelim}
{rdelim});*/
{rdelim}
</script>
{if $import_id}
{include file="$codemirror_connect"}
{include conn_id="_1" file="$codemirror_editor" textarea_id='codemirror' ctrls='saveCont();' ctrlo='importRun();' height=200}
{include conn_id="_2" file="$codemirror_editor" textarea_id='codemirror2' ctrls='saveCont();' ctrlo='importRun();' height=200}
{include conn_id="_3" file="$codemirror_editor" textarea_id='codemirror3' ctrls='saveCont();' ctrlo='importRun();' height=200}
{/if}

96
templates/admin_list.tpl Normal file
View File

@@ -0,0 +1,96 @@
<div class="title">
<h5>{#mod_name#}</h5>
</div>
<div class="breadCrumbHolder module">
<div class="breadCrumb module">
<ul>
<li class="firstB">
<a href="index.php" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a>
</li>
<li>
<a href="index.php?do=modules&amp;cp={$sess}">{#MODULES_SUB_TITLE#}</a>
</li>
<li>
<a href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=1&amp;cp={$sess}">{#mod_name#}</a>
</li>
<li>
<strong class="code">{#imports#}</strong>
</li>
</ul>
</div>
</div>
<div class="widget first">
<div class="head">
<h5 class="iFrames">{#imports#}</h5>
<div class="num">
<a class="basicNum" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=edit&amp;cp={$sess}">{#import_add#}</a>
</div>
</div>
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic" id="importsTable">
<colgroup>
<col width="1" />
<col width="*" />
<col width="150" />
<col width="80" />
<col width="140" />
<col width="140" />
<col width="1" />
<col width="1" />
<col width="1" />
<col width="1" />
</colgroup>
<thead>
<tr class="noborder">
<td>ID</td>
<td>{#name#}</td>
<td>{#rub_name#}</td>
<td>{#parser#}</td>
<td>{#time_edited#}</td>
<td>{#time_run#}</td>
<td colspan="4">{#actions#}</td>
</tr>
</thead>
<tbody>
{foreach from=$imports item=import}
<tr>
<td>{$import.id}</td>
<td>
<a class="topDir" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=edit&amp;import_id={$import.id}&amp;cp={$sess}" title="{#edit#}">
<strong>{$import.name|escape|stripslashes}</strong>
</a>
</td>
<td align="center">{$import.rub_title|escape|stripslashes}</td>
<td align="center">{$import.parser|escape|stripslashes}</td>
<td align="center" class="date_text nowrap">{$import.time_edited|date_format:$TIME_FORMAT|pretty_date}</td>
<td align="center" class="date_text nowrap">{if $import.time_run}{$import.time_run|date_format:$TIME_FORMAT|pretty_date}{/if}</td>
<td align="center">
<a class="topDir icon_sprite ico_start" title="{#run#}" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=run&amp;import_id={$import.id}&amp;cp={$sess}"></a>
</td>
<td align="center">
<a class="topDir icon_sprite ico_edit" title="{#edit#}" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=edit&amp;import_id={$import.id}&amp;cp={$sess}"></a>
</td>
<td align="center">
<a class="topDir icon_sprite ico_copy" title="{#copy#}" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=copy&amp;import_id={$import.id}&amp;cp={$sess}"></a>
</td>
<td align="center">
<a class="topleftDir icon_sprite ico_delete ConfirmDelete" dir="{#delete_t#}" name="{#delete_m#}" title="{#delete#}" href="index.php?do=modules&amp;action=modedit&amp;mod=import&amp;moduleaction=delete&amp;import_id={$import.id}&amp;cp={$sess}"></a>
</td>
</tr>
{/foreach}
</tbody>
</table>
{if !$imports}
<div class="rowElem">
<ul class="messages">
<li class="highlight yellow">{#noimports#}</li>
</ul>
</div>
{/if}
</div>
{if $page_nav}
<div class="pagination">
<ul class="pages">
{$page_nav}
</ul>
</div>
{/if}

4
templates/index.php Normal file
View File

@@ -0,0 +1,4 @@
<?php
header('Location:/');
exit;
?>