Правильный способ модификации enum в плагинах.
Проблема заключается в том, что некоторые плагины заменяют поле target_type таблицы comment, тем самым создавая свои новые типы комментариев, но затирая при этом уже добавленные. Разработчики упрощают себе жизнь, ограничиваясь строкой в dump.sql (пример из плагина «компании»)
В список риска попадает практически всё, где используется target_type enum: favourite, vote, comment_online.
При установки нескольких таких плагинов начинается бардак. Такие недоработки я заметил в следующих плагинах: «Компании», «Объявления», «Вопросы и ответы», «Места и события». Так делать нельзя. Программист разберется и исправит ошибку, но что делать обычным людям, далеким от php и sql, которые просто используют движок и несколько таких плагинов?
Тру кодером оказался Алексей Волков, разработчик «Комментариев для статических страниц». При установке плагина он в функции Activate проверяет target_type и добавляет новое поле только если его там нет, сохраняя при этом его старое содержимое. Не спросясь разрешения Алексея (надеюсь он меня простит — за правое дело радею) выкладываю часть кода, отвечающего за это.
Уважаемые разработчики, не поленитесь обновить свои плагины и внести изменения.
Хотел опубликовать в тематическом блоге, например в «Дополнительные модули и доработки для LiveStreet», но видимо не хватает кармы, это мой первый пост/комментарий вообще на livestreet.ru
PS. в sql запросах типа ALTER проще использовать MODIFY вместо CHANGE, т.к. первый не требует указывать название поля два раза.
ALTER TABLE `prefix_comment`
MODIFY target_type enum('topic','talk','company','clan')
DEFAULT 'topic';
В список риска попадает практически всё, где используется target_type enum: favourite, vote, comment_online.
При установки нескольких таких плагинов начинается бардак. Такие недоработки я заметил в следующих плагинах: «Компании», «Объявления», «Вопросы и ответы», «Места и события». Так делать нельзя. Программист разберется и исправит ошибку, но что делать обычным людям, далеким от php и sql, которые просто используют движок и несколько таких плагинов?
Тру кодером оказался Алексей Волков, разработчик «Комментариев для статических страниц». При установке плагина он в функции Activate проверяет target_type и добавляет новое поле только если его там нет, сохраняя при этом его старое содержимое. Не спросясь разрешения Алексея (надеюсь он меня простит — за правое дело радею) выкладываю часть кода, отвечающего за это.
$oDb = $this->Database_GetConnect();
$sql = 'SHOW COLUMNS FROM `'.Config::Get('db.table.comment').'`';
$aRows = $oDb->select($sql);
foreach ($aRows as $aRow) {
if ($aRow['Field'] == 'target_type') break;
}
if (strpos($aRow['Type'], "'page'") === FALSE)
{
// - Вносим изменение в поле target_type в таблице prefix_comment
$aRow['Type'] =str_ireplace('enum(', "enum('page',", $aRow['Type']);
$sql = "ALTER TABLE `".Config::Get('db.table.comment')."`
CHANGE `target_type` `target_type` " . $aRow['Type'] . "
NOT NULL DEFAULT 'topic'";
$oDb->query($sql);
}
Уважаемые разработчики, не поленитесь обновить свои плагины и внести изменения.
Хотел опубликовать в тематическом блоге, например в «Дополнительные модули и доработки для LiveStreet», но видимо не хватает кармы, это мой первый пост/комментарий вообще на livestreet.ru
PS. в sql запросах типа ALTER проще использовать MODIFY вместо CHANGE, т.к. первый не требует указывать название поля два раза.
16 комментариев
еще, бы хорошо было бы чтобы использовали конструкцию типа для подключения блоков в слайдбар, ибо при установке нескольких плагинов пересекающиеся блоки могут затираться
А вот слияние массивов блоков — я видел у тебя в адюнитах, когда разбирался с плагинами. Понравилось, использую.
лучше это делать из консоли.
а медленно из-за innodb, подозревается
Тут либо вы цифру потолочную назвали. Либо очень плохо настроена СУБД для работы с InnoDB
есть кстати какие мануалы по настройке мускуля под innodb проверенные?
спидовmysqltuner.pl