wp_back/wp-content/plugins/smart-slider-3/Nextend/SmartSlider3/Install/Tables.php
2024-05-20 15:37:46 +03:00

284 lines
11 KiB
PHP

<?php
namespace Nextend\SmartSlider3\Install;
use Nextend\Framework\Database\Database;
use Nextend\Framework\Notification\Notification;
class Tables {
protected $tables = array(
'nextend2_image_storage' => "(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`hash` VARCHAR(32) NOT NULL,
`image` TEXT NOT NULL,
`value` MEDIUMTEXT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `hash` (`hash`)
)",
'nextend2_section_storage' => "(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`application` VARCHAR(20) NOT NULL,
`section` VARCHAR(128) NOT NULL,
`referencekey` VARCHAR(128) DEFAULT '',
`value` MEDIUMTEXT NOT NULL,
`isSystem` INT(11) NOT NULL DEFAULT '0',
`editable` INT(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `application` (`application`, `section`(50), `referencekey`(50)),
KEY `application_2` (`application`, `section`(50)),
INDEX (`isSystem`),
INDEX (`editable`)
)
AUTO_INCREMENT = 10000",
'nextend2_smartslider3_generators' => "(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`group` VARCHAR(254) NOT NULL,
`type` VARCHAR(254) NOT NULL,
`params` TEXT NOT NULL,
PRIMARY KEY (`id`)
)",
'nextend2_smartslider3_sliders' => "(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`alias` TEXT NULL DEFAULT NULL,
`title` TEXT NOT NULL,
`type` VARCHAR(30) NOT NULL,
`params` MEDIUMTEXT NOT NULL,
`slider_status` VARCHAR(50) NOT NULL DEFAULT 'published',
`time` DATETIME NOT NULL,
`thumbnail` TEXT NOT NULL,
`ordering` INT NOT NULL DEFAULT '0',
INDEX (`slider_status`),
INDEX (`time`),
PRIMARY KEY (`id`)
)",
'nextend2_smartslider3_sliders_xref' => "(
`group_id` int(11) NOT NULL,
`slider_id` int(11) NOT NULL,
`ordering` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`group_id`,`slider_id`),
INDEX (`ordering`)
)",
'nextend2_smartslider3_slides' => "(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`title` TEXT NOT NULL,
`slider` INT(11) NOT NULL,
`publish_up` DATETIME NOT NULL default '1970-01-01 00:00:00',
`publish_down` DATETIME NOT NULL default '1970-01-01 00:00:00',
`published` TINYINT(1) NOT NULL,
`first` INT(11) NOT NULL,
`slide` LONGTEXT,
`description` TEXT NOT NULL,
`thumbnail` TEXT NOT NULL,
`params` TEXT NOT NULL,
`ordering` INT(11) NOT NULL,
`generator_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`published`),
INDEX (`publish_up`),
INDEX (`publish_down`),
INDEX (`generator_id`),
KEY `thumbnail` (`thumbnail`(100)),
INDEX (`ordering`),
INDEX (`slider`)
)"
);
public function install() {
foreach ($this->tables as $tableName => $structure) {
$this->installTable($tableName, $structure);
}
self::dropIndex('#__nextend2_section_storage', 'system');
$this->renameColumn('#__nextend2_section_storage', 'system', 'isSystem', 'INT(11) NOT NULL DEFAULT \'0\'');
self::dropIndex('#__nextend2_section_storage', 'application');
self::dropIndex('#__nextend2_section_storage', 'application_2');
$this->fixColumn('#__nextend2_section_storage', 'section', 'VARCHAR(128)', 'NOT NULL');
$this->fixColumn('#__nextend2_section_storage', 'referencekey', 'VARCHAR(128)', 'NOT NULL');
$this->query("ALTER TABLE `#__nextend2_section_storage` ADD INDEX `application` (`application`, `section`(50), `referencekey`(50))");
$this->query("ALTER TABLE `#__nextend2_section_storage` ADD INDEX `application_2` (`application`, `section`(50))");
self::fixIndex('#__nextend2_section_storage', 'isSystem');
self::fixIndex('#__nextend2_section_storage', 'editable');
$this->fixColumn('#__nextend2_smartslider3_sliders', 'ordering', 'INT', 'NOT NULL DEFAULT \'0\'');
self::dropIndex('#__nextend2_smartslider3_sliders', 'status');
$this->renameColumn('#__nextend2_smartslider3_sliders', 'status', 'slider_status', 'VARCHAR(50) NOT NULL DEFAULT \'published\'');
$this->fixColumn('#__nextend2_smartslider3_sliders', 'title', 'TEXT', 'NOT NULL');
$this->fixColumn('#__nextend2_smartslider3_sliders', 'alias', 'TEXT', 'NULL DEFAULT NULL');
$this->fixColumn('#__nextend2_smartslider3_sliders', 'thumbnail', 'TEXT', 'NOT NULL');
$this->fixColumn('#__nextend2_smartslider3_slides', 'title', 'TEXT');
$this->fixColumn('#__nextend2_smartslider3_slides', 'thumbnail', 'TEXT');
$this->fixColumn('#__nextend2_smartslider3_slides', 'publish_up', 'DATETIME', 'NOT NULL DEFAULT \'1970-01-01 00:00:00\'');
$this->fixColumn('#__nextend2_smartslider3_slides', 'publish_down', 'DATETIME', 'NOT NULL DEFAULT \'1970-01-01 00:00:00\'');
self::fixIndex('#__nextend2_smartslider3_sliders', 'slider_status');
self::fixIndex('#__nextend2_smartslider3_sliders', 'time');
self::fixIndex('#__nextend2_smartslider3_sliders_xref', 'ordering');
$this->query("DELETE FROM `#__nextend2_section_storage` WHERE `application` LIKE 'smartslider' AND `section` LIKE 'sliderChanged'");
self::fixIndex('#__nextend2_smartslider3_slides', 'published');
self::fixIndex('#__nextend2_smartslider3_slides', 'publish_up');
self::fixIndex('#__nextend2_smartslider3_slides', 'publish_down');
self::fixIndex('#__nextend2_smartslider3_slides', 'generator_id');
self::dropIndex('#__nextend2_smartslider3_slides', 'thumbnail');
self::fixIndex('#__nextend2_smartslider3_slides', 'thumbnail', 100);
self::fixIndex('#__nextend2_smartslider3_slides', 'ordering');
self::fixIndex('#__nextend2_smartslider3_slides', 'slider');
if (Notification::hasErrors()) {
Notification::displayPlainErrors();
exit;
}
}
private function installTable($tableName, $structure) {
$query = 'CREATE TABLE IF NOT EXISTS `' . Database::getPrefix() . $tableName . '` ';
$query .= $structure;
$query .= ' ' . Database::getCharsetCollate();
$this->query($query);
}
private function query($query) {
Database::query(Database::parsePrefix($query));
}
private function hasColumn($table, $col) {
return !!Database::queryRow(Database::parsePrefix("SHOW COLUMNS FROM `" . $table . "` LIKE '" . $col . "'"));
}
public static function repair() {
self::fixPrimaryKey('#__nextend2_section_storage', 'id', true);
self::fixPrimaryKey('#__nextend2_image_storage', 'id', true);
self::fixPrimaryKey('#__nextend2_smartslider3_generators', 'id', true);
self::fixPrimaryKey('#__nextend2_smartslider3_sliders', 'id', true);
self::fixPrimaryKey('#__nextend2_smartslider3_slides', 'id', true);
self::fixPrimaryKey('#__nextend2_smartslider3_sliders_xref', array(
'slider_id',
'group_id'
));
}
public function reindexOrders() {
$query = "SELECT
sliders.*
FROM
`#__nextend2_smartslider3_sliders` AS sliders
LEFT JOIN `#__nextend2_smartslider3_sliders_xref` AS xref
ON
xref.slider_id = sliders.id
WHERE
(
xref.group_id IS NULL OR xref.group_id = 0
)
ORDER BY ordering";
$sliders = Database::queryAll(Database::parsePrefix($query));
foreach ($sliders as $idx => $slider) {
$this->query("UPDATE `#__nextend2_smartslider3_sliders` SET `ordering` = '" . $idx . "' WHERE `id` = " . $slider['id'] . " ");
}
}
/**
* @param string $tableName
* @param array|string $colNames
* @param bool $autoIncrement
*/
private static function fixPrimaryKey($tableName, $colNames, $autoIncrement = false) {
if (!is_array($colNames)) {
$colNames = array($colNames);
}
$tableName = Database::parsePrefix($tableName);
Database::query('DELETE FROM ' . $tableName . ' WHERE ' . $colNames[0] . ' = 0;');
$hasIndex = Database::queryRow("SHOW INDEXES FROM " . $tableName . " WHERE Key_name = 'PRIMARY'");
if (!$hasIndex) {
Database::query('ALTER TABLE ' . $tableName . ' ADD PRIMARY KEY(' . implode(', ', $colNames) . ');');
}
if (count($colNames) == 1 && $autoIncrement) {
Database::query('ALTER TABLE ' . $tableName . ' MODIFY `' . $colNames[0] . '` INT NOT NULL AUTO_INCREMENT;');
}
}
private static function fixIndex($tableName, $colName, $limit = null) {
$tableName = Database::parsePrefix($tableName);
if (!self::hasIndex($tableName, $colName)) {
Database::query("ALTER TABLE " . $tableName . " ADD INDEX `" . $colName . "` (`" . $colName . "`" . (isset($limit) ? '(' . $limit . ')' : '') . ")");
}
}
private static function dropIndex($tableName, $colName) {
$tableName = Database::parsePrefix($tableName);
if (self::hasIndex($tableName, $colName)) {
Database::query("ALTER TABLE " . $tableName . " DROP INDEX `" . $colName . "`");
}
}
private static function hasIndex($tableName, $colName) {
return Database::queryRow("SHOW INDEXES FROM " . $tableName . " WHERE Key_name = '" . $colName . "'");
}
private static function fixType($tableName, $colName, $type, $default = '') {
$tableName = Database::parsePrefix($tableName);
$column = Database::queryRow(Database::parsePrefix("SHOW COLUMNS FROM " . $tableName . " LIKE '" . $colName . "'"));
if ($column['Type'] != $type) {
Database::query("ALTER TABLE " . $tableName . " MODIFY `" . $colName . "` " . $type . " " . $default);
}
}
//Create column if doesn't exists. If column exists, fix its type.
private function fixColumn($tableName, $colName, $type, $default = '') {
if (!$this->hasColumn($tableName, $colName)) {
$this->query("ALTER TABLE " . $tableName . " ADD `" . $colName . "` " . $type . " " . $default);
} else {
self::fixType($tableName, $colName, $type, $default);
}
}
private function renameColumn($tableName, $colFrom, $colTo, $typeAndDefault) {
if (!$this->hasColumn($tableName, $colTo)) {
if ($this->hasColumn($tableName, $colFrom)) {
$this->query("ALTER TABLE " . $tableName . " CHANGE `" . $colFrom . "` `" . $colTo . "` " . $typeAndDefault);
} else {
$this->query("ALTER TABLE " . $tableName . " ADD `" . $colTo . "` " . $typeAndDefault);
}
}
}
}