Тема: Дополнительные поля в формате 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’а не трогаю wink, так как он позиционирует свою версию как «отдельную ветку». Хотя у него в таблицах 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. Там вроде бы всё по умолчанию.

Спасибо за внимание!

Post's attachments

xfields-mysql-antsoft.zip 31.79 kb, 246 downloads since 2009-10-20 

xfields-mysql-antsoft.zip 31.79 kb, 5 downloads since 2009-10-20 

Re: Дополнительные поля в формате MySQL

Бодрячком!
Спасибо, что не трогаете, но совершенно зря wink

Хотя у него в таблицах cute_news и cute_story

Если копнуть - то при включении плагина рейтинга в указанные таблицы добавляется еще одно поле.
Я подумал - зачем делать плагину лишний раз какие-то проверки? И вношу в эти таблицы предполагаемые поля с настройками - будь то шаблон или тип поста, которые пишутся в текстовые файлы (и которые могут обнулиться!).

В ОТНОШЕНИИ ДОП ПОЛЕЙ - я экспериментирую. и для доп полей тоже будет одна таблица (точнее уже). Эту таблицу можно будет использовать повсеместно - в любом модуле (допустим новости или это список пользователей(точнее конкретная инфа о каждом - ставка на то, что пользователь сам выберет себе нужное количество с нужным содержанием)).

Да и я не позиционирую как отдельную ветку. Я позиционировал как продолжение развития.
И я был бы не против, если кто-то из старой гвардии присоединится ко мне в этом деле. Т.к. Алексей уже не собирается заниматься обновлением, то я думал что никто не собирается smile

А вообще изменения порадовали smile Подумаю о использовании в сборке 1.2 (чтоб от новой сборки 1.1.1 что-то было wink )

11 минут и 44 секунды спустя:

Хотя идея создать таблицу настроек для новости с тем же числом строк что и "нестандартных" новостей интересная. Поэтому я её начал использовать с самого начала для доп полей.

А вобще у меня идея объединить таблицы _news и _story - Тогда в место _story можно сделать таблицу с настройками новости и подключать её сложным запросом.
Однако при добавлении "нестандартной" новости будет уже 2 запроса.
Тут я еще подумаю... И скорее всего это будет в версии 1.3

И намного ли изменения в базе вносят увеличение базы? Поля то если пустые, то особо много места и не занимают.
Однако при использовании доп таблицы это не внесет ли такой же эффект?
типа как (2+3) и (2) + (3) ? (я согласен что при не использовании настроек выгода очевидна, но как подойти к золотой середине?)

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Miksar пишет:

при включении плагина рейтинга в указанные таблицы добавляется еще одно поле

И плагина кейвордс и многих других... Ну что же поделать, если авторы плагинов так распорядились? У меня нет цели (времени, возможности, желания...) радикально переделывать уже готовые плагины, или создавать новые аналогичные. Задача была тривиальная - полностью избавиться от текстовых файлов, а они остались только в доп.полях и "плагинах форматирования".

Miksar пишет:

В ОТНОШЕНИИ ДОП ПОЛЕЙ - я экспериментирую. и для доп полей тоже будет одна таблица

Ваш подход к доп.полям мне нравится тем, что их можно создавать динамически для каждой отдельной новости. Вот бы их ещё засунуть в MySQL! Однако, что делать, если пользователю всё-таки нужны "сквозные" доп.поля (по задумке автора плагина xfileds), допустим как в моём примере выше: "автор" и "источник публикации"? Для каждой новости каждый раз задавать имена полей и заполнять их? Хорошо бы, если бы было два типа доп.полей - "сквозные" (для всех новостей) и "индивидуальные" (для каждой новости). И совсем фантастика - "сквозные" дополнительные поля для категорий!

...Но это уже скорее ближе к теме форума, где обсуждаются ваши разработки.

Miksar пишет:

объединить таблицы _news и _story

Они разделены не случайно. В cute_news хранятся данные, которые могут быть использованы не только для вывода новостей, но также и для формирования архивов; списков - категорий, заголовков, комментариев, ключевых слов, рейтингов...; календаря и п.х. Если в этой же таблице будут ещё и сами тексты новостей, то она заметно утяжелится. Хотя проблемы с нагрузкой на MySQL-серверы - не наша забота, но их тоже нужно пожалеть. А помните, сколько в этом форуме обсуждалось проблем с претензиями хостеров на перегрузку MySQL-серверов???

