public function execute() { $field = waRequest::get('field', null, waRequest::TYPE_STRING_TRIM); if (!$field) { throw new waException(_w("Unknown field")); } // List of field values $cfvm = new waContactFieldValuesModel(); $fields = $cfvm->getInfo($field); // Possible parent fields this conditional field may depend on $parent_fields = array(); foreach (waContactFields::getAll('person') as $f) { /** @var waContactField $f */ if (!$f instanceof waContactCompositeField && !$f->isMulti()) { $parent_fields[$f->getId()] = $f->getName(); } } $field_ids = explode(':', $field); $f = waContactFields::get($field_ids[0]); if (!empty($field_ids[1]) && $f && $f instanceof waContactCompositeField) { $subfields = $f->getFields(); foreach ($subfields as $sfid => $sf) { $pid = $f->getId() . ':' . $sfid; if ($pid !== $field) { $parent_fields[$pid] = $f->getName() . ' — ' . $sf->getName(); } } } // Selected parent field $parent_selected = null; if ($fields) { $parent_selected = reset($fields); $parent_selected = $parent_selected['field']; } // Human readable name of current field if (!empty($field_ids[1]) && !empty($subfields[$field_ids[1]])) { $title = $subfields[$field_ids[1]]->getName(); } else { if ($f) { $title = $f->getName(); } else { // Loose guess on whether this field has just been created $new_field = false; if (substr($field, 0, 2) == '__') { $new_field = true; } else { if (!empty($field_ids[1]) && substr($field_ids[1], 0, 2) == '__') { $new_field = true; } } if ($new_field) { $title = _w('Conditional field'); } else { $title = _w(ucfirst($field)); } } } $this->view->assign(array('field' => $field, 'title' => $title, 'fields' => $fields, 'parent_fields' => $parent_fields, 'parent_selected' => $parent_selected)); }
public function getOptions() { $id = $this->getId(); $parent = $this->getParameter('parent_id'); if ($parent) { $parent = explode('.', $parent, 2); $parent = $parent[0]; $id = $parent . ':' . $id; } static $cfdm = null; if (!$cfdm) { $cfdm = new waContactFieldValuesModel(); } $result = array(); foreach ($cfdm->where('field=?', $id)->order('sort')->query() as $row) { $result[$row['parent_field']][mb_strtolower($row['parent_value'])][] = $row['value']; } return $result; }
/** * Make sure given array of options is valid for $field. * Return list($local_opts, $sys_opts) to save for this $field. * Local options are saved to shop app config. System options to contacts app config. * If any of option sets returned is null, this field is skipped altogether. */ protected static function tidyOpts($field, $fld_id, $opts) { if ($fld_id == '%FID%' || !is_array($opts) || !empty($opts['_deleted']) || empty($opts['localized_names'])) { return array(null, null); } if (!empty($opts['_disabled'])) { if (!empty($opts['_default_value_enabled']) && isset($opts['_default_value']) && strlen($opts['_default_value'])) { // A hack for region field: when user specifies region name, replace it with region code. // In case there's a region with code equal to another region's name, prefer the former. if ($field instanceof waContactRegionField) { $rm = new waRegionModel(); $regions = $rm->select('code, code AS a')->where('code = s:0 OR name = s:0', $opts['_default_value'])->query()->fetchAll('code', true); if ($regions && empty($regions[$opts['_default_value']])) { $opts['_default_value'] = reset($regions); } } return array(array('hidden' => true, 'value' => $opts['_default_value']), array()); } else { return array(null, null); } } unset($opts['_disabled'], $opts['_type'], $opts['_deleted'], $opts['_default_value'], $opts['_default_value_enabled']); $sys_opts = array(); if (in_array(get_class($field), array('waContactSelectField', 'waContactRadioSelectField', 'waContactChecklistField', 'waContactBranchField'))) { if (!empty($opts['options']) && is_array($opts['options'])) { if ($field instanceof waContactBranchField) { if (empty($opts['hide']) || !is_array($opts['hide'])) { $opts['hide'] = array(); } } // get rid of empty last element if ($el = trim(array_pop($opts['options']))) { $opts['options'][] = $el; } $branch_hide = array(); $select_options = array(); foreach ($opts['options'] as $i => $v) { $v = trim($v); $select_options[$v] = $v; if ($field instanceof waContactBranchField && !empty($opts['hide'][$i])) { $branch_hide[$v] = explode(',', (string) $opts['hide'][$i]); } } if (!$select_options) { return array(null, null); } $sys_opts['options'] = $select_options; if ($field instanceof waContactBranchField) { $sys_opts['hide'] = $branch_hide; } } else { if (!$field->getParameter('options')) { // Never allow select-based field with no options to select from return array(null, null); } } unset($opts['options']); } else { if ($field instanceof waContactCompositeField) { if (empty($opts['fields']) || !is_array($opts['fields'])) { return array(null, null); } $subfields = array(); $subfields_sys = array(); $existing_subfields = $field->getFields(); foreach ($opts['fields'] as $sf_id => $o) { if ($sf_id == '%FID%' || !empty($o['_deleted'])) { continue; } if (empty($existing_subfields[$sf_id])) { $sf = self::createFromOpts($o, $opts['fields'] + $existing_subfields); if (!$sf) { continue; } // For conditional fields, update ID in database: replace temporary id with new one if ($sf instanceof waContactConditionalField) { $cfvm = new waContactFieldValuesModel(); $cfvm->changeField($sf_id, $sf->getId()); } $sf_id = $sf->getId(); } else { $sf = $existing_subfields[$sf_id]; $subfields_sys[$sf_id] = $sf; // make sure it is saved to system config } list($o, $sys_o) = self::tidyOpts($sf, $sf_id, $o); if ($o === null || $sys_o === null) { continue; } if ($sf instanceof waContactConditionalField) { $sys_o['parent_id'] = $fld_id; } $sf->setParameters($sys_o); $subfields_sys[$sf_id] = $sf; $subfields[$sf_id] = $o; } if (!$subfields) { return array(null, null); } $opts['fields'] = $subfields; $sys_opts['fields'] = $subfields_sys; } } if ($field->getParameter('app_id') == 'shop') { $sys_opts += $opts; $opts = array(); foreach (waContactFields::$customParameters as $k => $v) { if (isset($sys_opts[$k])) { $opts[$k] = $sys_opts[$k]; } } } if (empty($opts) && $opts !== null) { $opts = array('__dummy__' => 1); } return array($opts, $sys_opts); }