Правильный способ модификации 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, т.к. первый не требует указывать название поля два раза.