Короче, много таблиц - это не всегда плохо. Считаю, что отдельные таблицы news и story - это выгоднейшее отличие Strawberry от, например, той же Joomla, где всё свалено в "братскую могилу".

Miksar пишет:

я согласен что при не использовании настроек выгода очевидна

Повторю свой же вопрос из предыдущего поста: а большой ли процент новостей использует доп.поля и нестандартные параметры форматирования? В общей массе таких новостей очень немного, следовательно отдельную таблицу иметь всё же выгоднее.

Miksar пишет:

как подойти к золотой середине?

Только методом проб и ошибок! Вы движетесь в правильном направлении! Только желательно, чтобы ваши пробы и ошибки как можно меньше отражались на пользователях вашего продукта, а то они сойдут с дистанции.

N.B. Но всё же о версии 1.3. говорить пока рано, вам не кажется? Ведь пока не существует даже финального релиза версии 1.2, не говоря уже о 1.2.1, 1.2.2, и т.д.

Я например считаю, что версия 1.1.1 за 3 года существования себя не только не исчерпала, но и вряд ли исчерпает в ближайшее время. Мало того, думаю, что она только-только приблизилась к нормальному рабочему состоянию. А возможность работать с базами в формате txtSQL (и вы и Лёха, увы, отказались от этого), принесёт ей гораздо больше преданных поклонников, чем регулярный выпуск новых версий одного и того же продукта, к тому же - несовместимых (или малосовместимых) с предыдущими версиями. А к чему мы, - разработчики бесплатного софта, должны ещё стремиться, как не к увеличению количества благодарных потребителей наших продуктов? Это и есть искомая "золотая середина"!

Re: Дополнительные поля в формате MySQL

ANT-Soft пишет:

Задача была тривиальная - полностью избавиться от текстовых файлов, а они остались только в доп.полях и "плагинах форматирования".

Вот эти плагины форматирования я и исключил из текста.
А еще есть всякие плагины замены слов...

ANT-Soft пишет:

Ваш подход к доп.полям мне нравится тем, что их можно создавать динамически для каждой отдельной новости. Вот бы их ещё засунуть в MySQL!

Не понял. они в MySQL с первого дня их проектирования мной. И я учел лень пользователей обзывать каждый раз поля. В настройках мы можем задать имена для указанного n-числа полей названия по умолчанию (только для новостей, для остального придется что-то придумать).

ANT-Soft пишет:

И совсем фантастика - "сквозные" дополнительные поля для категорий!

Нескромный вопрос - зачем? smile

ANT-Soft пишет:

Они разделены не случайно.

Хорошо, будем считать, что вы меня убедили. однако двойной(сложный) запрос как себя ведет по отношению к одному(пусть и объемному)?


ANT-Soft пишет:

N.B. Но всё же о версии 1.3. говорить пока рано, вам не кажется? Ведь пока не существует даже финального релиза версии 1.2, не говоря уже о 1.2.1, 1.2.2, и т.д.

я и не говорю - я упоминаю и делюсь идеями. В версии 1.2 уже введен новый класс MySQL с более простым и понятным синтаксисом. И вот полностью переписанная strawberry в планах станет 1.3. Хотя можно сделать и 1.2.5 wink

ANT-Soft пишет:

Я например считаю, что версия 1.1.1 за 3 года существования себя не только не исчерпала, но и вряд ли исчерпает в ближайшее время. Мало того, думаю, что она только-только приблизилась к нормальному рабочему состоянию. А возможность работать с базами в формате txtSQL (и вы и Лёха, увы, отказались от этого), принесёт ей гораздо больше преданных поклонников, чем регулярный выпуск новых версий одного и того же продукта, к тому же - несовместимых (или малосовместимых) с предыдущими версиями.

Я не говорю что текстовая база - плохо. Но сколько происходит крушений баз? Т.е. это не панацея от отсутствия базы MySQL на сервере. Либо нужно подвергнуть большей модернизации сам движок txtSQL!

По поводу совместимости - уже есть конвертор баз. только с CuteNewsRu могут быть проблемы, т.к. я её особо и не изучал sad Но если найдутся тестеры - я буду рад smile

