1

Topic: Где лучше писать код добавления новых колонок?

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


Нашёл в install.php где описываются и создаются поля/таблицы, добавил туда колонку новую мою.
Да только вот незадача - при установке-то будет всё ок, но а если БД уже существует - что делать?


Решил пока наклепать отдельный php-файл, который просто дружит мои модификации со схемой БД, но это как-то топорно.
Где-то в движке есть запланированное место для подобного? Я просто не в курсе.


Да ещё кажется нашёлся баг какой-то:

$forum_db->field_exists(...);

Вот эта вот штука - нагло врёт. Всегда False.

$matches[2]

Поправка. Первый раз она была-таки права. Колонки действительно не существовало.
После этого я добавил колонку, всё хорошо, всё работает. Но field_exists() продолжает утверждать False, что уже не верно.
Другие (старые) колонки я не проверял.

2

Re: Где лучше писать код добавления новых колонок?

@GoodWeather, ок, а в какую таблицу вы хотели бы добавить колонку?

3

Re: Где лучше писать код добавления новых колонок?

Ну в данном случае пойдёт в users, а разве есть разница? PunBB_INFO_ICQ/smile
Проверил, на старые говорит True. Видимо только на мою ошибается, хотя в списке полей она есть.

$matches[2]

Во. Там регулярка проверяет на "[\r\n]", а у тех колонок что я добавляю через

$forum_db->add_field(...);

почему-то вместо перевода каретки - пробел.

Но всё же интереснее, если ли специальное место для проверки и модификации схемы БД...

4

Re: Где лучше писать код добавления новых колонок?

Например, если рассмотреть добавление колонки в таблицу users, то так:

if (!$forum_db->field_exists('users', 'pan_likes'))
   $forum_db->add_field('users', 'pan_likes', 'INT(10)', false, '0');

Вам же нужно колонку проверить, а не имя таблицы

5

Re: Где лучше писать код добавления новых колонок?

Примерно так и есть. Только а где это располагать-то, говорю..?

$matches[2]

И оригинальный field_exists() по-прежнему всегда выдаёт False на создаваемое через add_field().
У меня видимо оно перенаправляется в sqlite3.php, надо там поправить.
Перед именем колонки могут быть же идти не только переводы каретки, а любые пробельные символы и в теории даже ещё открывающаяся скобка. PunBB_INFO_ICQ/whipped

6 (edited by PunBB 2020.03.27 22:00)

Re: Где лучше писать код добавления новых колонок?

Ок. Давайте так. Это лучше сделать в виде расширения.
1. Создайте папку с уникальным именем, к примеру: gw_add_fields
2. Создайте файл: manifest.xml с содержимым:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE extension SYSTEM "ext-1.0.dtd">

<extension engine="1.0"> 
   <id>gw_add_fields</id>
   <title>Add Fields</title>
   <version>0.1</version>
   <description>Добавляем новые поля в таблицы.</description>
   <author>GoodWeather</author>
   <minversion>1.4.2</minversion>
   <maxtestedon>1.4.4</maxtestedon>

   <install><![CDATA[
define('PAN_INSTALL', 1);
require $ext_info['path'].'/install.php';
   ]]></install>

   <uninstall><![CDATA[
define('PAN_UNINSTALL', 1);
require $ext_info['path'].'/uninstall.php';
   ]]></uninstall>

   <hooks>
   
   </hooks>
</extension>

3. В файл install.php добавьте код:

<?php

if(!defined('PAN_INSTALL')) die();

if (!$forum_db->field_exists('users', 'gw_field'))
   $forum_db->add_field('users', 'gw_field', 'INT(10)', false, '0');

4. В файл uninstall.php добавляем следующее:

<?php

if (!defined('PAN_UNINSTALL')) die();

if ($forum_db->field_exists('users', 'gw_field'))
   $forum_db->drop_field('users', 'gw_field');

Все, играйтесь PunBB_INFO_ICQ/smile

7

Re: Где лучше писать код добавления новых колонок?

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


Не пойму что и в какой момент делает "db_update.php" - какие-то DB_REVISION, кто их выпуск(ает/ал)?
Хотя по сути кажется логически не подходящим для "личных модификаций", это явно позиционируется как нечто от авторов.

8

Re: Где лучше писать код добавления новых колонок?

Это изначально никак не связано с вашим вопросом и названием темы. Этот файл для того чтобы обновить версию ядра, что уже вряд ли когда нибудь произойдет после выхода 1.4.4

$matches[2]

Если же хотите врезать в само ядро при установке, то добавьте код, типа:

if (!$forum_db->field_exists('users', 'gw_field'))
   $forum_db->add_field('users', 'gw_field', 'INT(10)', false, '0');

в файл /admin/install.php

но я бы советовал вам делать это с помощью расширений.