php - poner - yii2 html::a
yii no salva modelo (2)
Si quieres establecer atributos a través de:
$pkg->attributes=$_POST[''Package''];
entonces debe establecer reglas para cualquier atributo que se pueda establecer de esta manera.
Necesitas algo como esto:
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array(''package_name'', ''required''),
array(''package_name'', ''length'', ''max'' => 255),
// or
array(''package_name'', ''length'', ''max'' => 255, ''on'' => ''insert''),
// at least (when no validation is required):
array(''package_name'', ''safe''),
// ...
// and so on..
);
}
necesita una regla para cualquier atributo que quiera establecer de esta manera.
si no hay una regla establecida para el atributo, podrá establecer su valor únicamente a través de $pkg->attribute_name = $value;
rule como array('''', ''safe'', ''on''=>''search''),
o array('''', ''numerical''),
no hace nada (porque la lista de atributos está vacía).
lea más sobre la validación aquí
$model=new Event(''create'');
$model->attributes=$_POST[''Event''];
if($model->save()){
$pkg = new Package();
$pkg->attributes=$_POST[''Package''];
$pkg->event_id = $model->id;
$pkg->save();
}
El modelo de eventos se guarda correctamente con todas las variables POST para el evento, mientras que el paquete solo tiene el conjunto de eventos establecido, pero no se establecen atributos (todos son NULL). ¿Qué estoy haciendo mal?
NB: El objeto Evento ha sido programado por mi predecesor, el objeto Paquete es una nueva adición que hice.
EDITAR: toda la clase de paquete
class Package extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return ''tbl_package'';
}
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('''', ''safe'', ''on''=>''search''),
array('''', ''numerical''),
);
}public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
''event'' => array(self::BELONGS_TO, ''Event'', ''id'')
);
}public function attributeLabels()
{
return array(
''event_id'' => ''Event ID'',
''package_name'' => ''Package name'',
''event_banner'' => ''Event Banner'',
''ad_placement'' => ''Ad Placement in Event Program'',
''logo_on_step'' => ''Logo on Step & Repeat'',
''use_evt_pics'' => ''Usage of Event Pictures'',
''exhibition'' => ''Exhibition Booth/Space'',
''inc_press'' => ''Inclusion in Press'',
''print_ads'' => ''Insertion in Print Ads'',
''online_ads'' => ''Insertion in Online Ads'',
''attendee_bags'' => ''Attendee Bags'',
''charging_st'' => ''Charging Stations'',
''cups'' => ''Coffee/Water Cups'',
''distr_items'' => ''Distributable Items'',
''lanyards'' => ''Lanyards'',
''napkins'' => ''Napkins'',
''notebooks'' => ''Notebooks'',
''pens'' => ''Pens'',
''seat_covers'' => ''Seat Covers'',
''snack_pack'' => ''Snack Packaging'',
''water_bottles'' => ''Water Bottles''
);
} public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare(''event_banner'',$this->event_banner);
$criteria->compare(''package_name'',$this->package_name);
$criteria->compare(''ad_placement'',$this->ad_placement);
$criteria->compare(''logo_on_step'',$this->logo_on_step);
$criteria->compare(''use_evt_pics'',$this->use_evt_pics);
$criteria->compare(''exhibition'',$this->exhibition);
$criteria->compare(''inc_press'',$this->inc_press);
$criteria->compare(''print_ads'',$this->print_ads);
$criteria->compare(''online_ads'',$this->online_ads);
$criteria->compare(''attendee_bags'',$this->attendee_bags);
$criteria->compare(''charging_st'',$this->charging_st);
$criteria->compare(''cups'',$this->cups);
$criteria->compare(''distr_items'',$this->distr_items);
$criteria->compare(''lanyards'',$this->lanyards);
$criteria->compare(''napkins'',$this->napkins);
$criteria->compare(''notebooks'',$this->notebooks);
$criteria->compare(''pens'',$this->pens);
$criteria->compare(''seat_covers'',$this->seat_covers);
$criteria->compare(''snack_pack'',$this->snack_pack);
$criteria->compare(''water_bottles'',$this->water_bottles);
return new CActiveDataProvider(''SponsorshipPackage'', array(
''criteria''=>$criteria,
));
}
}
class Package extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return ''tbl_package'';
}
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array(''ad_placement, logo_on_step, ...'', ''safe'', ''on''=>''search''), //note put here all attrs name that you feel those attrs needs to be assigned from POST like: `$pkg->attributes=$_POST[''Package''];`
array(''event_id'', ''numerical''),
);
}public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
''event'' => array(self::BELONGS_TO, ''Event'', ''id'')
);
}public function attributeLabels()
{
return array(
''event_id'' => ''Event ID'',
''package_name'' => ''Package name'',
''event_banner'' => ''Event Banner'',
''ad_placement'' => ''Ad Placement in Event Program'',
''logo_on_step'' => ''Logo on Step & Repeat'',
''use_evt_pics'' => ''Usage of Event Pictures'',
''exhibition'' => ''Exhibition Booth/Space'',
''inc_press'' => ''Inclusion in Press'',
''print_ads'' => ''Insertion in Print Ads'',
''online_ads'' => ''Insertion in Online Ads'',
''attendee_bags'' => ''Attendee Bags'',
''charging_st'' => ''Charging Stations'',
''cups'' => ''Coffee/Water Cups'',
''distr_items'' => ''Distributable Items'',
''lanyards'' => ''Lanyards'',
''napkins'' => ''Napkins'',
''notebooks'' => ''Notebooks'',
''pens'' => ''Pens'',
''seat_covers'' => ''Seat Covers'',
''snack_pack'' => ''Snack Packaging'',
''water_bottles'' => ''Water Bottles''
);
}
....
}
Si no funciona, entonces puedes probar, htere es el método validate()
antes de save()
:
$model=new Event(''create'');
$model->attributes=$_POST[''Event''];
if($model->validate()){
$model->save();
}
else{
echo CHtml::errorSummary($model);
}
Esto dirá qué es un error.
Nunca guardar directamente, validar antes de guardar.