Как настроить приложение под структуру бд?

Есть игровые сервера, ресурсы которых хранятся в БД. Я хочу сделать приложение, с помощью которого можно управлять этими ресурсами через веб. Упирается все в то, что у всех администраторов игровых серверов названия полей в бд разные и появляется необходимость настроить приложение для готовой бд.

То есть, может быть так, что поле с именем называется username, может так, что Name, вариантов куча, поэтому нужно, чтобы пользователь сам настроил их через какой-то интерфейс.

Правильно ли будет для этих целей использовать параметры приложения /config/main.php примерно так?
'params'=>array(
	'tbl_profiles'=>array(
		'tbl_name'=>'accounts',
		'tbl_fields'=>array(
			'id'=>array(
				'field'=>'id',
				'label'=>'ID'
			),
			'username'=>array(
				'field'=>'username',
				'label'=>'Ваше имя'
			),
			'password'=>array(
				'field'=>'pass',
				'label'=>'Пароль'
			),
		}
	}
}

И обращаться к ресурсам так:
$model->{Yii::app()->params[tbl_profiles][tbl_fields][username][field]}'


Или можно это как-то получше провернуть?
  • Вопрос задан
  • 2535 просмотров
Решения вопроса 1
nowm
@nowm
Через /config/main.php это не очень удобно — потому что тогда вам нужно будет предусмотреть ситуацию, чтобы всё это дело записывалось в конфиг, когда администратор сервера захочет что-то модифицировать «через интерфейс».

Проще создать пару таблиц в БД, которые будут хранить эти поля.

CREATE TABLE IF NOT EXISTS `table_table` (
  `table_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`table_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO `table` (`table_id`, `name`) VALUES
(1, 'accounts');

CREATE TABLE IF NOT EXISTS `table_field` (
  `table_field_id` int(11) NOT NULL AUTO_INCREMENT,
  `table_id` int(11) NOT NULL,
  `name` varchar(32) NOT NULL,
  `alias` varchar(32) NOT NULL,
  `label` varchar(64) NOT NULL,
  PRIMARY KEY (`table_field_id`),
  KEY `table_id` (`table_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

ALTER TABLE `table_field`
  ADD CONSTRAINT `table_field_ibfk_1` FOREIGN KEY (`table_id`) 
  REFERENCES `table_table` (`table_id`) ON DELETE CASCADE ON UPDATE CASCADE;

INSERT INTO `table_field` (`table_field_id`, `table_id`, `name`, `alias`, `label`) VALUES
(1, 1, 'id', 'id', 'ID'),
(2, 1, 'username', 'username', 'Ваше имя'),
(3, 1, 'password', 'pass', 'Пароль');


Потом создаёте модели для этих двух таблиц, контроллеры, реализуете CRUD, и у вас есть интерфейс для настройки полей. «C» и «D» я зачеркнул, чтобы показать, что нужно только оставить возможность читать и редактировать существующие записи, а добавлять/удалять их возможности быть не должно. На странице редактирования, например, нужно сделать так, чтобы доступны для изменения были только «alias» и «label».

Данные о полях потом получаете как обычно данные из модели получаете. Я бы не стал использовать их как $model->{тут_генерируется_название_поля}, но прямо так навскидку я ничего другого предложить не могу, потому что не вижу всей картины.

Получать данные из конфига тоже можно, но вы в этот момент потеряете возможность настраивать состав полей через интерфейс (без дополнительных сложностей с чтением/перезаписью PHP-файла из PHP-файла).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы