/** * @param string $tab Recordset identifier. e.g. contact, company * @param string $old_name Current field name. Not field id. e.g. "First Name" * @param string $new_name New field name. */ public static function rename_field($tab, $old_name, $new_name) { $id = Utils_RecordBrowserCommon::get_field_id($old_name); $new_id = Utils_RecordBrowserCommon::get_field_id($new_name); Utils_RecordBrowserCommon::check_table_name($tab); DB::StartTrans(); if (DB::is_postgresql()) { DB::Execute('ALTER TABLE ' . $tab . '_data_1 RENAME COLUMN f_' . $id . ' TO f_' . $new_id); } else { $old_param = DB::GetOne('SELECT param FROM ' . $tab . '_field WHERE field=%s', array($old_name)); $type = DB::GetOne('SELECT type FROM ' . $tab . '_field WHERE field=%s', array($old_name)); DB::RenameColumn($tab . '_data_1', 'f_' . $id, 'f_' . $new_id, Utils_RecordBrowserCommon::actual_db_type($type, $old_param)); } DB::Execute('UPDATE ' . $tab . '_field SET field=%s WHERE field=%s', array($new_name, $old_name)); DB::Execute('UPDATE ' . $tab . '_edit_history_data SET field=%s WHERE field=%s', array($new_id, $id)); DB::CompleteTrans(); }
private function output($applet = false) { Base_ThemeCommon::load_css($this->get_type(), 'tray'); $tray_settings = Utils_TrayCommon::get_trays(); $tray_def = array(); $total_pending = 0; $displayed = 0; foreach ($tray_settings as $module=>$module_settings) { foreach ($module_settings as $tab=>$tab_settings) { if (!isset($tab_settings['__title__'])) continue; $tray = Utils_TrayCommon::get_tray($tab, $tab_settings); if (!isset($tray['__slots__']) || count($tray['__slots__'])==0) continue; $tray_id = $this->get_type().'__'.Utils_RecordBrowserCommon::get_field_id($tray['__title__']); $tray_def += array($tray_id =>array('__title__' => $tray['__title__'], '__weight__'=>isset($tray['__weight__'])?$tray['__weight__']:0)); foreach ($tray['__slots__'] as $slot_id=>$slot_def) { $total_pending += $slot_def['__count__']; $displayed += $slot_def['__count__']; $tray_def[$tray_id]['__slots__'][$slot_id]['__weight__'] = isset($slot_def['__weight__'])? $slot_def['__weight__']: 0; $icon = $this->get_icon($slot_def['__count__']); $tray_count_width = ($slot_def['__count__']>99)? 'style="width:28px;"':''; $tip_text = __('Click to view %s items from %s<br><br>%d item(s)', array(_V($slot_def['__name__']),_V($tray['__title__']), $slot_def['__count__'])); $tray_def[$tray_id]['__slots__'][$slot_id]['__html__'] = '<td><a '.$this->create_main_href($module, null, array($tab), null, array('tray_slot'=>$slot_id)).'><div class="Utils_Tray__slot">'. Utils_TooltipCommon::create('<img src="'.$icon.'"> <div class="Utils_Tray__count" '.$tray_count_width.'>'.$slot_def['__count__'].'</div><div>'._V($slot_def['__name__']).'</div>',$tip_text).'</div></a></td>'; } } } Utils_TrayCommon::sort_trays($tray_def); $trays = array(); $tray_slots_html = array(); $current_tray = 0; $tray_cols = $applet? 2:$this->get_tray_cols(); foreach ($tray_def as $tray_id=>$def) { $current_tray += 1; $current_row = max(array(round($current_tray/$tray_cols), 1)); $current_col = $current_tray - $tray_cols*($current_row-1); if (isset($this->max_trays) && $this->max_trays != '__NULL__') { //allow only trays in applet mode as per setting if (count($trays) >= $this->max_trays) break; } if (self::get_tray_layout()=='checkered') $class = (($current_row+$current_col) % 2)?'Utils_Tray__group_even':'Utils_Tray__group_odd'; else $class = 'Utils_Tray__group_even'; $trays[] = array( 'class' => $class, 'col'=>$current_col, 'title'=>_V($def['__title__']), 'id'=>$tray_id); foreach ($def['__slots__'] as $slot) { $tray_slots_html[$tray_id][] = $slot['__html__']; if (isset($this->max_slots) && $this->max_slots != '__NULL__') { //allow slots in applet mode as per setting if (count($tray_slots_html[$tray_id]) >= $this->max_slots) continue 2; } } } eval_js( 'function Utils_Tray__trays() { var trays = '.json_encode($tray_slots_html).'; return trays; } jq( document ).ready(function() { var resizeId; jq(window).resize(function(){ clearTimeout(resizeId); resizeId = setTimeout(Utils_Tray__resize, 300); }); Utils_Tray__resize(); });'); load_js($this->get_module_dir().'tray.js'); $theme = $this->init_module('Base/Theme'); $icon = Base_ThemeCommon::get_template_file($this->get_type(),'pile2.png'); $theme->assign('main_page', !$applet); $theme->assign('caption', Utils_TrayCommon::caption()); $theme->assign('icon', $icon); $theme->assign('trays', $trays); $theme->assign('tray_cols', $tray_cols); if ($total_pending!=$displayed) { print (__('Displaying %d of %d pending', array($displayed, $total_pending))); } $theme->display('tray'); }
protected function hf_select($field, $operator, $value, $raw_sql_val, $field_def) { $commondata = isset($field_def['commondata']) && $field_def['commondata']; if ($commondata) { return $this->hf_commondata($field, $operator, $value, $raw_sql_val, $field_def); } $sql = ''; $vals = array(); list($field, $sub_field) = Utils_RecordBrowser_CritsSingle::parse_subfield($field); $multiselect = $field_def['type'] == 'multiselect'; $tab2 = isset($field_def['ref_table']) ? $field_def['ref_table'] : false; $single_tab = !($tab2 == '__RECORDSETS__' || count(explode(',', $tab2)) > 1); if ($sub_field && $single_tab && $tab2) { $col2 = explode('|', $sub_field); if (!isset($this->subqueries_tab_ids[$tab2])) { $this->subqueries_tab_ids[$tab2] = 0; } $tab_alias_id = $this->subqueries_tab_ids[$tab2]++; $nested_tab_alias = $this->tab_alias . '_' . $tab2 . '_' . $tab_alias_id; $crits = new Utils_RecordBrowser_Crits(); foreach ($col2 as $col) { $col = $col[0] == ':' ? $col : Utils_RecordBrowserCommon::get_field_id(trim($col)); if ($col) { $crits->_or(new Utils_RecordBrowser_CritsSingle($col, $operator, $value, false, $raw_sql_val)); } } if (!$crits->is_empty()) { $subquery = Utils_RecordBrowserCommon::build_query($tab2, $crits, $this->admin_mode, array(), $nested_tab_alias); $on_rule = $multiselect ? "{$field} LIKE CONCAT('%\\_\\_', {$nested_tab_alias}.id, '\\_\\_%')" : "{$field} = {$nested_tab_alias}.id"; $sql = "EXISTS (SELECT 1 FROM {$subquery['sql']} AND {$on_rule})"; $vals = $subquery['vals']; } } else { if ($raw_sql_val) { $sql = "{$field} {$operator} {$value}"; } elseif (!$value) { $sql = "{$field} IS NULL"; if (!$single_tab || $multiselect) { $sql .= " OR {$field}=''"; } } else { if ($single_tab && !$multiselect && $operator != DB::like()) { $operand = '%d'; } else { if (DB::is_postgresql()) { $field .= '::varchar'; } $operand = '%s'; } if ($multiselect) { $value = "%\\_\\_{$value}\\_\\_%"; $operator = DB::like(); } $sql = "({$field} {$operator} {$operand} AND {$field} IS NOT NULL)"; $vals[] = $value; } } return array($sql, $vals); }
public function check_field_definitions($data) { $ret = array(); if ($this->admin_field_mode=='edit') $type = $this->admin_field_type; else $type = $data['select_data_type']; if ($type == 'text') { $last = $this->admin_field_name?DB::GetOne('SELECT param FROM '.$this->tab.'_field WHERE field=%s', array($this->admin_field_name)):1; if ($data['text_length']<$last) $ret['text_length'] = __('Must be a number greater or equal %d', array($last)); if ($data['text_length']>255) $ret['text_length'] = __('Must be a number no greater than %d', array(255)); if (!is_numeric($data['text_length'])) $ret['text_length'] = __('Must be a number'); if ($data['text_length']=='') $ret['text_length'] = __('Field required'); } if ($type == 'select') { if (!isset($data['data_source'])) $data['data_source'] = $this->admin_field['data_source']; if (!isset($data['rset'])) $data['rset'] = $this->admin_field['rset']; if (!is_array($data['rset'])) $data['rset'] = array_filter(explode('__SEP__', $data['rset'])); // data from multiselect field passed in raw format here if ($data['data_source']=='commondata' && $data['commondata_table']=='') $ret['commondata_table'] = __('Field required'); if ($data['data_source']=='rset') { if ($data['label_field']!='') { $fs = explode(',', $data['label_field']); foreach($data['rset'] as $rset) $ret = $ret + $this->detranslate_field_names($rset, $fs); } } if ($this->admin_field_mode=='edit' && $data['select_type']=='select' && $this->admin_field['select_type']=='multiselect') { $count = DB::GetOne('SELECT COUNT(*) FROM '.$this->tab.'_data_1 WHERE f_'.Utils_RecordBrowserCommon::get_field_id($this->admin_field['field']).' '.DB::like().' %s', array('%_\_\__%')); if ($count!=0) { $ret['select_type'] = __('Cannot change type'); print('<span class="important_notice">'.__('Following records have more than one value stored in this field, making type change impossible:')); $recs = DB::GetCol('SELECT id FROM '.$this->tab.'_data_1 WHERE f_'.Utils_RecordBrowserCommon::get_field_id($this->admin_field['field']).' '.DB::like().' %s', array('%_\_\__%')); foreach ($recs as $r) print('<br/>'.Utils_RecordBrowserCommon::create_default_linked_label($this->tab, $r, false, false)); print('</span>'); } } } return empty($ret)?true:$ret; }
protected function validate_single(Utils_RecordBrowser_CritsSingle $crits, $record) { $id = isset($record['id']) ? $record['id'] : ''; list($field, $subfield) = Utils_RecordBrowser_CritsSingle::parse_subfield($crits->get_field()); $field = ltrim(Utils_RecordBrowserCommon::get_field_id($field), '_'); $subfield = ltrim(Utils_RecordBrowserCommon::get_field_id($subfield), '_'); $r_val = isset($record[$field]) ? $record[$field] : ''; $crit_value = $crits->get_value(); $field_definition = $this->get_field_definition($field); if ($subfield && $field_definition) { $sub_tab = isset($field_definition['ref_table']) ? $field_definition['ref_table'] : false; if ($sub_tab) { if (is_array($r_val)) { foreach ($r_val as $k => $v) { $r_val[$k] = Utils_RecordBrowserCommon::get_value($sub_tab, $v, $subfield); } } else { if ($r_val) { $r_val = Utils_RecordBrowserCommon::get_value($sub_tab, $r_val, $subfield); } else { $r_val = ''; } if (substr($r_val, 0, 2) == '__') { $r_val = Utils_RecordBrowserCommon::decode_multi($r_val); } // FIXME need better check } } } $k = strtolower($field); $record[$k] = $r_val; $result = false; $transform_date = false; if ($k == 'created_on') { $transform_date = 'timestamp'; } elseif ($k == 'edited_on') { $details = Utils_RecordBrowserCommon::get_record_info($this->tab, $id); $record[$k] = $details['edited_on']; $transform_date = 'timestamp'; } elseif ($field_definition) { $type = $field_definition['type']; if ($type == 'timestamp') { $transform_date = 'timestamp'; } elseif ($type == 'date') { $transform_date = 'date'; } } if ($transform_date == 'timestamp' && $crit_value) { $crit_value = Base_RegionalSettingsCommon::reg2time($crit_value, false); $crit_value = date('Y-m-d H:i:s', $crit_value); } else { if ($transform_date == 'date' && $crit_value) { $crit_value = Base_RegionalSettingsCommon::reg2time($crit_value, false); $crit_value = date('Y-m-d', $crit_value); } } $vv = explode('::', $crit_value, 2); if (isset($vv[1]) && is_callable($vv)) { $result = call_user_func_array($vv, array($this->tab, &$record, $k, $crits)); } else { if (is_array($record[$k])) { if ($crit_value) { $result = in_array($crit_value, $record[$k]); } else { $result = empty($record[$k]); } if ($crits->get_operator() == '!=') { $result = !$result; } } else { switch ($crits->get_operator()) { case '>': $result = $record[$k] > $crit_value; break; case '>=': $result = $record[$k] >= $crit_value; break; case '<': $result = $record[$k] < $crit_value; break; case '<=': $result = $record[$k] <= $crit_value; break; case '!=': $result = $record[$k] != $crit_value; break; case '=': $result = $record[$k] == $crit_value; break; case 'LIKE': $result = self::check_like_match($record[$k], $crit_value); break; case 'NOT LIKE': $result = !self::check_like_match($record[$k], $crit_value); break; } } } if ($crits->get_negation()) { $result = !$result; } if (!$result) { $this->issues[] = $k; } return $result; }
public function refresh_magic_callbacks() { /** @var $field RBO_FieldDefinition */ foreach ($this->fields() as $field) { if (!$field->magic_callbacks()) { continue; } $field_id = Utils_RecordBrowserCommon::get_field_id($field->name); if (!$field->QFfield_callback) { $qffield_callback = 'QFfield_' . $field_id; if (method_exists($this, $qffield_callback) || method_exists($this->class, $qffield_callback)) { Utils_RecordBrowserCommon::set_QFfield_callback($this->tab, $field->name, get_class($this) . '::__QFfield_magic_callback'); } else { Utils_RecordBrowserCommon::unset_QFfield_callback($this->tab, $field->name); } } if (!$field->display_callback) { $display_callback = 'display_' . $field_id; if (method_exists($this, $display_callback) || method_exists($this->class, $display_callback)) { Utils_RecordBrowserCommon::set_display_callback($this->tab, $field->name, get_class($this) . '::__display_magic_callback'); } else { Utils_RecordBrowserCommon::unset_display_callback($this->tab, $field->name); } } } }
private static function _get_field_id($property) { return Utils_RecordBrowserCommon::get_field_id($property); }
Utils_RecordBrowserCommon::new_record_field('contact', array('name' => _M('Edit'), 'type' => 'crm_contact', 'param' => array('field_type' => 'multiselect', 'crits' => array('Custom_CADES_AccessRestrictionsCommon', 'employee_crits'), 'format' => array('CRM_ContactsCommon', 'contact_format_no_company')), 'required' => false, 'extra' => true, 'filter' => false, 'visible' => false)); Utils_RecordBrowserCommon::new_record_field('contact', array('name' => _M('Add'), 'type' => 'crm_contact', 'param' => array('field_type' => 'multiselect', 'crits' => array('Custom_CADES_AccessRestrictionsCommon', 'employee_crits'), 'format' => array('CRM_ContactsCommon', 'contact_format_no_company')), 'required' => false, 'extra' => true, 'filter' => false, 'visible' => false)); Utils_RecordBrowserCommon::new_record_field('contact', array('name' => _M('Delete'), 'type' => 'crm_contact', 'param' => array('field_type' => 'multiselect', 'crits' => array('Custom_CADES_AccessRestrictionsCommon', 'employee_crits'), 'format' => array('CRM_ContactsCommon', 'contact_format_no_company')), 'required' => false, 'extra' => true, 'filter' => false, 'visible' => false)); // migrate data if (Utils_RecordBrowserCommon::check_table_name('cades_access_control', false, false)) { $recs = DB::Execute('SELECT * FROM cades_access_control_data_1 WHERE active=1'); $perms = array(); $rm_acl = array(); $count = 0; $done = 0; while ($r = $recs->FetchRow()) { if (!isset($rm_acl[$r['f_patient']])) { $rm_acl[$r['f_patient']] = array(); } $rm_acl[$r['f_patient']][] = $r['id']; $field = Utils_RecordBrowserCommon::get_field_id(Utils_CommonDataCommon::get_value('CADES/AccessLevel/' . $r['f_permission_level'])); $fields = explode('_', $field); foreach ($fields as $field) { if (!isset($perms[$r['f_patient']][$field])) { $perms[$r['f_patient']][$field] = array(); } $perms[$r['f_patient']][$field][] = $r['f_employee']; } } print 'Patients left: ' . count($perms) . '<br>'; foreach ($perms as $patient => $v) { print 'Patient ' . $patient; Utils_RecordBrowserCommon::update_record('contact', $patient, $v); print '... cleanup... '; DB::StartTrans(); foreach ($rm_acl[$patient] as $i) {
* @copyright Copyright © 2014, Xoff Software GmbH * @license MIT * @version 1.0 * @package epesi-tray */ defined("_VALID_ACCESS") || die; $cols_out = array(array('name' => __('Slot'), 'width' => 70), array('name' => __('Pending'), 'width' => 35)); $tray_settings = Utils_TrayCommon::get_trays(); $tray_def = array(); foreach ($tray_settings as $module => $module_settings) { foreach ($module_settings as $tab => $tab_settings) { $tray = Utils_TrayCommon::get_tray($tab, $tab_settings); if (count($tray['__slots__']) == 0) { continue; } $tray_id = Utils_RecordBrowserCommon::get_field_id($tray['__title__']); $tray_def += array($tray_id => array('__title__' => $tray['__title__'], '__weight__' => isset($tray['__weight__']) ? $tray['__weight__'] : 0)); foreach ($tray['__slots__'] as $slot_id => $slot_def) { $cap = _V($tray['__title__']) . ' - ' . _V($slot_def['__name__']); $sort = isset($tab_settings['__mobile__']['sort']) ? $tab_settings['__mobile__']['sort'] : array(); $cols = isset($tab_settings['__mobile__']['cols']) ? $tab_settings['__mobile__']['cols'] : array(); $open = '<a ' . mobile_stack_href(array('Utils_TrayCommon', 'mobile_tray_rb'), array($tab, $slot_def['__crits__'], $sort, $cols), $cap) . '>'; $close = '</a>'; $tray_def[$tray_id]['__slots__'][$slot_id]['__weight__'] = isset($slot_def['__weight__']) ? $slot_def['__weight__'] : 0; if (IPHONE) { $row_info = ''; $row_info .= '<div>' . _V($tray['__title__']) . '</div><div>' . _V($slot_def['__name__']) . ' (' . $slot_def['__count__'] . ')</div>'; $row = $open . $row_info . $close; $tray_def[$tray_id]['__slots__'][$slot_id]['__html__'] = '<li class="arrow">' . $row . '</li>'; } else { $row = array();
public static function get_slots($tab, $tray_settings) { if (!isset($tray_settings['__title__']) || !isset($tray_settings['__slots__'])) { return array(); } $ret = array(); foreach ($tray_settings['__slots__'] as $slot) { if (!isset($slot['__name__'])) { continue; } $crits = self::get_slot_crits($slot, $tray_settings); $slot_id = Utils_RecordBrowserCommon::get_field_id($slot['__name__']); $ret[$slot_id] = $slot + array('__id__' => $slot_id, '__count__' => Utils_RecordBrowserCommon::get_records_count($tab, $crits), '__crits__' => $crits); } return $ret; }
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); $tables = DB::GetAssoc('SELECT tab, tab FROM recordbrowser_table_properties'); foreach ($tables as $tab) { $fields = DB::GetAssoc('SELECT field, field FROM ' . $tab . '_field WHERE type=%s', array('checkbox')); foreach ($fields as $f) { $f = Utils_RecordBrowserCommon::get_field_id($f); DB::Execute('UPDATE ' . $tab . '_data_1 SET f_' . $f . '=NULL WHERE f_' . $f . '=0'); } }