А насчет популярности - я согласен. Даже наши зарубежные пользователи CuteNews уже заинтересованы в версии 1.2. Просят перевод smile К сожалению, больше чем переводчик гугла я им предложить на данный момент не могу...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Miksar пишет:

Не понял. они в MySQL с первого дня их проектирования мной.

Извиняюсь, наверное не увидел. На вашей демо-площадке в списке плагинов есть плагин:

XFields | 1.0 | Дополнительные поля. | SMKiller2

я решил, что это единственная возможность работы с доп.полями. Они у вас не в отдельном плагине?

Miksar пишет:

Нескромный вопрос - зачем?

Ну например:

- в категории "Новости" доп.поля: "Источник публикации" и "Автор"

- в категории "Законодательная база" доп.поля: "Орган" (чей документ: Президент, Дума и т.п.) и "Тип" (селектор: постановление, распоряжение, указ)

и тому подобное. Эти доп.поля нужны всегда, но только в пределах своих категорий: "Новостям" не нужен "Тип", "Документам" не нужен "Автор".

Со всем остальным согласен, просто высказывал свои соображения.

Что-то мы далеко заехали за пределы темы "Дополнительные поля в формате MySQL".

Re: Дополнительные поля в формате MySQL

Они у меня не плагином - а встроенные. А плагин старый это, тем более автор, как видно, не я.
Из этого следует, что не все посмотрели сборку 1.2, поэтому складываются ошибочные мнения...

На счет категорий понял - т.е. каждой категории свой набор полей.
Мне показалось, что для самой категории (типа как доп описание) нужны поля smile

Я тоже высказываю. От таких высказываний (даже философствований) рождаются хорошие идеи. Это называется "мозговой штурм" smile

Но не за пределы форума - уже хорошо big_smile

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Помогите плиз, с нуля ставлю Strawberry, где  в дистрибе уже измененные файлы из архива "Дополнительные поля в формате MySQL@? на третьем этапе, после ввода пароленй, логинов, адресов и имен базы MySQL - ошибка:

Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /www/funservi/www/htdocs/fun-market/adm/inc/db/database.inc.php  on line 10

В чем может быть ошибка?

PS если заменять database.inc.php "родным"  файлом, не из архива - все нормально вроде, ошибка тока выдается Warning: Invalid argument supplied for foreach() in /www/funservi/www/htdocs/fun-market/adm/plugins/xfields.php  on line 57, но это до первого заполнения поял xfield

Отредактировано yukon (17 Apr 2010 19:21:32)

Re: Дополнительные поля в формате MySQL

Сначала установите оригинальную стравбери, а потом уже меняйте файлы...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

то есть

5. Внёс изменения в файл inc/db/database.inc.php, предусмотрев автоматическое создание таблицы cute_xfields_data при инсталляции Strawberry 1.1.1.

Задача с инсталляцией Strawberry решена!

как бы не работает?

Re: Дополнительные поля в формате MySQL

Гм. Ждем автора.

Я бы советовал после инсталляции делать это все...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

11

Re: Дополнительные поля в формате MySQL

А есть ли подобное решение для плагина Meta-Tags? Там тоже данные в файл пишутся, а лучше было бы в БД. Тем более, это один из самых полезных плагинов.

Re: Дополнительные поля в формате MySQL

Поковыряйте версию strawberry 1.2. Там это реализовано.

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

ANT-Soft, файл database.inc.php 9 строчка. Вы забыли закрыть скобку ),

1 неделя, 4 дня и 3 часа спустя:

Что-то отзывов о плагине пугающе мало...
У меня проблемы есть...

Warning: Invalid argument supplied for foreach() in /sata1/home/users/politzone/www/xxi.site.kharkov.ua/news/plugins/xfields.php on line 57

Вот код из файла.

  foreach ($xfields_data as $line){
        $xfields_arr = explode('|>|', $line);

        foreach (explode('||', $xfields_arr[1]) as $xfield){
            list($name, $content) = explode('|', $xfield);

            $xfields_db[$xfields_arr[0]][$name] = $content;
        }
    }

Я не понимаю...

14

Re: Дополнительные поля в формате MySQL

cmd пишет:

Что-то отзывов о плагине пугающе мало

Значит - более-менее работает wink

cmd пишет:

Warning ... on line 57

Попробуйте заполнить хотя бы одно дополнительное поле хотя бы в одной новости.

Показанная вами 57-я строка осталась от старой (текстовой) версии плагина. Если варнинг ругается в новой версии, то, в принципе, должен был ругаться и в старой.

