public function seed() { $states = ['AU' => ['ACT' => 'Australian Capital Territory', 'NSW' => 'New South Wales', 'NT' => 'Northern Territory', 'QLD' => 'Queensland', 'SA' => 'South Australia', 'TAS' => 'Tasmania', 'VIC' => 'Victoria', 'WA' => 'Western Australia'], 'CA' => ['AB' => 'Alberta', 'BC' => 'British Columbia', 'MB' => 'Manitoba', 'NB' => 'New Brunswick', 'NL' => 'Newfoundland and Labrador', 'NT' => 'Northwest Territories', 'NS' => 'Nova Scotia', 'NU' => 'Nunavut', 'ON' => 'Ontario', 'PE' => 'Prince Edward Island', 'QC' => 'Quebec', 'SK' => 'Saskatchewan', 'YT' => 'Yukon'], 'US' => ['AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'DC' => 'District of Columbia', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi', 'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York', 'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia', 'WI' => 'Wisconsin', 'WY' => 'Wyoming']]; $criteria = new \CDbCriteria(); $criteria->addInCondition('iso', array_keys($states)); $countries = Market_CountryRecord::model()->findAll($criteria); $code2id = []; foreach ($countries as $record) { $code2id[$record->iso] = $record->id; } $rows = []; foreach ($states as $iso => $list) { foreach ($list as $abbr => $name) { $rows[] = [$code2id[$iso], $abbr, $name]; } } $table = Market_StateRecord::model()->getTableName(); \Craft\craft()->db->createCommand()->insertAll($table, ['countryId', 'abbreviation', 'name'], $rows); }
/** * @param Market_TaxZoneModel $model * @param array $countriesIds * @param array $statesIds * * @return bool * @throws \Exception */ public function save(Market_TaxZoneModel $model, $countriesIds, $statesIds) { if ($model->id) { $record = Market_TaxZoneRecord::model()->findById($model->id); if (!$record) { throw new Exception(Craft::t('No tax zone exists with the ID “{id}”', ['id' => $model->id])); } } else { $record = new Market_TaxZoneRecord(); } //remembering which links should be clean $deleteOldCountries = $deleteOldStates = false; if ($record->id) { if ($record->countryBased) { $deleteOldCountries = true; } else { $deleteOldStates = true; } } //setting attributes $record->name = $model->name; $record->description = $model->description; $record->countryBased = $model->countryBased; $record->default = $model->default; $record->validate(); $model->addErrors($record->getErrors()); //validating given ids if ($record->countryBased) { $criteria = new \CDbCriteria(); $criteria->addInCondition('id', $countriesIds); $exist = Market_CountryRecord::model()->exists($criteria); if (!$exist) { $model->addError('countries', 'Please select some countries'); } } else { $criteria = new \CDbCriteria(); $criteria->addInCondition('id', $statesIds); $exist = Market_StateRecord::model()->exists($criteria); if (!$exist) { $model->addError('states', 'Please select some states'); } } //saving if (!$model->hasErrors()) { MarketDbHelper::beginStackedTransaction(); try { // Save it! $record->save(false); // Now that we have a record ID, save it on the model $model->id = $record->id; //deleting old links if ($deleteOldCountries) { Market_TaxZoneCountryRecord::model()->deleteAllByAttributes(['taxZoneId' => $record->id]); } if ($deleteOldStates) { Market_TaxZoneStateRecord::model()->deleteAllByAttributes(['taxZoneId' => $record->id]); } //saving new links if ($model->countryBased) { $rows = array_map(function ($id) use($model) { return [$id, $model->id]; }, $countriesIds); $cols = ['countryId', 'taxZoneId']; $table = Market_TaxZoneCountryRecord::model()->getTableName(); } else { $rows = array_map(function ($id) use($model) { return [$id, $model->id]; }, $statesIds); $cols = ['stateId', 'taxZoneId']; $table = Market_TaxZoneStateRecord::model()->getTableName(); } craft()->db->createCommand()->insertAll($table, $cols, $rows); //If this was the default make all others not the default. if ($model->default) { Market_TaxZoneRecord::model()->updateAll(['default' => 0], 'id != ?', [$record->id]); } MarketDbHelper::commitStackedTransaction(); } catch (\Exception $e) { MarketDbHelper::rollbackStackedTransaction(); throw $e; } return true; } else { return false; } }