284 lines
11 KiB
PHP
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|