Хотя... файл xfields-data.txt к текстовой версии прилагался по умолчанию, могло и не ругаться, даже если он был пустым. Сравните предыдущие (перед 57-й строкой) фрагменты:

Старая версия:

//Чтение массива $xfields_data из текстового файла
$xfields_data = file(data_directory.'/xfields-data.txt');

Новая версия:

//Чтение таблицы из базы данных
$xfields_data = $sql->select(array('table'   => 'xfields_data', 'select' => array('data')));
//Выделение из таблицы массива $xfields_data
foreach($xfields_data as $row) {$ffss[] = $row['data'];} $xfields_data = $ffss;

Re: Дополнительные поля в формате MySQL

ANT-soft, сегодня 2 часа искал причину поломки плагина keywords.php
Обнаружил в БД, что поля id не указано значение auto_increment.
Начал думать как так получилось. Открыл Ваш плагин.

//keywords
'keywords' => array(
'id' => array('type' => 'int', 'primary' => 1),
'name' => array('type' => 'string'),
'url' => array('type' => 'string')
),

Забыли вы про 'auto_increment' => 1, , а без него функция last_insert_id возвращает -1 при любой погоде.

16

Re: Дополнительные поля в формате MySQL

cmd, в файле inc/db/database.inc.php указанный вами фрагмент нужен только для конвертации базы данных формата txtSQL в MySQL. Если при инсталляции Strawberry "с нуля" указанного фрагмента в этом файле не было, то таблица cute_keywords создастся правильно.

Мой косяк, каюсь. Кому-то помогал конвертировать базу данных и оставил.

У кого есть - переделайте:

//keywords
'keywords' => array(
'id' => array('type' => 'int', 'auto_increment' => 1, 'primary' => 1),
'name' => array('type' => 'string'),
'url' => array('type' => 'string')
),

Re: Дополнительные поля в формате MySQL

А вот код, который поможет упростить переезд доп.полей на mysql:

<?
include 'admin/head.php';

$lines = file('admin/data/xfields-data.txt');  // путь к файлу источнику
include 'admin/data/xfields-data.php';

foreach ($lines as $line)
{
    
    $position = strpos($line,'|');
    $id = substr($line, 0, $position); // отрезаем наш id
    $line = substr($line, 0, strlen($line) - 2); //  вырезаем символ конца строки
    
        $sql->insert(array(
            'table' => 'xfields_data',
            'values' => array (
                    'id' => $id,
                    'data' => $line,
                    'comments' => $array[$id]['comments'],
                    'commentsstop' => $array[$id]['commentsstop'],
                    'template' => $array[$id]['template'],
                    'fs_format' => $array[$id]['fs_format'],
                    'pinged' => $array[$id]['pinged'],
            )
        ));
}
?>

7 месяцев, 2 недели и 1 день спустя:

Не пугайтесь! Первая же созданная или отредактированная новость устранит ошибку.

Кроме того, ошибка приводит к тому, что данные в поля comments, commentsstop, template не будут записываться. Чтобы это исправить
1. нужно в нескольких местах перед обработкой цикла foreach( добавить проверк is_array
2. затюнинговать функцию insert() : http://strawberry.goodgirl.ru/forum/topic/4149/
3. поправить функцию save() класса XFieldsData:

function save(){

    global $sql, $id;

    $val = array();
    
    if ($this->data[$id]['template']) {$val['template'] = $this->data[$id]['template'];}
    if ($this->data[$id]['fs_format']) {$val['fs_format'] = $this->data[$id]['fs_format'];}
    if ($this->data[$id]['comments']) {$val['comments'] = $this->data[$id]['comments'];}
    if ($this->data[$id]['commentsstop']) {$val['commentsstop'] = $this->data[$id]['commentsstop'];}
    if ($this->data[$id]['pinged']) {$val['pinged'] = $this->data[$id]['pinged'];}

        
        $val['id'] = $id;
        $val['comments'] = (!$_POST['endiscomments'] ? 'no' : 'on');
        $val['commentsstop'] = (!$_POST['commentsstop'] ? 'no' : 'on');
        $val['template'] = (!$_POST['template'] != '...' ? $_POST['template'] : '');
        
        # edit by cmd        
        $sql->insert(array('table' => 'xfields_data', 'where' => array("id = $id"), 'values' => $val), true); 
            
}
}

