Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

yii not saving model

Tags:

php

yii

  $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();
  }

The Event model gets saved correctly with all the POST variables for Event, while the Package only has the event_id set, but no attributes are set (they are all NULL). What am I doing wrong?

NB: The Event object has been programmed by my predecessor, the Package object is a new addition I did.

EDIT: the whole Package class

  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,
    ));
  }
}
like image 291
transient_loop Avatar asked Dec 26 '22 16:12

transient_loop


1 Answers

If you want to set attributes through:

$pkg->attributes=$_POST['Package'];

then you have to set rules for any attribute that can be set this way.

You need something like this:

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.. 
    );
}

you need rule for any attribute that you want to set this way.

if there is no rule set for attribute you'll be able to set its value only through $pkg->attribute_name = $value;

rule like array('', 'safe', 'on'=>'search'), or array('', 'numerical'), does nothing (cause attributes list is empty).

read more about validation here

like image 149
lupatus Avatar answered Jan 08 '23 13:01

lupatus