помогите подправить CRUD

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
maxyer
Сообщения: 290
Зарегистрирован: 2012.01.10, 17:55
Откуда: отсюда

помогите подправить CRUD

Сообщение maxyer »

Здравствуйте !
У меня есть база, в которой хранится информация о классах и учениках, которые в этих классах учатся.

Код: Выделить всё

CREATE TABLE `classes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(8) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;

CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_bin NOT NULL,
  `class` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `class` (`class`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;


ALTER TABLE `students`
  ADD CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class`) REFERENCES `classes` (`id`);
Я создаю (с помощью Gii) приложение для чтения, обновления, изменения, удаления информации из базы (CRUD).
Подскажите пожалуйста, как сделать так, чтобы при создании/обновлении, да и просмотре таблицы учеников вместо поля `students`.class пользователь видел название этого класса, т.е. поле `classes`.name.
Например нужно, чтобы при создании нового ученика в форме ввода было бы не текстовое поле, в которое нужно вставить id класса, а список выбора (listbox) с перечнем наименований классов.
Надеюсь, я понятно объяснил ;)
Аватара пользователя
Mobelis
Сообщения: 11
Зарегистрирован: 2011.05.09, 05:13
Контактная информация:

Re: помогите подправить CRUD

Сообщение Mobelis »

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

Код: Выделить всё

$form->dropDownList($model,'id_content',CHtml::listData(Content::model()->findAll(), 'id', 'name'));  
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: помогите подправить CRUD

Сообщение andy_s »

Mobelis писал(а):Первым делом необходимо настроить отношения
Знаю, что не в тему, но уже давно смущает данная терминология. Называть связи между таблицами "отношением" некорректно. Отношение - это и есть таблица. Возможно, в дальнейшем переводчикам документации стоит задуматься об этом, т.к. в английской версии употребляется слово relationship (а не relation), т.е. есть намёк на то, что это всё-таки разные вещи :)

Wikipedia
Аватара пользователя
Mobelis
Сообщения: 11
Зарегистрирован: 2011.05.09, 05:13
Контактная информация:

Re: помогите подправить CRUD

Сообщение Mobelis »

Я лишь использовал термин употребляемый в документации.
maxyer
Сообщения: 290
Зарегистрирован: 2012.01.10, 17:55
Откуда: отсюда

Re: помогите подправить CRUD

Сообщение maxyer »

Mobelis писал(а):Первым делом необходимо настроить отношения. Для удобства дальнейшей работы. Предположительно gii должен настроить отношения но бывает необходимо их добавить или изменить. Далее в представлении где необходимо использовать выпадающий список.

Код: Выделить всё

$form->dropDownList($model,'id_content',CHtml::listData(Content::model()->findAll(), 'id', 'name')); 
Большое спасибо !
Заработало.
Пока больше вопросов нет - надо осмыслить новую информацию, но в будущем вопросы обязательно появятся ;)
Кстати, а есть ли это хорошо, что в представлении выполняется некий запрос Content::model()->findAll() с точки зрения идеологии MVC ?
maxyer
Сообщения: 290
Зарегистрирован: 2012.01.10, 17:55
Откуда: отсюда

Re: помогите подправить CRUD

Сообщение maxyer »

Сделал почти все, как хотелось.
Осталось как-то исправить представление students/view&id=<id> и students/admin, чтобы вместо id класса стояло его имя.
Данные учеников в представлении отображаются виджетами zii.widgets.CDetailView и zii.widgets.grid.CGridView соответственно.

Код: Выделить всё

$this->widget('zii.widgets.CDetailView', array(
	'data'=>$model,
	'attributes'=>array(
		'id',
		'name',
		'class',
	),
));

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'students-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'id',
		'name',
		'class',
		array(
			'class'=>'CButtonColumn',
		),
	),
));
Можно ли их как-то сконфигурировать, чтобы вместо атрибута class вставлялось имя класса из таблицы classes ?
Или нужно лезть в исходники виджетов или писать что-то свое ?
Аватара пользователя
Mobelis
Сообщения: 11
Зарегистрирован: 2011.05.09, 05:13
Контактная информация:

Re: помогите подправить CRUD

Сообщение Mobelis »

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
   'id'=>'students-grid',
   'dataProvider'=>$model->search(),
   'filter'=>$model,
   'columns'=>array(
      'id',
      'name',
            array('name'=>'class',
                          'type'=>'text',
                          'header'=>'Класс',
                          'filter'=>CHtml::dropDownList(), // если в таблице необходим фильтр по названию класса то можно дописать в соответствии с вашими параметрами
                          'value'=> 'Classes::Model()->findByPk($data->class)->name', // может и не сработает тут уже Вы посмотрите как у Вас можно получить необходимые данные
                        ),
      array(
         'class'=>'CButtonColumn',
      ),
   ),
));
 
Ответить