public function setOptions($config)
 {
     if (!waRequest::post()) {
         return $config;
     }
     $options = waRequest::post('options');
     if (!is_array($options)) {
         return $config;
     }
     $fields_unsorted = waContactFields::getAll();
     $config['fields'] = array();
     $cfvm = new waContactFieldValuesModel();
     foreach ($options as $fld_id => $opts) {
         if ($fld_id == '%FID%') {
             continue;
         }
         $fld_id_no_ext = explode('.', $fld_id, 2);
         $field_ext = empty($fld_id_no_ext[1]) ? '' : '.' . $fld_id_no_ext[1];
         $fld_id_no_ext = $fld_id_no_ext[0];
         $field = ifset($fields_unsorted[$fld_id_no_ext]);
         // Special treatment for subfields of shipping and billing address:
         // copy actual settings from address field.
         if ($field_ext && $fld_id_no_ext == 'address') {
             $existing_subfields = $field->getFields();
             // Sanity check
             if (!is_array($opts) || empty($options['address']) || !is_array($options['address']) || empty($options['address']['fields']) || !is_array($options['address']['fields'])) {
                 continue;
             }
             // Copy settings if subfield is turned on, or required, or is hidden
             $fields = array();
             foreach ($options['address']['fields'] as $sf_id => $sf_opts) {
                 if (!empty($sf_opts['required']) || !empty($sf_opts['_disabled']) && !empty($sf_opts['_default_value_enabled']) && empty($sf_opts['_deleted']) || !empty($opts['fields'][$sf_id])) {
                     if (!$field_ext || isset($existing_subfields[$sf_id])) {
                         $fields[$sf_id] = $sf_opts;
                     }
                 }
             }
             $opts['fields'] = $fields;
         }
         if ($field) {
             if (!empty($opts['_deleted'])) {
                 waContactFields::deleteField($field);
                 unset($fields_unsorted[$fld_id_no_ext]);
                 continue;
             }
             $new_field = false;
         } else {
             $field = self::createFromOpts($opts, $fields_unsorted);
             if (!$field || $field instanceof waContactCompositeField) {
                 continue;
             }
             // For conditional fields, update ID in database: replace temporary id with new one
             if ($field instanceof waContactConditionalField) {
                 $cfvm->changeField($fld_id_no_ext, $field->getId());
             }
             $fld_id = $field->getId() . $field_ext;
             $new_field = true;
         }
         list($local_opts, $sys_opts) = self::tidyOpts($field, $fld_id, $opts);
         if ($local_opts === null || $sys_opts === null) {
             continue;
         }
         // Write to system config.
         if (!$field_ext) {
             $field->setParameters($sys_opts);
             $fields_unsorted[$fld_id_no_ext] = $field;
             if ($new_field) {
                 waContactFields::createField($field);
                 waContactFields::enableField($field, 'person');
                 $fields_unsorted[$field->getId()] = $field;
             } else {
                 if ($sys_opts) {
                     waContactFields::updateField($field);
                     waContactFields::enableField($field, 'person');
                 }
             }
         }
         $config['fields'][$fld_id] = $local_opts;
     }
     // Delete garbage from wa_contact_field_values
     $cfvm->exec("DELETE FROM wa_contact_field_values WHERE field RLIKE '__[0-9]+\$'");
     return $config;
 }