Тема: Дополнительные поля в формате MySQL
Проблема с дополнительными полями в формате MySQL для Strawberry 1.1.1 решена раз и навсегда!
Версии Strawberry 1.1.1 по наследству от CuteNews досталась одна неудобная штука, а именно - работа с дополнительными полями в формате текстовых файлов. Усугубляет ситуацию и неразбериха с названиями, поскольку под термином «дополнительные поля» подразумеваются две совершенно разные вещи:
1. Плагин xfileds, реализующий дополнительные поля для новостей.
2. Набор дополнительных данных для плагинов Template for alone news, Format Switcher, Enable/Disable Comments и Disable All Comments (будем называть их «плагинами форматирования»).
При том, что в процессе своего развития Strawberry получила возможность работать с базами данных в формате MySQL, такие полезные вещи, как дополнительные поля (в обеих ипостасях) остались текстовыми. Следовательно, скорость и надёжность движка остались зависимыми от «скорости» и «надёжности» обработки текстовых файлов на сервере.
...Есть такой термин – «пароход с кирпичной трубой»...
Обратите внимание, в папке data находятся файлы:
xfields.txt - формат дополнительных полей (для плагина xfields) в виде:
field_name|Имя_поля_по_русски||Формат_поля||признак_обязательности_заполненияxfields-data.txt - данные дополнительных полей (для плагина xfields) в виде:
id_номер_новости|>|field_name_1|Данные_поля_1||field_name_2|Данные_поля_2||field_name_3|Данные_поля_3
…xfields-data.php - дополнительные данные для «плагинов форматирования» в виде:
<?
$array = array (
id_номер_новости =>
array (
'comments' => 'on',
'commentsstop' => 'no',
'template' => 'Default',
'fs_format' => 'html_with_br',
'pinged' => '',
),
…
);
?>Предпринималось много попыток устранить эту неприятность. Например:
- Miksar работает над своей веткой Strawberry: http://strawberry.goodgirl.ru/forum/topic/3446/
Но (по крайней мере, на момент написания этой статьи) в его версии проблема решена только для «плагинов форматирования». Плагин xfields пока остаётся в забвении.
- UltraPixel решил задачу для частного случая – 4 фиксированных дополнительных поля в таблице новостей: http://strawberry.goodgirl.ru/forum/topic/3591/
Я решил пойти по другому пути.
1. Собрал воедино все дополнительные поля и создал для них таблицу cute_xfields_data в формате:
array(
//Номер новости
'id' => array(
'type' => 'int',
'auto_increment' => 0,
'primary' => 1
),
//Данные доп.полей для плагина xfileds
'data' => array('type' => 'text'),
//Данные для «плагинов форматирования»
'comments' => array('type' => 'string'),
'commentsstop' => array('type' => 'string'),
'template' => array('type' => 'string'),
'fs_format' => array('type' => 'string'),
'pinged' => array('type' => 'string')
)
В поле data данные будут храниться в виде строк, то есть так же, как в файле xfields-data.txt (всё-таки не я автор плагина xfileds, увы!). Сами форматы дополнительных полей (то есть – содержимое файла xfields.txt) оставил в текстовом файле. Как правило, типов дополнительных полей немного (UltraPixel, например, обошёлся четырьмя, мне обычно хватает двух-трёх) и они редко редактируются, поэтому держать для них целую таблицу в MySQL с лишним запросом показалось мне расточительным.
Остальные поля таблицы соответствуют своему содержанию.
2. Внёс изменения в плагин xfileds, а именно – в файлы plugins/xfileds.php и plugins/xfileds/core.php, заменив в них чтение/запись в файлы чтением/записью в базу данных. При этом, скрипт core.php при первом запуске проверяет в базе данных наличие таблицы cute_xfields_data и при необходимости создает её.
Задача с плагином xfileds решена!
3. Внёс изменения в файл inc/plugins.inc.php, заменив в нём чтение/запись в файлы чтением/записью в базу данных.
Задача с «плагинами форматирования» решена!
4. Внёс изменения в файл inc/mod/editnews.mdu, а именно – предусмотрел удаление соответствующей записи из таблицы cute_xfields_data при удалении самой новости. Для тех, кому интересно, а особенно для тех, кто уже переделывал свой editnews.mdu, привожу фрагмент кода (изменения выделены комментариями):
foreach ($query as $row){
if ($righ_have){
$sql->delete(array(
'table' => 'news',
'where' => array("id = $row[id]"),
));
$sql->delete(array(
'table' => 'comments',
'where' => array("post_id = $row[id]"),
));
$sql->delete(array(
'table' => 'story',
'where' => array("post_id = $row[id]"),
));
//Вот это добавляем в editnes.mdu
$sql->delete(array(
'table' => 'xfields_data',
'where' => array("id = $row[id]"),
));
//Конец добавления
$moved_news++;
}
}Задача с удалением мусора решена!
5. Внёс изменения в файл inc/db/database.inc.php, предусмотрев автоматическое создание таблицы cute_xfields_data при инсталляции Strawberry 1.1.1.
Задача с инсталляцией Strawberry решена!
ИТОГО: ЗАДАЧА ПОЛНОСТЬЮ РЕШЕНА!
Все изменённые файлы прилагаю в архиве. Нужно ими заменить одноимённые файлы в вашем движке. Там же есть описание этого всего.
Преимущества моего подхода.
Коллеги, извините за критику, она призвана породить истину!
1. База данных (в её привычном понимании) остаётся нетронутой, к ней просто добавляется новая таблица. Например, Miksar и UltraPixel вносят изменения в таблицы cute_news и cute_story, эти изменения непростительно увеличивают размеры основных таблиц:
- По методу UltraPixel’а при добавлении четырех доп.полей в таблицу cute_news, мы увеличиваем её пропорционально количеству строк. То есть для таблицы в 1000 строк появится 4000 лишних полей, которые, мягко говоря, не все и не всегда будут заняты!
- Miksar’а не трогаю
, так как он позиционирует свою версию как «отдельную ветку». Хотя у него в таблицах cute_news и cute_story тоже появляется много не всегда используемых полей (их там на порядок выше, чем у предыдущего автора).
Моя же таблица cute_xfields_data является динамической, то есть в ней столько строк, сколько в основной базе новостей с «нестандартным» форматом. Вы согласны, что их обычно немного? Например, если для новости N вы не запрещаете/не останавливаете комментарии, не задаёте формат вывода, отличный от «HTML с переносом строк» (или какой у вас там по умолчанию), не заполняете ни одного дополнительного поля, не задаёте принудительный шаблон вывода и т.д., то в таблице cute_xfields_data новой записи не появится.
2. Плагины Template for alone news, Format Switcher, Enable/Disable Comments, Disable All Comments остаются нетронутыми, задача решена небольшими изменениями обслуживающего их файла plugins.inc.php. Следовательно, соблюдены права авторов этих плагинов и исключена возможность появления ошибок при их работе.
3. От моего метода всегда можно безболезненно отказаться, вернув старые файлы на место, и удалив в базе данных всего одну таблицу. В остальных таблицах мусора не остаётся.
4. И главное: система продолжает называться Strawberry 1.1.1, и не только называется, но и остаётся ею! Все изменения никак не влияют на совместимость с более ранними версиями движка, версиями плагинов, модов и прочих полезностей. Вам не придётся заново колдовать над правами папок и файлов, оформлением, прикручиванием WYSIWYG, внедрением этого всего в уже готовые сайты, и прочими - такими выстраданными вещами.
В чём же подвох? Всегда есть подвохи!
1. Если будете вносить изменения в уже установленный движок копированием изменённых файлов, до первого действия с плагином xfields админцентр будет выдавать предупреждение об ошибке (хотя система будет продолжать исправно работать). Не пугайтесь! Первая же созданная или отредактированная новость устранит ошибку. А вот новая инсталляция вообще не выдаст никакой ошибки.
2. Проблема с переносом данных из файлов xfields-data.txt и xfields-data.php не решена! В уже установленном движке придется вносить в таблицу cute_xfields_data содержимое этих файлов. Если для «плагинов форматирования» это проблема небольшая, то вводить данные для сотен или даже тысяч дополнительных полей – это катастрофа. Однако, если вы разбираетесь в PHP, можете сами написать простой скрипт, который преобразует данные из этих файлов в CSV-файл. Этот файл можно будет импортировать в базу данных при помощи phpMyAdmin. В принципе, это очень просто сделать и вручную, ниже* показываю как.
3. Да, чуть не забыл! Естественно, для txtSQL-версии мои изменения не работают и вообще отрубают все перечисленные плагины. Но эти изменения там и не нужны, тексты - есть тексты. Когда буду делать новую сборку дистрибутива Strawberry 1.1.1 (coming soon, может быть изменю номер версии, чтобы обойтись без «Assembled by ANT-Soft»), предусмотрю выбор/отмену выбора изменённых модулей, в зависимости от типа установки - txtSQL или MySQL.
* Теперь обещанное:
Пример ручного переноса данных из файла в базу данных.
Это можно сделать в любом текстовом редакторе, даже в Блокноте, а лучше в AkelPad. Если сразу переименовать расширение файла в .csv, то подойдёт даже Microsoft Excel:
Было xfields-data.txt:
140|>|author|О.Валькова||source|http://www.admrad.ru/default.php?id=6300&category=1
159|>|author|Туринфо||source|http://www.tourinfo.ru/news/20865/
166|>|author|Travel.ru||source|http://www.travel.ru/news/2006/10/10/94843.html
167|>|author|tourprom.ru||source|http://www.tourprom.ru/news.aspx?id=6009
171|>|author|Александр Гордиец||source|http://www.tourprom.ru/news.aspx?id=6011
...Стало xfields-data.csv:
140;140|>|author|О.Валькова||source|http://www.admrad.ru/default.php?id=6300&category=1;;;;;
159;159|>|author|Туринфо||source|http://www.tourinfo.ru/news/20865/;;;;;
166;166|>|author|Travel.ru||source|http://www.travel.ru/news/2006/10/10/94843.html;;;;;
167;167|>|author|tourprom.ru||source|http://www.tourprom.ru/news.aspx?id=6009;;;;;
171;171|>|author|Александр Гордиец||source|http://www.tourprom.ru/news.aspx?id=6011;;;;;
...То есть, добавляем перед каждой строкой id_номер_новости; (с точкой с запятой) и в конце каждой строки - ;;;;; (пять знаков «точка с запятой»).
Отсутствие в таблице данных из файла xfields-data.php – проблема небольшая. Если хотите, можете сразу вписать соответствующие данные из файла xfields-data.php между пустыми точками с запятой:
171;171|>|author|Александр Гордиец||source|http://www.tourprom.ru/news.aspx?id=6011;on;no;Default;html_with_br;А в Microsoft Escel ещё проще: нужно просто вставить новую колонку левее первой колонки таблицы и скопировать в неё все id-номера из соседних ячеек, даже точки с запятой расставлять не нужно. А потом сохранить файл как «CSV с разделителями».
Что ещё важно?
- Если у вас БД в формате «UTF-8», не забудьте изменить формат файла .csv на «UTF-8» (например в AkelPad).
- Если у вас в полях данных есть тексты с кавычками, не забудьте экранировать кавычки. То есть - замените в файле все знаки " на \"
Теперь можно экспортировать файл .csv в таблицу cute_xfields_data при помощи phpMyAdmin, как CSV. Там вроде бы всё по умолчанию.
Спасибо за внимание!