* * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ /* $Id$ */ /*! @class link_widget @author ralfbecker @abstract link-to: Widget to create links to an other entries of link-aware apps @abstract link-list: Widget to shows the links to an entry and a Unlink Button for each link @abstract link-string: comma-separated list of link-titles with a link to its view method, value is like get_links() @discussion This widget is independent of the UI as it only uses etemplate-widgets and has therefor no render-function. */ class link_widget { var $public_functions = array( 'pre_process' => True, 'post_process' => True ); var $human_name = array( // this are the names for the editor 'link-to' => 'LinkTo', 'link-list' => 'LinkList', 'link-string' => 'LinkString' ); var $debug = False; function link_widget($ui) { $this->link = CreateObject('infolog.bolink'); } function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) { if ($cell['type'] == 'link-to' && ($cell['readonly'] || $readonlys)) { // readonly ==> omit the whole widget $cell = $tmpl->empty_cell(); return; } if ($cell['type'] == 'link-string') { $str = ''; if (is_array($value)) { foreach ($value as $link) { $str .= ($str !== '' ? ', ' : '') . $tmpl->html->a_href( htmlentities($this->link->title($link['app'],$link['id'])), $this->link->view($link['app'],$link['id'],$link)); } } $cell['type'] = 'html'; $cell['readonly'] = True; // is allways readonly $value = $str; return True; } if (!is_array($value)) { $value = array( 'to_id' => $value, 'to_app' => $GLOBALS['phpgw_info']['flags']['currentapp'] ); } if ($this->debug) { echo "
start: $cell[type][$name]::pre_process: value ="; _debug_array($value); echo "extension_data[$cell[type]][$name] ="; _debug_array($extension_data); } switch ($type = $cell['type']) { case 'link-to': if ($value['button'] == 'upload' && !empty($value['file']) && $value['file']['tmp_name'] != 'none') { $value = $extension_data; $value['remark'] = ''; $tpl = new etemplate('etemplate.link_widget.attach'); } elseif ($value['button'] == 'search' && count($ids = $this->link->query($value['app'],$value['query']))) { $extension_data['app'] = $value['app']; $value = $extension_data; $value['options-id'] = $ids; $value['remark'] = ''; $tpl = new etemplate('etemplate.link_widget.create'); } else { if (!$value['button']) { $extension_data = $value; } $value = array_merge($extension_data,$value); $value['options-app'] = $this->link->app_list(); $tpl = new etemplate('etemplate.link_widget.search'); $tpl->set_cell_attribute('msg','disabled',$value['button'] != 'search'); } break; case 'link-list': $app = $value['to_app']; $id = isset($extension_data['to_id']) ? $extension_data['to_id'] : $value['to_id']; if ($this->debug) { echo "
link-list-widget[$name].preprocess: value="; _debug_array($value); } if (!isset($value['title'])) { $value['title'] = $this->link->title($app,$id); } $links = $this->link->get_links($app,$id); $value['anz_links'] = count($links); $extension_data = $value; if (!count($links)) { $cell = $tmpl->empty_cell(); $value = ''; return True; } $tpl = new etemplate('etemplate.link_widget.list'); $tpl->data[0]['A'] = $tmpl->data[0]['A']; // set width of first col like the tmpl. calling us for($row=$tpl->rows-1; list(,$link) = each($links); ++$row) { $value[$row] = $link; $value[$row]['title'] = $this->link->title($link['app'],$link['id'],$link); if (!is_array($link['id'])) { $value[$row]['view'] = $this->link->view($link['app'],$link['id'],$link); } } break; } $cell['size'] = $cell['name']; $cell['type'] = 'template'; $cell['name'] = $tpl->name; $cell['obj'] = &$tpl; if ($this->debug) { echo "
end: $type"."[$name]::pre_process: value ="; _debug_array($value); } return True; // extra Label is ok } function post_process($name,&$value,&$extension_data,&$loop,&$tmpl,$value_in) { $buttons = array('search','create','new','upload','attach'); while (!$button && list(,$bname) = each($buttons)) { $button = $value[$bname] ? $bname : ''; } if (is_array($value['unlink'])) { $button = 'unlink'; list($unlink) = @each($value['unlink']); } unset($value[$button]); $value = array_merge($extension_data,$value); if ($button && $this->debug) { echo "
start: link_widget[$name]::post_process: button='$button', unlink='$unlink', value ="; _debug_array($value); } switch ($button) { case 'create': if ($value['to_app']) // make the link { $link_id = $this->link->link($value['to_app'],$value['to_id'], $value['app'],$value['id'],$value['remark']); if (isset($value['primary']) && !$value['anz_links'] ) { $value['primary'] = $link_id; } } // fall-trough case 'search': case 'new': $extension_data = $value; $loop = True; break; case 'attach': if (is_array($value['file']) && $value['to_app']) { $link_id = $this->link->link($value['to_app'],$value['to_id'], $this->link->vfs_appname,$value['file'],$value['remark']); if (!is_array($value['to_id'])) { unlink($value['file']['tmp_name']); } unset($value['file']); } $extension_data = $value; $loop = True; break; case 'upload': // need to rename file, as php deletes it otherwise if (is_array($value['file']) && !empty($value['file']['tmp_name']) && $value['file']['tmp_name'] != 'none') { move_uploaded_file($value['file']['tmp_name'],$value['file']['tmp_name'].'+'); $value['file']['tmp_name'] .= '+'; $extension_data = $value; } else { unset($value['file']); $button = ''; } $loop = True; break; case 'unlink': if ($this->debug) { echo "
unlink(link-id=$unlink,$value[to_app],$value[to_id])
\n"; if (is_array($value['to_id'])) _debug_array($value['to_id']); } $this->link->unlink2($unlink,$value['to_app'],$value['to_id']); if (is_array($value['to_id'])) { $extension_data['to_id'] = $value['to_id']; // else changes from unlink get lost } $loop = True; break; } $value['button'] = $button; if ($this->debug) { echo "end: link_widget[$name]::post_process: value ="; _debug_array($value); } return True; } }