Никаких ошибок. Все работает правильно (вроде).

8 месяцев, 4 дня и 7 часов спустя:

ANT-Soft, приведенная ниже функция перелапачивает все записи в таблице при вызове каждой новости.

class XFieldsData {
// Adaption by ANT-Soft for Strawberry 1.1.1 with MySQL
    function XFieldsData(){
        global $sql;

        $qq = $sql->select(array('table' => 'xfields_data',  'select' => array('id' , 'comments' , 'commentsstop' , 'template' , 'fs_format' , 'pinged')));
        foreach($qq as $row) {
        $qqq[$row['id']] = array('comments' => $row['comments'],'commentsstop' => $row['commentsstop'],'template' => $row['template'],'fs_format' => $row['fs_format'],'pinged' => $row['pinged']);
        }
        return $this->data = $qqq; 
    }

Например, если у нас 10 новостей, то таблица xfields_data будет перелопачиваться 10 раз.  Нет идеи как от этого лучше уйти?

8 месяцев, 4 дня и 7 часов спустя:

Прошу прощения, я не точно обрисовал весь ужОс. Доп. поля используются в нескольких файлах (навскидку в 4-ех). Т.е. каждая новость перелопачивает всю таблицу 4 раза. И того, если у нас 25 новостей подряд, то таблица будет перелопачиваться 100 раз (а данные-то постоянно одни и те же).

З.Ы. В лучших традициях Джумлы! smile)

8 месяцев, 4 дня и 8 часов спустя:

Вот такая нехитрая конструкция уменьшила время генерации страницы в 10 раз с 2 секунд до 0,2.

function XFieldsData(){
    global $sql, $qqqqq;
        if (!$qqqqq) {
        $qq = $sql->select(array('table' => 'xfields_data',  'select' => array('id' , 'comments' , 'commentsstop' , 'template' , 'fs_format' , 'pinged')));
        foreach($qq as $row) {
        $qqqqq[$row['id']] = array('comments' => $row['comments'],'commentsstop' => $row['commentsstop'],'template' => $row['template'],'fs_format' => $row['fs_format'],'pinged' => $row['pinged']);
        }
    }
    return $this->data = $qqqqq; 
}

Re: Дополнительные поля в формате MySQL

cmd, по поводу последней функции. Я так понял вы выводите массив доп полей и уже из массива выдираются нужные доп поля для конкретной новости?
Если да - то тоже не вариант. Это решение мне напомнило проблему с созданием массива с данными юзеров. При большом количестве доп полей ваша конструкция будет тормозить систему еще больше...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Miksar, согласен. Я для себя уже написал дополнительный action и выдергиваю только нужные. Но пользователи 1.1.1 этого сделать не смогут. Поэтому я по принципе "бритвы Оккама" озвучил самый эффективный вариант из простых.

Re: Дополнительные поля в формате MySQL

cmd, скажем самый простой, но не эффективный. ))
Систему с выдергиванием нужных полей я уже давно реализовал wink

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Miksar, я говорю с позиции 1.1.1. Это тема - хак для 1.1.1.

22

Re: Дополнительные поля в формате MySQL

cmd пишет:

Вот такая нехитрая конструкция...

Большое человеческое спасибо!

Re: Дополнительные поля в формате MySQL

cmd, да хоть с какой позиции. 1.1.1 страдает нагрузкой на сервер, а вы еще подливаете... Ну да ваше дело...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Дополнительные поля в формате MySQL

Miksar, мне иногда кажется, что ты издеваешься.... чего ты меня порочишь?

На пальцах:
Было 5 новостей. Каждая новость делала запрос 4 раза. Каждый раз запрос обходил всю таблицу. Получается, что у нас 20 запросов и 20 раз одна и та же переменная создается и уничтожается.

Я написал как сделать один запрос, который один раз обойдет всю таблицу вне зависимости от количества новостей. Причем тут "масло в огонь"?

Re: Дополнительные поля в формате MySQL

cmd, Не порочу, а предупреждаю об том, что может стать причиной загрузки сайтами серверов...
Еще раз говорю. Если будет много полей с инфой - то будет большой массив - много памяти уйдет на работу сайта...

1 минуту и 38 секунд спустя:

ЗЫ
Не будем вспоминать про "бред сивой..." hmm

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!