diff --git a/addressbook/inc/class.addressbook_merge.inc.php b/addressbook/inc/class.addressbook_merge.inc.php index dd30daf847..4e1f3330f8 100644 --- a/addressbook/inc/class.addressbook_merge.inc.php +++ b/addressbook/inc/class.addressbook_merge.inc.php @@ -37,9 +37,10 @@ class addressbook_merge extends bo_merge * * @param int $id id of entry * @param string &$content=null content to create some replacements only if they are use + * @param array $eroles=null element roles with keys app, app_id and erole_id * @return array|boolean */ - protected function get_replacements($id,&$content=null) + protected function get_replacements($id,&$content=null,$eroles=null) { if (!($replacements = $this->contact_replacements($id))) { diff --git a/etemplate/inc/class.bo_merge.inc.php b/etemplate/inc/class.bo_merge.inc.php index 60b57e8ba2..21f4053137 100644 --- a/etemplate/inc/class.bo_merge.inc.php +++ b/etemplate/inc/class.bo_merge.inc.php @@ -69,9 +69,10 @@ abstract class bo_merge * * @param int $id id of entry * @param string &$content=null content to create some replacements only if they are use + * @param array $eroles=null element roles with keys app, app_id and erole_id * @return array|boolean array with replacements or false if entry not found */ - abstract protected function get_replacements($id,&$content=null); + abstract protected function get_replacements($id,&$content=null,$eroles=null); /** * Return if merge-print is implemented for given mime-type (and/or extension) @@ -123,7 +124,7 @@ abstract class bo_merge * Return replacements for a contact * * @param int|string|array $contact contact-array or id - * @param string $prefix='' prefix like eg. 'user' + * @param string $prefix='' prefix like eg. 'user' or 'erole' * @return array */ public function contact_replacements($contact,$prefix='') @@ -252,9 +253,10 @@ abstract class bo_merge * @param string &$err error-message on error * @param string $mimetype mimetype of complete document, eg. text/*, application/vnd.oasis.opendocument.text, application/rtf * @param array $fix=null regular expression => replacement pairs eg. to fix garbled placeholders + * @param array $eroles=null element roles with keys app, app_id and erole_id * @return string|boolean merged document or false on error */ - public function &merge($document,$ids,&$err,$mimetype,array $fix=null) + public function &merge($document,$ids,&$err,$mimetype,array $fix=null,array $eroles=null) { if (!($content = file_get_contents($document))) { @@ -266,7 +268,7 @@ abstract class bo_merge { $mimetype = 'application/rtf'; } - return $this->merge_string($content,$ids,$err,$mimetype,$fix); + return $this->merge_string($content,$ids,$err,$mimetype,$fix,$eroles); } /** @@ -277,10 +279,10 @@ abstract class bo_merge * @param string &$err error-message on error * @param string $mimetype mimetype of complete document, eg. text/*, application/vnd.oasis.opendocument.text, application/rtf * @param array $fix=null regular expression => replacement pairs eg. to fix garbled placeholders - * @param string $document=null path/url of document, if applicable + * @param array $eroles=null element roles with keys app, app_id and erole_id * @return string|boolean merged document or false on error */ - public function &merge_string($content,$ids,&$err,$mimetype,array $fix=null) + public function &merge_string($content,$ids,&$err,$mimetype,array $fix=null,array $eroles=null) { if ($mimetype == 'application/xml' && preg_match('/'.preg_quote('').'/',substr($content,0,200),$matches)) @@ -356,11 +358,11 @@ abstract class bo_merge if ($lableprint) $content = $Labelrepeat; // generate replacements - if (!($replacements = $this->get_replacements($id,$content))) + if(!($replacements = $this->get_replacements($id,$content,is_array($eroles) ? $eroles : null))) { $err = lang('Entry not found!'); return false; - } + } // some general replacements: current user, date and time if (strpos($content,'$$user/') !== null && ($user = $GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))) { @@ -635,9 +637,10 @@ abstract class bo_merge * * @param string $document vfs-path of document * @param array $ids array with contact id(s) + * @param array $eroles=null element roles with keys app, app_id and erole_id * @return string with error-message on error, otherwise it does NOT return */ - public function download($document,$ids) + public function download($document,$ids,$eroles=null) { $content_url = egw_vfs::PREFIX.$document; switch (($mimetype = egw_vfs::mime_content_type($document))) @@ -684,7 +687,7 @@ abstract class bo_merge $content_url = 'zip://'.$archive.'#'.($content_file = 'xl/sharedStrings.xml'); break; } - if (!($merged =& $this->merge($content_url,$ids,$err,$mimetype,$fix))) + if (!($merged =& $this->merge($content_url,$ids,$err,$mimetype,$fix,$eroles))) { return $err; } diff --git a/etemplate/inc/class.select_widget.inc.php b/etemplate/inc/class.select_widget.inc.php index 5169a85f59..cdd2654fb7 100644 --- a/etemplate/inc/class.select_widget.inc.php +++ b/etemplate/inc/class.select_widget.inc.php @@ -28,7 +28,7 @@ class select_widget 'post_process' => True, ); /** - * availible extensions and there names for the editor + * availible extensions and their names for the editor * @var array */ var $human_name = array( @@ -38,6 +38,7 @@ class select_widget 'select-country' => 'Select Country', 'select-state' => 'Select State', // US-states 'select-cat' => 'Select Category', // Category-Selection, size: -1=Single+All, 0=Single, >0=Multiple with size lines + 'select-erole' => 'Select Element role', 'select-account' => 'Select Account', // label=accounts(default),groups,both // size: -1=Single+not assigned, 0=Single, >0=Multiple 'select-year' => 'Select Year', @@ -212,6 +213,43 @@ class select_widget $cell['size'] = $rows.($type2 ? ','.$type2 : ''); $cell['no_lang'] = True; break; + + case 'select-erole': // $type2: extraStyleMultiselect + $eroles = new projectmanager_eroles_so(); + if ($readonly) + { + $cell['no_lang'] = True; + if ($value) + { + if (!is_array($value)) $value = explode(',',$value); + foreach($value as $key => $id) + { + if ($id && ($name = $eroles->id2title($id))) + { + $cell['sel_options'][$id] = $name; + } + else + { + unset($value[$key]); // remove not (longer) existing or inaccessible eroles + } + } + } + break; + } + + foreach($eroles->get_free_eroles() as $id => $data) + { + $global = $data['pm_id'] == 0 ? ' ('.lang('Global').')' : ''; + $cell['sel_options'][$data['role_id']] = array( + 'label' => $data['role_title'] . $global, + 'title' => $data['role_description'], + ); + } + + $cell['size'] = $rows.($type2 ? ','.$type2 : ''); + $cell['no_lang'] = True; + break; + case 'select-account': // options: #rows,{accounts(default)|both|groups|owngroups},{0(=lid)|1(default=name)|2(=lid+name),expand-multiselect-rows,not-to-show-accounts,...)} //echo "

select-account widget: name=$cell[name], type='$type', rows=$rows, readonly=".(int)($cell['readonly'] || $readonlys)."

\n"; @@ -507,8 +545,6 @@ class select_widget * will return no data (if it has a preprocessing method). The framework insures that * the post-processing of all contained widget has been done before. * - * Only used by select-dow so far - * * @param string $name form-name of the widget * @param mixed &$value the extension returns here it's input, if there's any * @param mixed &$extension_data persistent storage between calls or pre- and post-process @@ -536,6 +572,11 @@ class select_widget } } break; + + case 'select-erole': + $value = null; + if(is_array($value_in)) $value = implode(',',$value_in); + break; case 'select-dow': $value = 0;