public function view_entry($mode='view', $id = null, $defaults = array(), $show_actions=true) { Base_HelpCommon::screen_name('rb_'.$mode.'_'.$this->tab); if (isset($_SESSION['client']['recordbrowser']['admin_access'])) Utils_RecordBrowserCommon::$admin_access = true; self::$mode = $mode; if ($this->navigation_executed) { $this->navigation_executed = false; return true; } if ($this->check_for_jump()) return; $theme = $this->init_module('Base/Theme'); if ($this->isset_module_variable('id')) { $id = $this->get_module_variable('id'); $this->unset_module_variable('id'); } self::$browsed_records = null; Utils_RecordBrowserCommon::$cols_order = array(); $js = ($mode!='view'); $time = microtime(true); if ($this->is_back()) { self::$clone_result = 'canceled'; return $this->back(); } $this->init(); if (is_numeric($id)) { $id = intVal($id); self::$last_record = $this->record = Utils_RecordBrowserCommon::get_record($this->tab, $id, $mode!=='edit'); } else { self::$last_record = $this->record = $id; $id = intVal($this->record['id']); } if ($id===0) $id = null; if ($id!==null && is_numeric($id)) Utils_WatchdogCommon::notified($this->tab,$id); if($mode=='add') { foreach ($defaults as $k=>$v) $this->custom_defaults[$k] = $v; foreach($this->table_rows as $field => $args) if (!isset($this->custom_defaults[$args['id']])) $this->custom_defaults[$args['id']] = $args['type'] == 'multiselect' ? array() : ''; $this->custom_defaults['created_by'] = Acl::get_user(); } $access = $this->get_access($mode=='history'?'view':$mode, isset($this->record)?$this->record:$this->custom_defaults); if ($mode=='edit' || $mode=='add') $this->view_fields_permission = $this->get_access('view', isset($this->record)?$this->record:$this->custom_defaults); else $this->view_fields_permission = $access; if ($mode!='add' && (!$access || $this->record==null)) { if (Base_AclCommon::i_am_admin()) { Utils_RecordBrowserCommon::$admin_access = true; $access = $this->get_access($mode, isset($this->record)?$this->record:$this->custom_defaults); if ($mode=='edit' || $mode=='add') $this->view_fields_permission = $this->get_access('view', isset($this->record)?$this->record:$this->custom_defaults); else $this->view_fields_permission = $access; } else { print(__('You don\'t have permission to view this record.')); if ($show_actions===true || (is_array($show_actions) && (!isset($show_actions['back']) || $show_actions['back']))) { Base_ActionBarCommon::add('back', __('Back'), $this->create_back_href()); //Utils_ShortcutCommon::add(array('esc'), 'function(){'.$this->create_back_href_js().'}'); } return true; } } if ($mode=='add' && !$access) { print(__('You don\'t have permission to perform this action.')); if ($show_actions===true || (is_array($show_actions) && (!isset($show_actions['back']) || $show_actions['back']))) { Base_ActionBarCommon::add('back', __('Back'), $this->create_back_href()); //Utils_ShortcutCommon::add(array('esc'), 'function(){'.$this->create_back_href_js().'}'); } return true; } if($mode == 'add' || $mode == 'edit') { $theme -> assign('click2fill', '<div id="c2fBox"></div>'); load_js('modules/Utils/RecordBrowser/click2fill.js'); eval_js('initc2f("'.__('Scan/Edit').'","'.__('Paste data here with Ctrl-v, click button below, then click on separated words in specific order and click in text field where you want put those words. They will replace text in that field.').'")'); Base_ActionBarCommon::add('clone', __('Click 2 Fill'), 'href="javascript:void(0)" onclick="c2f()"'); } // if ($mode!='add' && !$this->record[':active'] && !Base_AclCommon::i_am_admin()) return $this->back(); $tb = $this->init_module('Utils/TabbedBrowser', null, 'recordbrowser_addons'); if ($mode=='history') $tb->set_inline_display(); self::$tab_param = $tb->get_path(); $form = $this->init_module('Libs/QuickForm',null, $mode); if(Base_User_SettingsCommon::get($this->get_type(), 'confirm_leave') && ($mode == 'add' || $mode == 'edit')) $form->set_confirm_leave_page(); $this->form = $form; if($mode!='add') Utils_RecordBrowserCommon::add_recent_entry($this->tab, Acl::get_user(),$id); $dp = Utils_RecordBrowserCommon::record_processing($this->tab, $mode!='add'?$this->record:$this->custom_defaults, ($mode=='view' || $mode=='history')?'view':$mode.'ing'); if($dp===false) return false; if (is_array($dp)) $defaults = $this->custom_defaults = self::$last_record = $this->record = $dp; if (self::$last_record===null) self::$last_record = $defaults; if($mode=='add') $form->setDefaults($defaults); switch ($mode) { case 'add': $this->action = _M('New record'); break; case 'edit': $this->action = _M('Edit record'); break; case 'view': $this->action = _M('View record'); break; case 'history': $this->action = _M('Record history view'); break; } $this->prepare_view_entry_details($this->record, $mode=='history'?'view':$mode, $id, $form); if ($mode==='edit' || $mode==='add') foreach($this->table_rows as $field => $args) { if (!$access[$args['id']]) $form->freeze($args['id']); } if ($form->exportValue('submited') && $form->validate()) { $values = $form->exportValues(); foreach ($defaults as $k=>$v) { if (!isset($values[$k]) && isset($this->view_fields_permission[$k]) && !$this->view_fields_permission[$k]) $values[$k] = $v; if (isset($access[$k]) && !$access[$k]) $values[$k] = $v; } foreach ($this->table_rows as $v) { if ($v['type']=='checkbox' && !isset($values[$v['id']])) $values[$v['id']]=0; } $values['id'] = $id; foreach ($this->custom_defaults as $k=>$v) if (!isset($values[$k])) $values[$k] = $v; if ($mode=='add') { $id = Utils_RecordBrowserCommon::new_record($this->tab, $values); self::$clone_result = $id; self::$clone_tab = $this->tab; return $this->back(); } $time_from = date('Y-m-d H:i:s', $this->get_module_variable('edit_start_time')); $ret = DB::Execute('SELECT * FROM '.$this->tab.'_edit_history WHERE edited_on>=%T AND edited_on<=%T AND '.$this->tab.'_id=%d',array($time_from, date('Y-m-d H:i:s'), $id)); if ($ret->EOF) { $this->update_record($id,$values); return $this->back(); } $this->dirty_read_changes($id, $time_from); } $form->add_error_closing_buttons(); if (($mode=='edit' || $mode=='add') && $show_actions!==false) { Utils_ShortcutCommon::add(array('Ctrl','S'), 'function(){'.$form->get_submit_form_js().'}'); } if ($mode=='edit') { $this->set_module_variable('edit_start_time',$time); } if ($show_actions!==false) { if ($mode=='view') { if ($this->get_access('edit',$this->record)) { Base_ActionBarCommon::add('edit', __('Edit'), $this->create_callback_href(array($this,'navigate'), array('view_entry','edit',$id))); Utils_ShortcutCommon::add(array('Ctrl','E'), 'function(){'.$this->create_callback_href_js(array($this,'navigate'), array('view_entry','edit',$id)).'}'); } if ($this->get_access('delete',$this->record)) { Base_ActionBarCommon::add('delete', __('Delete'), $this->create_confirm_callback_href(__('Are you sure you want to delete this record?'),array($this,'delete_record'),array($id))); } if ($this->get_access('add',$this->record)) { Base_ActionBarCommon::add('clone',__('Clone'), $this->create_confirm_callback_href(__('You are about to create a copy of this record. Do you want to continue?'),array($this,'clone_record'),array($id))); } /** @var Base_Print_Printer $printer */ $printer = Utils_RecordBrowserCommon::get_printer($this->tab); if ($printer) { Base_ActionBarCommon::add('print', __('Print'), $printer->get_href(array('tab' => $this->tab, 'record_id' => $this->record['id']))); } if ($show_actions===true || (is_array($show_actions) && (!isset($show_actions['back']) || $show_actions['back']))) Base_ActionBarCommon::add('back', __('Back'), $this->create_back_href()); } elseif($mode!='history') { Base_ActionBarCommon::add('save', __('Save'), $form->get_submit_form_href()); Base_ActionBarCommon::add('delete', __('Cancel'), $this->create_back_href()); } //Utils_ShortcutCommon::add(array('esc'), 'function(){'.$this->create_back_href_js().'}'); } if ($mode!='add') { $theme -> assign('info_tooltip', '<a '.Utils_TooltipCommon::open_tag_attrs(Utils_RecordBrowserCommon::get_html_record_info($this->tab, $id)).'><img border="0" src="'.Base_ThemeCommon::get_template_file('Utils_RecordBrowser','info.png').'" /></a>'); $row_data= array(); if ($mode!='history') { if ($this->favorites) $theme -> assign('fav_tooltip', Utils_RecordBrowserCommon::get_fav_button($this->tab, $id)); if ($this->watchdog) $theme -> assign('subscription_tooltip', Utils_WatchdogCommon::get_change_subscription_icon($this->tab, $id)); if ($this->full_history) { $info = Utils_RecordBrowserCommon::get_record_info($this->tab, $id); if ($info['edited_on']===null) $theme -> assign('history_tooltip', '<a '.Utils_TooltipCommon::open_tag_attrs(__('This record was never edited')).'><img border="0" src="'.Base_ThemeCommon::get_template_file('Utils_RecordBrowser','history_inactive.png').'" /></a>'); else $theme -> assign('history_tooltip', '<a '.Utils_TooltipCommon::open_tag_attrs(__('Click to view edit history of currently displayed record')).' '.$this->create_callback_href(array($this,'navigate'), array('view_edit_history', $id)).'><img border="0" src="'.Base_ThemeCommon::get_template_file('Utils_RecordBrowser','history.png').'" /></a>'); } if ($this->clipboard_pattern) { $theme -> assign('clipboard_tooltip', '<a '.Utils_TooltipCommon::open_tag_attrs(__('Click to export values to copy')).' '.Libs_LeightboxCommon::get_open_href('clipboard').'><img border="0" src="'.Base_ThemeCommon::get_template_file('Utils_RecordBrowser','clipboard.png').'" /></a>'); $text = $this->clipboard_pattern; $record = Utils_RecordBrowserCommon::get_record($this->tab, $id); /* for every field name store its value */ $data = array(); foreach($this->table_rows as $val) { $fval = Utils_RecordBrowserCommon::get_val($this->tab, $val['id'], $record, true); if(strlen($fval)) $data[$val['id']] = $fval; } /* some complicate preg match to find every occurence * of %{ .. {f_name} .. } pattern */ if (preg_match_all('/%\{(([^%\}\{]*?\{[^%\}\{]+?\}[^%\}\{]*?)+?)\}/', $text, $match)) { // match for all patterns %{...{..}...} foreach ($match[0] as $k => $matched_string) { $text_replace = $match[1][$k]; $changed = false; while(preg_match('/\{(.+?)\}/', $text_replace, $second_match)) { // match for keys in braces {key} $replace_value = ''; if(array_key_exists($second_match[1], $data)) { $replace_value = $data[$second_match[1]]; $changed = true; } $text_replace = str_replace($second_match[0], $replace_value, $text_replace); } if(! $changed ) $text_replace = ''; $text = str_replace($matched_string, $text_replace, $text); } } load_js("modules/Utils/RecordBrowser/selecttext.js"); /* remove all php new lines, replace <br>|<br/> to new lines and quote all special chars */ $ftext = htmlspecialchars(preg_replace('#<[bB][rR]/?>#', "\n", str_replace("\n", '', $text))); $flash_copy = '<object width="60" height="20">'. '<param name="FlashVars" value="txtToCopy='.$ftext.'">'. '<param name="movie" value="'.$this->get_module_dir().'copyButton.swf">'. '<embed src="'.$this->get_module_dir().'copyButton.swf" flashvars="txtToCopy='.$ftext.'" width="60" height="20">'. '</embed>'. '</object>'; $text = '<h3>'.__('Click Copy under the box or move mouse over box below to select text and hit Ctrl-c to copy it.').'</h3><div onmouseover="fnSelect(this)" style="border: 1px solid gray; margin: 15px; padding: 20px;">'.$text.'</div>'.$flash_copy; Libs_LeightboxCommon::display('clipboard',$text,__('Copy')); } } } if ($mode=='view') { $dp = Utils_RecordBrowserCommon::record_processing($this->tab, $this->record, 'display'); if ($dp && is_array($dp)) foreach ($dp as $k=>$v) $theme->assign($k, $v); } if ($mode=='view' || $mode=='history') $form->freeze(); $renderer = new HTML_QuickForm_Renderer_TCMSArraySmarty(); $form->accept($renderer); $data = $renderer->toArray(); print($data['javascript'].'<form '.$data['attributes'].'>'.$data['hidden']."\n"); $last_page = DB::GetOne('SELECT MIN(position) FROM '.$this->tab.'_field WHERE type = \'page_split\' AND field != \'General\''); if (!$last_page) $last_page = DB::GetOne('SELECT MAX(position) FROM '.$this->tab.'_field')+1; $label = DB::GetRow('SELECT field, param FROM '.$this->tab.'_field WHERE position=%s', array($last_page)); if ($label) { $cols = $label['param']; $label = $label['field']; } else $cols = false; $this->view_entry_details(1, $last_page, $data, $theme, true); $ret = DB::Execute('SELECT position, field, param FROM '.$this->tab.'_field WHERE type = \'page_split\' AND position > %d ORDER BY position', array($last_page)); $row = true; if ($mode=='view') print("</form>\n"); $tab_counter=-1; $additional_tabs = 0; $default_tab = null; while ($row) { $row = $ret->FetchRow(); if ($row) $pos = $row['position']; else $pos = DB::GetOne('SELECT MAX(position) FROM '.$this->tab.'_field WHERE active=1')+1; $valid_page = false; $hide_page = ($mode=='view' && Base_User_SettingsCommon::get('Utils/RecordBrowser','hide_empty')); foreach($this->table_rows as $field => $args) { if (!isset($data[$args['id']]) || $data[$args['id']]['type']=='hidden') continue; if ($args['position'] >= $last_page && ($pos+1 == -1 || $args['position'] < $pos+1)) { $valid_page = true; if ($hide_page && !$this->field_is_empty($this->record, $args['id'])) $hide_page = false; break; } } if ($valid_page && $pos - $last_page>1 && !isset($this->hide_tab[$label])) { $tb->set_tab(_V($label),array($this,'view_entry_details'), array($last_page, $pos+1, $data, null, false, $cols, _V($label)), $js); // TRSL if ($hide_page) { eval_js('$("'.$tb->get_tab_id(_V($label)).'").style.display="none";'); if ($default_tab===($tab_counter+1) || $tb->get_tab()==($tab_counter+1)) $default_tab = $tab_counter+2; } else $additional_tabs++; } $cols = $row['param']; $last_page = $pos; if ($row) $label = $row['field']; $tab_counter++; } if ($default_tab!==null) $tb->set_default_tab($default_tab); if ($mode!='history') { $ret = DB::Execute('SELECT * FROM recordbrowser_addon WHERE tab=%s AND enabled=1 ORDER BY pos', array($this->tab)); $addons_mod = array(); while ($row = $ret->FetchRow()) { if (ModuleManager::is_installed($row['module'])==-1) continue; if (is_callable(explode('::',$row['label']))) { $result = call_user_func(explode('::',$row['label']), $this->record, $this); if (!isset($result['show'])) $result['show']=true; if (($mode=='add' || $mode=='edit') && (!isset($result['show_in_edit']) || !$result['show_in_edit'])) continue; if ($result['show']==false) continue; if (!isset($result['label'])) $result['label']=''; $row['label'] = $result['label']; } else { if ($mode=='add' || $mode=='edit') continue; $labels = explode('#',$row['label']); foreach($labels as $i=>$label) $labels[$i] = _V($label); // translate labels from database $row['label'] = implode('#',$labels); } $mod_id = md5(serialize($row)); if (method_exists($row['module'].'Common',$row['func'].'_access') && !call_user_func(array($row['module'].'Common',$row['func'].'_access'), $this->record, $this)) continue; $addons_mod[$mod_id] = $this->init_module($row['module']); if (!method_exists($addons_mod[$mod_id],$row['func'])) $tb->set_tab($row['label'],array($this, 'broken_addon'), array(), $js); else $tb->set_tab($row['label'],array($this, 'display_module'), array(& $addons_mod[$mod_id], array($this->record, $this), $row['func']), $js); } } if ($additional_tabs==0 && ($mode=='add' || $mode=='edit' || $mode=='history')) print("</form>\n"); $this->display_module($tb); $tb->tag(); foreach ($this->fields_in_tabs as $label=>$fields) { $highlight = false; foreach ($fields as $f) { $err = $form->getElementError($f); if ($err) { $highlight = true; break; } } if ($highlight) $tb->tab_icon($label, Base_ThemeCommon::get_template_file('Utils_RecordBrowser','notify_error.png')); } if ($this->switch_to_addon) { $this->set_module_variable('switch_to_addon',false); if($tab_counter<0) $tab_counter=0; $ret = DB::Execute('SELECT * FROM recordbrowser_addon WHERE tab=%s AND enabled=1 ORDER BY pos', array($this->tab)); while ($row = $ret->FetchRow()) { if (ModuleManager::is_installed($row['module'])==-1) continue; if (is_callable(explode('::',$row['label']))) { $result = call_user_func(explode('::',$row['label']), $this->record,$this); if (isset($result['show']) && $result['show']==false) continue; $row['label'] = $result['label']; } if ($row['label']==$this->switch_to_addon) $this->switch_to_addon = $tab_counter; $tab_counter++; } $tb->switch_tab($this->switch_to_addon); location(array()); } if ($additional_tabs!=0 && ($mode=='add' || $mode=='edit' || $mode=='history')) print("</form>\n"); return true; } //view_entry