Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00031 require_once (PATH_t3lib."class.t3lib_tceforms.php"); 00032 require_once (PATH_t3lib."class.t3lib_tcemain.php"); 00033 00034 class tx_systodos extends mod_user_task { 00035 var $todoTypesCache = array(); 00036 var $insCounter=0; 00037 00038 function overview_main(&$pObj) { 00039 $icon = '<img src="'.$this->backPath.t3lib_extMgm::extRelPath("sys_todos").'ext_icon.gif" width=18 height=16 class="absmiddle">'; 00040 $content.=$pObj->doc->section($icon." ".$this->headLink("tx_systodos",1),$this->renderTaskList(),1,1,0,1); 00041 return $content; 00042 } 00043 function main() { 00044 global $SOBE,$BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS; 00045 00046 return $this->renderTasks(); 00047 } 00048 00049 00050 00051 // ************************ 00052 // TODO-tasks 00053 // *********************** 00054 function renderTaskList() { 00055 global $LANG; 00056 00057 $res = $this->exec_todos_getQueryForTodoRels(" AND sys_todos_users_mm.finished_instance=0"); 00058 $lines=array(); 00059 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00060 $lines[]='<nobr>'.$this->todos_link('<img src="'.$this->backPath.'gfx/todoicon_'.($row["cruser_id"]==$this->BE_USER->user["uid"]?"user":"group").'.gif" width="18" hspace=6 height="10" align=top border=0><strong>'.$this->fixed_lgd($row["title"]),-$row["mm_uid"]).'</strong></nobr><BR>'; 00061 } 00062 00063 $res = $this->exec_todos_getQueryForTodoRels("", "count(*)", 1); 00064 list($mc) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res); 00065 $lines[]='<nobr>'.$this->todos_link(sprintf($LANG->getLL("todos_index_msgs"),$mc),"0").'</nobr><BR>'; 00066 00067 $out = implode("",$lines); 00068 return $out; 00069 } 00070 function todos_link($str,$id) { 00071 $str='<a href="index.php?SET[function]=tx_systodos&sys_todos_uid='.$id.'#todo" target="list_frame" onClick="this.blur();">'.$str.'</a>'; 00072 return $str; 00073 } 00074 function tasks_makeTargetSelector($be_user_Array,$be_group_Array,$type,$returnOptsOnly=0) { 00075 global $LANG; 00076 // Plain todo 00077 $opt=array(); 00078 reset($be_user_Array); 00079 $opt[]='<option value="'.$this->BE_USER->user["uid"].'">'.$this->BE_USER->user["username"].' ['.$LANG->getLL("lSelf").']</option>'; 00080 while(list($uid,$dat)=each($be_user_Array)) { 00081 if ($uid!=$this->BE_USER->user["uid"]) { 00082 $opt[]='<option value="'.$uid.'"'.($dat["uid"]==$this->BE_USER->user["uid"]?" selected":"").'>'.htmlspecialchars($dat["username"].($dat["uid"]==$this->BE_USER->user["uid"]?' ['.$LANG->getLL("lSelf").']':' ('.$dat["realName"].')')).'</option>'; 00083 } 00084 } 00085 if (count($be_group_Array)) { 00086 $opt[]='<option value="0">'.$LANG->getLL("listSeparator_Groups").'</option>'; 00087 reset($be_group_Array); 00088 while(list($uid,$dat)=each($be_group_Array)) { 00089 $opt[]='<option value="-'.$uid.'">'.htmlspecialchars($dat["title"]).'</option>'; 00090 } 00091 } 00092 if ($returnOptsOnly) return $opt; 00093 return array($LANG->getLL("todos_target").": ", '<select name="data[sys_todos]['.$type.'][target_user]">'.implode("",$opt).'</select>'); 00094 } 00095 function renderTasks() { 00096 global $LANG; 00097 $theCode=""; 00098 00099 // Setting up general things for the function: 00100 $tUid = intval(t3lib_div::_GP("sys_todos_uid")); 00101 $this->pObj->doc->tableLayout = Array ( 00102 "defRow" => Array ( 00103 "0" => Array('<TD valign=top nowrap>','</td>'), 00104 "defCol" => Array('<td valign="top" width=99%>','</td>') 00105 ) 00106 ); 00107 $this->pObj->doc->table_TR = '<TR class="bgColor-10">'; 00108 $this->pObj->doc->table_TABLE = '<TABLE border=0 cellspacing=1 cellpadding=2 width=100%>'; 00109 00110 $this->todos_processIncoming($tUid); 00111 00112 // Get groupnames for todo-tasks 00113 $this->getUserAndGroupArrays(); // Users and groups blinded due to permissions, plus (third) the original user array with all users 00114 // debug($this->userGroupArray); 00115 00116 // Create Todo types array (workflows): 00117 $todoTypes=array(); 00118 $todoTypes["plain"]='['.$LANG->getLL("todos_plain").']'; 00119 if (t3lib_extMgm::isLoaded("sys_workflows")) { 00120 if ($this->BE_USER->isAdmin()) { 00121 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_workflows', 'sys_workflows.pid=0', '', 'sys_workflows.title'); 00122 } else { 00123 $res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 00124 "sys_workflows.*", 00125 "sys_workflows", 00126 "sys_workflows_algr_mm", 00127 "be_groups", 00128 "AND be_groups.uid IN (".($this->BE_USER->groupList?$this->BE_USER->groupList:0).") 00129 AND sys_workflows.pid=0 00130 AND sys_workflows.hidden=0", 00131 'sys_workflows.uid', 00132 'sys_workflows.title' 00133 ); 00134 } 00135 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00136 $todoTypes["wf_".$row["uid"]]=$row["title"]; 00137 } 00138 } 00139 00140 // Printing the todo list of a user: 00141 $theCode.= $this->todos_displayLists($todoTypes,$tUid); 00142 00143 // Display todo: 00144 if ($tUid) { 00145 $theCode.= $this->todos_displayTodo($todoTypes,$tUid); 00146 } 00147 00148 // New todo: 00149 $theCode.= $this->todos_createForm($todoTypes); 00150 00151 return $theCode; 00152 } 00153 function todos_finalizeWorkflow($workflowRecord,$relRecord) { 00154 global $TCA; 00155 list($table,$uid)=explode(":",$relRecord["rec_reference"]); 00156 00157 // debug($workflowRecord); 00158 // debug($relRecord); 00159 00160 if ($workflowRecord["tablename"]==$table && $TCA[$table]) { 00161 $itemRecord = t3lib_BEfunc::getRecord($table,$uid); 00162 00163 if (is_array($itemRecord)) { 00164 $dataArr=array(); 00165 $cmdArr=array(); 00166 00167 // Changing permissions for the page: 00168 if ($table=="pages" && $workflowRecord["final_set_perms"]) { 00169 $dataArr[$table][$uid]["perms_userid"] = $workflowRecord["final_perms_userid"]; 00170 $dataArr[$table][$uid]["perms_groupid"] = $workflowRecord["final_perms_groupid"]; 00171 $dataArr[$table][$uid]["perms_user"] = $workflowRecord["final_perms_user"]; 00172 $dataArr[$table][$uid]["perms_group"] = $workflowRecord["final_perms_group"]; 00173 $dataArr[$table][$uid]["perms_everybody"] = $workflowRecord["final_perms_everybody"]; 00174 } 00175 00176 // Unhide: 00177 if ($workflowRecord["final_unhide"]) { 00178 $hCol = is_array($TCA[$table]["ctrl"]["enablecolumns"]) ? $TCA[$table]["ctrl"]["enablecolumns"]["disabled"] : ""; 00179 if ($hCol) { 00180 $dataArr[$table][$uid][$hCol]=0; 00181 } 00182 } 00183 00184 // Target: 00185 list($target_pid) = explode(",",$workflowRecord["final_target"]); 00186 $targetPage = t3lib_BEfunc::getRecord("pages",$target_pid); 00187 if (is_array($targetPage)) { 00188 $cmdArr[$table][$uid]["move"]=$targetPage["uid"]; 00189 } 00190 //debug($workflowRecord["final_target"]); 00191 //debug($cmdArr); 00192 00193 00194 // Perform it (as ADMIN) 00195 $tce = t3lib_div::makeInstance("t3lib_TCEmain"); 00196 $tce->stripslashes_values=0; 00197 $tce->start($dataArr,$cmdArr,$this->BE_USER); 00198 $tce->admin=1; // Set ADMIN permission for this operation. 00199 $tce->process_datamap(); 00200 $tce->process_cmdmap(); 00201 unset($tce); 00202 00203 return true; 00204 } else { 00205 debug("ERROR: The reference record was not there!"); 00206 } 00207 } else { 00208 debug("ERROR: Strange thing, the table name was not valid!"); 00209 } 00210 } 00211 function todos_beginWorkflow($workflowRecord) { 00212 global $TCA; 00213 list($working_area_pid) = explode(",",$workflowRecord["working_area"]); 00214 $table=$workflowRecord["tablename"]; 00215 $workingPage = t3lib_BEfunc::getRecord("pages",$working_area_pid); 00216 if (is_array($workingPage) && $TCA[$table]) { 00217 $data[$table]["NEW"]=array(); 00218 $data[$table]["NEW"]["pid"]=$workingPage["uid"]; 00219 00220 $tce = t3lib_div::makeInstance("t3lib_TCEmain"); 00221 $tce->stripslashes_values=0; 00222 $TCAdefaultOverride = $this->BE_USER->getTSConfigProp("TCAdefaults"); 00223 if (is_array($TCAdefaultOverride)) { 00224 $tce->setDefaultsFromUserTS($TCAdefaultOverride); 00225 } 00226 $tce->start($data,array(),$this->BE_USER); 00227 $tce->admin=1; // Set ADMIN permission for this operation. 00228 $tce->process_datamap(); 00229 00230 if ($tce->substNEWwithIDs["NEW"]) { 00231 return $table.":".$tce->substNEWwithIDs["NEW"]; 00232 } 00233 } else { 00234 debug("ERROR: No working area page for workflow is defined!"); 00235 } 00236 } 00237 function todos_processIncoming($tUid) { 00238 global $LANG; 00239 00240 // PROCESSING: 00241 $data = t3lib_div::_GP("data"); 00242 //debug($data); 00243 //debug(t3lib_div::_GP("create_todo")); 00244 00245 // ******************************** 00246 // Instance updated 00247 // ******************************** 00248 if (t3lib_div::_GP("newStatus") && is_array($data["sys_todos_users_mm"])) { // A status is updated 00249 $RD_URL=""; 00250 reset($data["sys_todos_users_mm"]); 00251 while(list($key)=each($data["sys_todos_users_mm"])) { 00252 $key = intval($key); 00253 $res = $this->exec_todos_getQueryForTodoRels(" AND sys_todos_users_mm.mm_uid=".$key, "sys_todos_users_mm.*,sys_todos.cruser_id,sys_todos.type", 1); 00254 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00255 if ($data["sys_todos_users_mm"][$key]["status"]["code"]>0) { 00256 $wF = $row["type"]; 00257 if (substr($wF,0,3)=="wf_" && t3lib_extMgm::isLoaded("sys_workflows")) { 00258 $workflowRecord=t3lib_BEfunc::getRecord("sys_workflows",substr($wF,3)); 00259 } else {unset($workflowRecord);} 00260 00261 $noUpdate=0; 00262 // debug($row); 00263 00264 $status_log = unserialize($row["status_log"]); 00265 if (!is_array($status_log)) $status_log=array(); 00266 $statLogDat = array( 00267 "code" => $data["sys_todos_users_mm"][$key]["status"]["code"], 00268 "issuer" => $GLOBALS["BE_USER"]->user["uid"], 00269 "tstamp" => time(), 00270 "uid_foreign_before" => $row["uid_foreign"], 00271 "comment" => $data["sys_todos_users_mm"][$key]["status"]["comment"] 00272 ); 00273 00274 $field_values=array(); 00275 $field_values["status"]=$data["sys_todos_users_mm"][$key]["status"]["code"]; 00276 $field_values["tstamp"]=time(); 00277 $field_values["is_read"]=0; // Not used yet, but the point is that this flag is set when a target users looks at the item for the first time. This may later be used to inform the owner of the item whether it has been looked at or not. Here it's reset for every change to the log. Maybe it should be changed for each new target only.? 00278 00279 // target: 00280 switch($field_values["status"]) { 00281 case 1: // todos_status_comment, no change of target 00282 break; 00283 case 2: // todos_status_begin, no change of target (at this point) 00284 if (is_array($workflowRecord) && $workflowRecord["tablename"] && !$row["rec_reference"]) { 00285 $recId = $this->todos_beginWorkflow($workflowRecord); 00286 if ($recId) { 00287 $field_values["rec_reference"]=$recId; 00288 $RD_URL = $this->getEditRedirectUrlForReference($recId); 00289 } else { 00290 debug("ERROR: The record was not created, so either the workflow is not properly configured or the user did not have permissions to create the record (check the system log for details if this is the case)"); 00291 } 00292 } else { 00293 debug("ERROR: No workflow record found OR no tablename defined OR there was already a record reference in the record!"); 00294 } 00295 break; 00296 case 3: // todos_status_end, pass on to reviewer if found (may select reviewer in form), else back to admin 00297 $first=0; 00298 // Trying to find a review user if any and apply this user instead of the owner. 00299 if (t3lib_extMgm::isLoaded("sys_workflows") && is_array($workflowRecord) && $workflowRecord["tablename"]) { 00300 $revUsers = $this->todos_getReviewUsers($workflowRecord["uid"]); 00301 reset($revUsers); 00302 while(list($u_id)=each($revUsers)) { 00303 // CHECK IF the submittet target user matches one of the reviewers 00304 if (!$first) $first=$u_id; 00305 if ($u_id == $data["sys_todos_users_mm"][$key]["status"]["newTarget"]) { 00306 $field_values["uid_foreign"]=$u_id; 00307 break; 00308 } 00309 } 00310 00311 } 00312 if (!$field_values["uid_foreign"]) { // IF the target is NOT found yet (may have been between the submitted targets.) 00313 $field_values["uid_foreign"]= $first ? $first : $row["cruser_id"]; // ... select the first review user and if that is not set, select the owner 00314 } 00315 break; 00316 case 4: // todos_status_passOn, just pass on to selected target 00317 if (intval($data["sys_todos_users_mm"][$key]["status"]["newTarget"])) { 00318 $field_values["uid_foreign"]=$data["sys_todos_users_mm"][$key]["status"]["newTarget"]; 00319 } 00320 break; 00321 case 5: // todos_status_reject, target = sender user 00322 $field_values["uid_foreign"]=$row["cruser_id"]; 00323 break; 00324 00325 00326 case 100: // Reset status-log 00327 if ($this->BE_USER->user["uid"]==$row["cruser_id"]) { // Must own 00328 $statLogDat["status_log_clear"]=1; 00329 } else {$noUpdate=1;} 00330 break; 00331 case 103: // Finalize 00332 if ($this->BE_USER->user["uid"]==$row["cruser_id"]) { // Must own 00333 $field_values["uid_foreign"]=$row["cruser_id"]; 00334 $field_values["finalized"] = $this->todos_finalizeWorkflow($workflowRecord,$row) ? 1 : 0; 00335 } else {$noUpdate=1;} 00336 break; 00337 /* case 101: 00338 if ($this->BE_USER->user["uid"]==$row["cruser_id"]) { // Must own 00339 $field_values["deleted"]=1; 00340 // debug("DELETE"); 00341 } 00342 break; 00343 */ case 102: 00344 if ($this->BE_USER->user["uid"]==$row["cruser_id"]) { // Must own 00345 $statLogDat["uid_foreign"] = $data["sys_todos_users_mm"][$key]["status"]["newTarget"]; 00346 00347 $field_values = array( 00348 'uid_local' => $row['uid_local'], 00349 'uid_foreign' => $statLogDat['uid_foreign'], 00350 'status' => 102, 00351 'tstamp' => time(), 00352 'status_log' => serialize(array($statLogDat)) 00353 ); 00354 00355 $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_todos_users_mm', $field_values); 00356 00357 $noUpdate = 1; 00358 } 00359 break; 00360 } 00361 00362 if (!$noUpdate) { 00363 if (isset($field_values["uid_foreign"])) $statLogDat["uid_foreign"] = $field_values["uid_foreign"]; 00364 $status_log[]=$statLogDat; 00365 $field_values["status_log"]=serialize($status_log); 00366 00367 $GLOBALS['TYPO3_DB']->exec_UPDATEquery("sys_todos_users_mm", "mm_uid=".intval($key), $field_values); 00368 } 00369 } 00370 00371 // Finished? 00372 if (isset($data["sys_todos_users_mm"][$key]["finished_instance"]) && $this->BE_USER->user["uid"]==$row["cruser_id"]) { 00373 00374 $field_values = array( 00375 'finished_instance' => $data['sys_todos_users_mm'][$key]['finished_instance']?1:0 00376 ); 00377 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('sys_todos_users_mm', 'mm_uid='.intval($key), $field_values); 00378 } 00379 } 00380 } 00381 00382 00383 // If redirect, do that. 00384 if ($RD_URL) { 00385 header("Location: ".t3lib_div::locationHeaderUrl($RD_URL)); 00386 } 00387 } 00388 00389 // *********************************** 00390 // sys_todos are created/updated 00391 // *********************************** 00392 if (t3lib_div::_GP("create_todo") && is_array($data["sys_todos"])) { // A todo is created 00393 reset($data["sys_todos"]); 00394 $key = key($data["sys_todos"]); 00395 if ($key=="NEW") { 00396 if ($data["sys_todos"][$key]["target_user"] && $data["sys_todos"][$key]["type"] && $data["sys_todos"][$key]["title"]) { 00397 00398 $fields_values = array( 00399 'title' => $data['sys_todos'][$key]['title'], 00400 'type' => $data['sys_todos'][$key]['type'], 00401 'deadline' => $data['sys_todos'][$key]['deadline'], 00402 'description' => $data['sys_todos'][$key]['description'], 00403 'deleted' => 0, 00404 'finished' => 0, 00405 'tstamp' => time(), 00406 'crdate' => time(), 00407 'cruser_id' => $this->BE_USER->user['uid'] 00408 ); 00409 $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_todos', $fields_values); 00410 00411 // Relation: 00412 if (!$GLOBALS['TYPO3_DB']->sql_error()) { 00413 $fields_values = array( 00414 'uid_local' => $GLOBALS['TYPO3_DB']->sql_insert_id(), 00415 'uid_foreign' => $data['sys_todos'][$key]['target_user'], 00416 'tstamp' => time() 00417 ); 00418 $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_todos_users_mm', $fields_values); 00419 } 00420 00421 // SEnding email notification and filling the emRec array: 00422 $tempQ = FALSE; 00423 $emRec = array(); 00424 if ($data["sys_todos"][$key]["target_user"]>0) { // Ordinary user 00425 $tempQ = TRUE; 00426 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,username,realName,email', 'be_users', 'uid='.intval($data['sys_todos'][$key]['target_user']).t3lib_BEfunc::deleteClause('be_users')); 00427 } 00428 if ($data['sys_todos'][$key]['target_user']<0) { // Users in group 00429 $tempQ = TRUE; 00430 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,username,realName,email', 'be_users', $GLOBALS['TYPO3_DB']->listQuery('usergroup_cached_list', abs($data['sys_todos'][$key]['target_user']), 'be_users').t3lib_BEfunc::deleteClause('be_users')); 00431 } 00432 if ($tempQ) { 00433 $sAE = t3lib_div::_GP('sendAsEmail'); // This flag must be set in order for the email to get sent 00434 while($brow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00435 $sendM=0; 00436 if ($sAE && strstr($brow["email"],"@") && $brow["uid"]!=$this->BE_USER->user["uid"]) { // Send-flag must be set, the user must have an email address and finally mails are not sent to the creating user, should he be in the group. 00437 $this->sendEmail($brow["email"],$data["sys_todos"][$key]["title"],$data["sys_todos"][$key]["description"]); 00438 $sendM=1; 00439 } 00440 $emRec[] = $brow["username"].($sendM ? " (".$brow["email"].")" : ""); 00441 } 00442 } 00443 if (count($emRec)) { // $emRec just stores the users which is in the target group/target-user and here the list is displayed for convenience. 00444 $emailList=implode("<BR> ",$emRec); 00445 $theCode.= $this->pObj->doc->section($LANG->getLL("todos_created"),$LANG->getLL("todos_created_msg")."<BR> ".$emailList,0,1,1); 00446 } 00447 } else { 00448 // $theCode.= $this->pObj->doc->section($LANG->getLL("todos_created"),$this->errorIcon().$GLOBALS["TBE_TEMPLATE"]->rfw($LANG->getLL("todos_createdError_msg")),0,1); 00449 } 00450 } else { // Edit todo: 00451 $editRow = t3lib_BEfunc::getRecordRaw("sys_todos","uid=".$key); 00452 if (is_array($editRow) && $editRow["cruser_id"]==$this->BE_USER->user["uid"] && $data["sys_todos"][$key]["title"]) { 00453 $fields_values = array( 00454 'title' => $data['sys_todos'][$key]['title'], 00455 'deadline' => $data['sys_todos'][$key]['deadline'], 00456 'description' => $data['sys_todos'][$key]['description'], 00457 'tstamp' => time() 00458 ); 00459 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('sys_todos', 'uid='.intval($key), $fields_values); 00460 } 00461 } 00462 } 00463 00464 00465 // ************************************************* 00466 // sys_todos / instances are updated regarding DONE 00467 // ************************************************* 00468 if (t3lib_div::_GP("marked_todos")) { 00469 $action = t3lib_div::_GP("marked_todos_action"); 00470 $done = t3lib_div::_GP("DONE"); 00471 if (is_array($done)) { 00472 while(list($uidKey,$value)=each($done)) { 00473 $uidKey = intval($uidKey); 00474 if ($uidKey<0) { 00475 $uidKey = abs($uidKey); 00476 $sys_todos_users_mm_row = t3lib_BEfunc::getRecordRaw("sys_todos_users_mm","mm_uid=".$uidKey); 00477 if (is_array($sys_todos_users_mm_row)) { 00478 $sys_todos_row = t3lib_BEfunc::getRecordRaw("sys_todos","uid=".intval($sys_todos_users_mm_row["uid_local"])); 00479 if (is_array($sys_todos_row) && $sys_todos_row["cruser_id"]==$this->BE_USER->user["uid"]) { 00480 00481 $fields_values = array( 00482 "finished_instance" => $value?1:0 00483 ); 00484 if ($action==127 && $value) $fields_values["deleted"]=1; 00485 00486 $GLOBALS['TYPO3_DB']->exec_UPDATEquery("sys_todos_users_mm", "mm_uid=".intval($uidKey), $fields_values); 00487 00488 // Check if there are any sys_todos_users_mm left, which are not deleted. If there are not, delete the sys_todos item 00489 $isNotDeleted = t3lib_BEfunc::getRecordRaw("sys_todos_users_mm","uid_local=".intval($sys_todos_row["uid"])." AND deleted=0"); 00490 if (!is_array($isNotDeleted)) { 00491 // Delete sys_todos 00492 $fields_values = array( 00493 "finished" => 1, 00494 "deleted" => 1 00495 ); 00496 $GLOBALS['TYPO3_DB']->exec_UPDATEquery("sys_todos", "uid=".intval($sys_todos_row["uid"]), $fields_values); 00497 } 00498 } 00499 } 00500 00501 } else { 00502 $sys_todos_row = t3lib_BEfunc::getRecordRaw("sys_todos","uid=".intval($uidKey)); 00503 if (is_array($sys_todos_row) && $sys_todos_row["cruser_id"]==$this->BE_USER->user["uid"]) { 00504 $fields_values = array("finished" => $value?1:0); 00505 if ($action==127 && $value) $fields_values["deleted"] = 1; 00506 00507 $GLOBALS['TYPO3_DB']->exec_UPDATEquery("sys_todos", "uid=".$uidKey, $fields_values); 00508 00509 // Also set status for instances, if they are checked for main item: 00510 if ($fields_values["deleted"]) { 00511 $inst_fields_values = array("deleted" => 1); 00512 00513 // Update all relations to the sys_todos 00514 $GLOBALS['TYPO3_DB']->exec_UPDATEquery("sys_todos_users_mm", "uid_local=".intval($uidKey), $inst_fields_values); 00515 } 00516 } 00517 } 00518 } 00519 } 00520 } 00521 return $theCode; 00522 } 00523 function todos_workflowTitle($todoTypes,$type) { 00524 if (!isset($this->todoTypesCache[$type])) { 00525 if (isset($todoTypes[$type])) { 00526 $this->todoTypesCache[$type] = $todoTypes[$type]; 00527 } elseif (substr($type,0,3)=="wf_" && t3lib_extMgm::isLoaded("sys_workflows")) { 00528 $workflowRecord=t3lib_BEfunc::getRecord("sys_workflows",substr($type,3)); 00529 $this->todoTypesCache[$type] = $workflowRecord["title"]; 00530 } 00531 } 00532 return $this->todoTypesCache[$type]; 00533 } 00534 function todos_displayTodo($todoTypes,$tUid) { 00535 global $LANG; 00536 00537 if ($tUid>0) { 00538 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_todos', 'uid='.intval($tUid).' AND cruser_id='.intval($this->BE_USER->user['uid']).' AND NOT deleted'); 00539 } else { 00540 $res = $this->exec_todos_getQueryForTodoRels(" AND sys_todos_users_mm.mm_uid=".abs($tUid)); 00541 } 00542 00543 $msg = array(); 00544 $workflowRecord = ""; 00545 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00546 $editIcon = $row["cruser_id"]==$this->BE_USER->user["uid"] ? '<a href="index.php?sys_todos_uid='.$tUid.'&editTodo=1#todo"><img src="'.$this->backPath.'gfx/edit2.gif" width="11" height="12" vspace=2 border="0" align=top></a>' : ''; 00547 $iconName = 'tc_todos'.($row["cruser_id"]==$this->BE_USER->user["uid"]?'':'_foreign').'.gif'; 00548 $header = '<nobr><img src="'.$this->backPath.'gfx/i/'.$iconName.'" width="18" height="16" hspace=2 border=0 align=top title="'.$LANG->getLL("todos_item").' #'.$row["uid"].'">'.$editIcon.' <strong>'.htmlspecialchars($row["title"]).'</strong></nobr><BR>'; 00549 $formA = array(); 00550 $formA[] = array($LANG->getLL("todos_createdBy").": ", $this->userGroupArray[2][$row["cruser_id"]]["username"]." (".$this->userGroupArray[2][$row["cruser_id"]]["realName"]."), ".$this->dateTimeAge($row["crdate"],-1)); 00551 $dLine = $this->dateTimeAge($row["deadline"],-1)." "; 00552 if ($row["deadline"]<time()) $dLine = '<span class="typo3-red">'.$dLine.'</span>'; 00553 $formA[] = array($LANG->getLL("todos_deadline").": ", $dLine); 00554 $formA[] = array($LANG->getLL("todos_description").": ", nl2br($row["description"])." "); 00555 00556 if ($row["type"] && $row["type"]!="plain") { 00557 $formA[]=array($LANG->getLL("todos_type").": ", $this->todos_workflowTitle($todoTypes,$row["type"])); 00558 $wF = $row["type"]; 00559 if (substr($wF,0,3)=="wf_" && t3lib_extMgm::isLoaded("sys_workflows")) { 00560 $workflowRecord=t3lib_BEfunc::getRecord("sys_workflows",substr($wF,3)); 00561 if (is_array($workflowRecord) && $workflowRecord["tablename"]) { 00562 $formA[]=array($LANG->getLL("todos_workflowDescr").": ", $workflowRecord["description"]); 00563 // debug($workflowRecord); 00564 } 00565 } 00566 } 00567 00568 $msg[] = $header.$this->pObj->doc->table($formA); 00569 00570 if (!t3lib_div::_GP("editTodo")) { 00571 $res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 00572 "sys_todos_users_mm.*", 00573 "sys_todos", 00574 "sys_todos_users_mm", 00575 "", 00576 "AND NOT sys_todos_users_mm.deleted AND NOT sys_todos.deleted".($tUid<0?" AND sys_todos_users_mm.mm_uid=":" AND sys_todos.uid=").abs($tUid) 00577 ); 00578 00579 // Display todo log: 00580 $this->insCounter=0; 00581 while ($rel_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00582 $msg[] = "<HR>".$this->todos_printStatus($rel_row,$row,$workflowRecord,$tUid,$GLOBALS['TYPO3_DB']->sql_num_rows($res)); 00583 } 00584 $msg[]='<BR><input type="submit" name="newStatus" value="'.$LANG->getLL("todos_newStatus").'"> <input type="submit" name="cancel" value="'.$LANG->getLL("lCancel").'" onClick="document.editform.sys_todos_uid.value=0;"> 00585 <input type="hidden" name="sys_todos_uid" value="'.$tUid.'"><BR>'; 00586 } 00587 00588 if (count($msg)) { 00589 $theCode.= $this->pObj->doc->spacer(20); 00590 $theCode.= $this->pObj->doc->section('<a name="todo"></a>'.$LANG->getLL("todo_details",1),implode("",$msg),0,1,0,1); 00591 } 00592 00593 // Edit form: 00594 if (t3lib_div::_GP("editTodo") && $row["cruser_id"]==$this->BE_USER->user["uid"]) { 00595 $theCode.=$this->todos_createForm($todoTypes,$row); 00596 } 00597 } 00598 return $theCode; 00599 } 00600 function todos_printStatus($rel_row,$todo_row,$workflow_row,$tUid,$countOfInstances=0) { 00601 global $LANG, $TCA; 00602 00603 if (t3lib_extMgm::isLoaded("sys_workflows") && is_array($workflow_row)) { 00604 $revUsers = $this->todos_getReviewUsers($workflow_row["uid"]); 00605 } else $revUsers=array(); 00606 00607 $noExtraFields=0; 00608 00609 $theCode=""; 00610 $statusLabels = array(); 00611 $statusLabels[1]=htmlspecialchars($LANG->getLL("todos_status_comment")); 00612 $statusLabels[2]=htmlspecialchars($LANG->getLL("todos_status_begin")); 00613 $statusLabels[3]=htmlspecialchars($LANG->getLL("todos_status_end")); 00614 $statusLabels[4]=htmlspecialchars($LANG->getLL("todos_status_passOn")); 00615 $statusLabels[5]=htmlspecialchars($LANG->getLL("todos_status_reject")); 00616 00617 $statusLabels[100]=htmlspecialchars($LANG->getLL("todos_status_resetStatus")); 00618 $statusLabels[103]=htmlspecialchars($LANG->getLL("todos_status_finalize")); 00619 // $statusLabels[101]=htmlspecialchars($LANG->getLL("todos_status_delete")); 00620 $statusLabels[102]=htmlspecialchars($LANG->getLL("todos_status_newInstance")); 00621 00622 $allowedTargetCodes = "2,3,4,102"; 00623 00624 $this->insCounter++; 00625 //$this->insCounter.' / 00626 $iSt = ' ('.$LANG->getLL("todos_instance").' #'.$rel_row["mm_uid"].')'; 00627 00628 $theCode.='<BR><strong>'.$LANG->getLL("todos_logEntries").$iSt.':</strong><BR>'; 00629 $log = unserialize($rel_row["status_log"]); 00630 $prevUsersGroups=array(); 00631 if (is_array($log)) { 00632 $lines=array(); 00633 00634 reset($log); 00635 $c=0; 00636 while(list(,$logDat)=each($log)) { 00637 $prevUsersGroups[] = $logDat["uid_foreign_before"]; 00638 // debug($logDat); 00639 if ($logDat["status_log_clear"]) { 00640 $c=0; 00641 $lines=array(); 00642 } 00643 00644 $c++; 00645 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10'; 00646 $lines[]='<tr class="'.$bgColorClass.'"> 00647 <td valign=top nowrap width=10%>'. 00648 '<strong>'.$statusLabels[$logDat["code"]].'</strong><BR>'. 00649 $this->printUserGroupName($logDat["issuer"]).'<BR>'. 00650 $this->dateTimeAge($logDat["tstamp"],1).'<BR>'. 00651 (isset($logDat["uid_foreign"]) ? "<em>".$LANG->getLL("todos_logEntries_lTarget")."</em>:<BR>".$this->printUserGroupName($logDat["uid_foreign"]).'<BR>' : ''). 00652 '<BR></td> 00653 <td valign=top> </td> 00654 <td valign=top width=80%>'.nl2br(htmlspecialchars($logDat["comment"])).'</td> 00655 </tr>'; 00656 } 00657 00658 array_unshift($lines,'<tr class="bgColor5"> 00659 <td nowrap><strong>'.$LANG->getLL("todos_logEntries_lStatusInfo").':</strong></td> 00660 <td> </td> 00661 <td nowrap><strong>'.$LANG->getLL("todos_logEntries_lDetails").':</strong></td> 00662 </tr>'); 00663 00664 $theCode.= '<table border=0 cellpadding=0 cellspacing=0 width="100%">'.implode("",$lines).'</table>'; 00665 } else { 00666 $theCode.=$LANG->getLL("todos_logEntries_msg1").'<br>'; 00667 } 00668 if ($rel_row["uid_foreign"]) { 00669 $theCode.='<BR>'.$LANG->getLL("todos_logEntries_lTargetedAt").': <strong>'.$this->printUserGroupName($rel_row["uid_foreign"],1).'</strong><BR>'; 00670 } else { 00671 $theCode.='<BR><strong>'.$LANG->getLL("todos_logEntries_lnoTarget").'</strong>'; 00672 } 00673 00674 if ($rel_row["rec_reference"]) { 00675 $theCode.="<BR>".$LANG->getLL("todos_logEntries_lRecordRelated").':<br>'; 00676 $recRelParts = explode(":",$rel_row["rec_reference"]); 00677 $recordRelated=t3lib_BEfunc::getRecord($recRelParts[0],$recRelParts[1]); 00678 if ($recordRelated) { 00679 $theCode.='<a href="'.$this->getEditRedirectUrlForReference($rel_row["rec_reference"]).'"><img src="'.$this->backPath.'gfx/edit2.gif" width="11" height="12" hspace=3 vspace=2 border="0" align=top></a>'. 00680 ($recRelParts[0]=="pages" ? $this->pObj->doc->viewPageIcon($recRelParts[1],$this->backPath,'align=top hspace=2') : ""). 00681 t3lib_iconWorks::getIconImage($recRelParts[0],$recordRelated,$this->backPath,' align="top" hspace="2"'). 00682 htmlspecialchars($recordRelated[$TCA[$recRelParts[0]]["ctrl"]["label"]]); 00683 } else { 00684 $theCode.='<span class="typo3-red"><strong>'.$LANG->getLL("todos_errorNoRecord").'</strong></span>'; 00685 } 00686 00687 } 00688 $theCode.="<BR><BR>"; 00689 00690 // **************************** 00691 // Status selector 00692 // **************************** 00693 $opt=Array(); 00694 $statusLabels_copy = $statusLabels; 00695 00696 // Unset certain items which we do not present in the menu under certain circumstances. 00697 if (!is_array($workflow_row) || !$workflow_row["tablename"] || $rel_row["rec_reference"]) unset($statusLabels_copy[2]); 00698 if (!is_array($workflow_row) || !$workflow_row["tablename"] || !$rel_row["rec_reference"]) unset($statusLabels_copy[103]); 00699 if (!count($revUsers) || (!$rel_row["rec_reference"] && is_array($workflow_row))) unset($statusLabels_copy[3]); 00700 if ($this->BE_USER->user["uid"]!=$todo_row["cruser_id"]) { 00701 unset($statusLabels_copy[100]); 00702 // unset($statusLabels_copy[101]); 00703 unset($statusLabels_copy[102]); 00704 unset($statusLabels_copy[103]); 00705 } else { 00706 unset($statusLabels_copy[5]); 00707 } 00708 00709 if ($tUid<0) unset($statusLabels_copy[102]); // Don't allow new instance creation if we're not looking at the TODO item but an instance. 00710 00711 // If finalized: 00712 if ($rel_row["finalized"]) { 00713 $statusLabels_copy = array(); 00714 if ($this->BE_USER->user["uid"]==$todo_row["cruser_id"]) { 00715 // $statusLabels_copy[101] = $statusLabels[101]; 00716 $statusLabels_copy[102] = $statusLabels[102]; 00717 $noExtraFields=1; 00718 } 00719 } 00720 00721 $formCodeAccu=""; 00722 if (count($statusLabels_copy)) { 00723 reset($statusLabels_copy); 00724 if ($countOfInstances>1 || $this->BE_USER->user["uid"]==$todo_row["cruser_id"]) $opt[]='<option value="0"></option>'; 00725 while(list($kk,$vv)=each($statusLabels_copy)) { 00726 $opt[]='<option value="'.$kk.'">'.$vv.'</option>'; 00727 } 00728 $onChange="var allowedCodes=',".$allowedTargetCodes.",'; 00729 if (allowedCodes.indexOf(','+this.options[this.selectedIndex].value+',')==-1) { 00730 document.editform['data[sys_todos_users_mm][".$rel_row["mm_uid"]."][status][newTarget]'].selectedIndex=0; 00731 }"; 00732 $formCodeAccu.=htmlspecialchars($LANG->getLL("todos_status_addStatus")).':<BR><select name="data[sys_todos_users_mm]['.$rel_row["mm_uid"].'][status][code]" onChange="'.$onChange.'">'.implode("",$opt).'</select><BR>'; 00733 00734 if (!$noExtraFields) { 00735 $opt=Array(); 00736 $opt[]='<option value="0"></option>'; 00737 // $opt[]='<option value="0">[ '.htmlspecialchars($LANG->getLL("todos_selectTargetUG")).' ]</option>'; 00738 00739 // Sender 00740 $revUserRec = t3lib_BEfunc::getRecord("be_users",$todo_row["cruser_id"]); 00741 $opt[]='<option value="'.$todo_row["cruser_id"].'">'.htmlspecialchars($LANG->getLL("todos_sender").': '.$revUserRec["username"].($revUserRec["realName"]?" (".$revUserRec["realName"].")":"")).'</option>'; 00742 00743 // Review users: 00744 reset($revUsers); 00745 while(list($u_id,$revUserRec)=each($revUsers)) { 00746 // CHECK IF they 00747 $opt[]='<option value="'.$u_id.'">'.htmlspecialchars($LANG->getLL("todos_reviewer").': '.$revUserRec["username"].($revUserRec["realName"]?" (".$revUserRec["realName"].")":"")).'</option>'; 00748 } 00749 00750 // Users through time: 00751 $prevUsersGroups[]=$this->BE_USER->user["uid"]; 00752 $prevUsersGroups[]=$rel_row["uid_foreign"]; 00753 if (is_array($prevUsersGroups) && count($prevUsersGroups)) { 00754 $opt[]='<option value="0"></option>'; 00755 $opt[]='<option value="0">'.htmlspecialchars($LANG->getLL("todos_pastUG")).'</option>'; 00756 $prevUsersGroups = array_unique($prevUsersGroups); 00757 reset($prevUsersGroups); 00758 while(list(,$UGuid)=each($prevUsersGroups)) { 00759 if ($UGuid) $opt[]='<option value="'.$UGuid.'">'.htmlspecialchars(($UGuid>0?$LANG->getLL("todos_user"):$LANG->getLL("todos_group")).": ".$this->printUserGroupName($UGuid)).'</option>'; 00760 } 00761 } 00762 00763 if ($this->BE_USER->user["uid"]==$todo_row["cruser_id"]) { 00764 $opt[]='<option value="0"></option>'; 00765 $opt[]='<option value="0">'.htmlspecialchars($LANG->getLL("todos_allUG")).'</option>'; 00766 00767 if ($todo_row["type"]=="plain") { 00768 $opt = array_merge($opt,$this->tasks_makeTargetSelector($this->userGroupArray[0],$this->userGroupArray[1],0,1)); 00769 } elseif (is_array($workflow_row)) { 00770 $grL = implode(",",t3lib_div::intExplode(",",$workflow_row["target_groups"])); 00771 $wf_groupArray=t3lib_BEfunc::getGroupNames("title,uid","AND uid IN (".($grL?$grL:0).")"); 00772 $wf_userArray = t3lib_BEfunc::blindUserNames($this->userGroupArray[2],array_keys($wf_groupArray),1); 00773 $opt = array_merge($opt,$this->tasks_makeTargetSelector($wf_userArray,$wf_groupArray,0,1)); 00774 } 00775 } 00776 00777 $onChange="var allowedCodes=',".$allowedTargetCodes.",'; 00778 if (allowedCodes.indexOf( 00779 ',' 00780 + document.editform['data[sys_todos_users_mm][".$rel_row["mm_uid"]."][status][code]'].options[document.editform['data[sys_todos_users_mm][".$rel_row["mm_uid"]."][status][code]'].selectedIndex].value 00781 +',')==-1 || this.options[this.selectedIndex].value==0) { 00782 this.selectedIndex=0; 00783 }"; 00784 $formCodeAccu.=htmlspecialchars($LANG->getLL("todos_status_selectTarget")).':<BR><select name="data[sys_todos_users_mm]['.$rel_row["mm_uid"].'][status][newTarget]" onChange="'.$onChange.'">'.implode("",$opt).'</select><BR>'; 00785 00786 $formCodeAccu.=htmlspecialchars($LANG->getLL("todos_statusNote")).':<BR><textarea rows="10" name="data[sys_todos_users_mm]['.$rel_row["mm_uid"].'][status][comment]"'.$this->pObj->doc->formWidthText(40,"","").'></textarea><BR>'; 00787 } 00788 } 00789 if ($this->BE_USER->user["uid"]==$todo_row["cruser_id"]) { 00790 $formCodeAccu.='<input type="hidden" name="data[sys_todos_users_mm]['.$rel_row["mm_uid"].'][finished_instance]" value="0"><input type="checkbox" name="data[sys_todos_users_mm]['.$rel_row["mm_uid"].'][finished_instance]" value="1"'.($rel_row["finished_instance"]?" checked":"").'>'. 00791 htmlspecialchars($LANG->getLL("todos_finished")); 00792 } 00793 00794 00795 return $theCode.$formCodeAccu; 00796 } 00797 function negateList($list) { 00798 $listArr = explode(",",$list); 00799 while(list($k,$v)=each($listArr)) { 00800 $listArr[$k]=$v*-1; 00801 } 00802 // debug(implode(",",$listArr)); 00803 return implode(",",$listArr); 00804 } 00805 function exec_todos_getQueryForTodoRels($extraWhere="",$selectFields="",$allowOwn=0) { 00806 $groupQ = $this->BE_USER->user["usergroup_cached_list"] ? " OR sys_todos_users_mm.uid_foreign IN (".$this->negateList($this->BE_USER->user["usergroup_cached_list"]).")" : ""; 00807 if ($allowOwn) $groupQ.=" OR sys_todos.cruser_id=".intval($this->BE_USER->user["uid"]); 00808 00809 return $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 00810 $selectFields?$selectFields:"sys_todos.*,sys_todos_users_mm.mm_uid,sys_todos_users_mm.uid_foreign,sys_todos_users_mm.finished_instance", 00811 "sys_todos", 00812 "sys_todos_users_mm", 00813 "", 00814 " AND (sys_todos_users_mm.uid_foreign=".intval($this->BE_USER->user["uid"]).$groupQ.")". // UID foreign must match the current users id OR be within the group-list of the user 00815 " AND sys_todos.deleted=0 AND sys_todos_users_mm.deleted=0". // Todo AND it's relation must not be deleted 00816 " AND ((sys_todos.finished=0 AND sys_todos_users_mm.finished_instance=0) OR sys_todos.cruser_id=".intval($this->BE_USER->user["uid"]).")". // Either the user must own his todo-item (in which case finished items are displayed) OR the item must NOT be finished (which will remove it from others lists.) 00817 $extraWhere, 00818 '', 00819 'sys_todos.deadline' 00820 ); // Sort by deadline 00821 } 00822 function todos_getReviewUsers($wfUid) { 00823 $res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 00824 "be_users.uid,be_users.username,be_users.realName", 00825 "sys_workflows", 00826 "sys_workflows_rvuser_mm", 00827 "be_users", 00828 t3lib_BEfunc::deleteClause("be_users").t3lib_BEfunc::deleteClause("sys_workflows")." AND sys_workflows.uid=".intval($wfUid), 00829 '', 00830 'be_users.username' 00831 ); 00832 $outARr=array(); 00833 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00834 $outARr[$row["uid"]]=$row; 00835 } 00836 return $outARr; 00837 } 00838 function todos_displayLists($todoTypes,$tUid) { 00839 global $LANG; 00840 00841 $lines=array(); 00842 $ownCount=0; 00843 00844 $lines[]='<tr> 00845 <td class="bgColor5"> </td> 00846 <td class="bgColor5" width=50%><strong>'.$LANG->getLL("todos_title").':</strong></td> 00847 <td class="bgColor5" width=25%><strong>'.$LANG->getLL("todos_type").':</strong></td> 00848 <td class="bgColor5" width=25%><strong>'.$LANG->getLL("todos_deadline").':</strong></td> 00849 <td class="bgColor5"><strong>'.$LANG->getLL("todos_finished").':</strong></td> 00850 </tr>'; 00851 00852 // SELECT Incoming todos (incl. own todos): 00853 // Incoming todos are those set for a user which he must carry out. Those are the relations in sys_todos_users_mm where uid_foreign is either the users uid or the negative uid of a group his a member of 00854 $res = $this->exec_todos_getQueryForTodoRels(); 00855 $out = ""; 00856 if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) { 00857 00858 $c=0; 00859 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00860 $c++; 00861 if ($tUid==-$row["mm_uid"]) { 00862 $bTb="<B>"; 00863 $bTe="</B>"; 00864 $active='<img src="'.$this->backPath.'gfx/content_client.gif" width="7" height="10" border="0" align=top>'; 00865 } else { 00866 $bTb=$bTe=""; 00867 $active=""; 00868 } 00869 $t_dL=$this->dateTimeAge($row["deadline"],-1); 00870 $t_dL = ($row["deadline"]>time()) ? $t_dL : '<span class="typo3-red">'.$t_dL.'</span>'; 00871 $iconName = 'tc_todos'.($row["cruser_id"]==$this->BE_USER->user["uid"]?'':'_foreign').($row["uid_foreign"]>=0?'':'_group').'.gif'; 00872 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10'; 00873 $lines[]='<tr> 00874 <td class="'.$bgColorClass.'">'.$this->linkTodos('<img src="'.$this->backPath.'gfx/i/'.$iconName.'" width="18" height="16" hspace=2 border=0 title="'.$LANG->getLL("todos_instance").' #'.$row["mm_uid"].', '.htmlspecialchars($LANG->getLL("todos_createdBy").": ".$this->userGroupArray[2][$row["cruser_id"]]["username"]." (".$this->userGroupArray[2][$row["cruser_id"]]["realName"].")").'">',-$row["mm_uid"]).'</td> 00875 <td class="'.$bgColorClass.'" nowrap>'.$this->linkTodos($active.$bTb." ".$this->fixed_lgd($row["title"])." ".$bTb,-$row["mm_uid"]).'</td> 00876 <td class="'.$bgColorClass.'" nowrap> '.t3lib_div::fixed_lgd_cs($this->todos_workflowTitle($todoTypes,$row["type"]),15).' </td> 00877 <td class="'.$bgColorClass.'" nowrap>'.$t_dL.' </td> 00878 <td class="'.$bgColorClass.'" align=right>'.($row["cruser_id"]==$this->BE_USER->user["uid"]?'<input type="hidden" name="DONE['.-$row["mm_uid"].']" value=0><input type="checkbox" name="DONE['.-$row["mm_uid"].']" value="1"'.($row["finished_instance"]?" checked":"").'>':' ').'</td> 00879 </tr>'; 00880 00881 if ($row["cruser_id"]==$this->BE_USER->user["uid"]) $ownCount++; 00882 } 00883 } 00884 00885 00886 00887 // SELECT Master todos for list: 00888 // A master todo is an OUTGOING todo you have created, in this case for other users. 00889 $res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( 00890 "sys_todos.*,sys_todos_users_mm.uid_foreign", 00891 "sys_todos", 00892 "sys_todos_users_mm", 00893 "", 00894 " AND sys_todos_users_mm.uid_foreign!=".intval($this->BE_USER->user["uid"]). 00895 " AND sys_todos.cruser_id=".intval($this->BE_USER->user["uid"]). 00896 " AND sys_todos.deleted=0", 00897 'sys_todos.uid', 00898 'sys_todos.deadline' 00899 ); 00900 $out = ""; 00901 if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) { 00902 00903 $lines[]='<tr><td colspan=5> </td></tr>'; 00904 $lines[]='<tr> 00905 <td class="bgColor5"> </td> 00906 <td class="bgColor5" colspan="4"><strong>'.$LANG->getLL("todos_list_master").':</strong></td> 00907 </tr>'; 00908 00909 $c=0; 00910 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00911 $c++; 00912 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10'; 00913 if ($tUid==$row["uid"]) { 00914 $bTb="<B>"; 00915 $bTe="</B>"; 00916 $active='<img src="'.$this->backPath.'gfx/content_client.gif" width="7" height="10" border="0" align=top>'; 00917 } else { 00918 $bTb=$bTe=""; 00919 $active=""; 00920 } 00921 $t_dL=$this->dateTimeAge($row["deadline"],-1); 00922 $t_dL = ($row["deadline"]>time()) ? $t_dL : '<span class="typo3-red">'.$t_dL.'</span>'; 00923 $iconName = 'tc_todos'.($row["uid_foreign"]>=0?'':'_group').'.gif'; 00924 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10'; 00925 $lines[]='<tr> 00926 <td class="'.$bgColorClass.'">'.$this->linkTodos('<img src="'.$this->backPath.'gfx/i/'.$iconName.'" width="18" height="16" hspace=2 border=0 title="'.$LANG->getLL("todos_item").' #'.$row["uid"].', '.htmlspecialchars($LANG->getLL("todos_createdBy").": ".$this->userGroupArray[2][$row["cruser_id"]]["username"]." (".$this->userGroupArray[2][$row["cruser_id"]]["realName"].")").'">',$row["uid"]).'</td> 00927 <td class="'.$bgColorClass.'" nowrap>'.$this->linkTodos($active.$bTb." ".$this->fixed_lgd($row["title"])." ".$bTb,$row["uid"]).'</td> 00928 <td class="'.$bgColorClass.'" nowrap> '.t3lib_div::fixed_lgd_cs($this->todos_workflowTitle($todoTypes,$row["type"]),15).' </td> 00929 <td class="'.$bgColorClass.'" nowrap>'.$t_dL.' </td> 00930 <td class="'.$bgColorClass.'" align=right>'.($row["cruser_id"]==$this->BE_USER->user["uid"]?'<input type="hidden" name="DONE['.$row["uid"].']" value=0><input type="checkbox" name="DONE['.$row["uid"].']" value="1"'.($row["finished"]?" checked":"").'>':' ').'</td> 00931 </tr>'; 00932 00933 if ($row["cruser_id"]==$this->BE_USER->user["uid"]) $ownCount++; 00934 } 00935 00936 // $out = '<table border=0 cellpadding=0 cellspacing=0>'.implode("",$lines).'</table>'; 00937 // $theCode.= $this->pObj->doc->spacer(10); 00938 // $theCode.= $this->pObj->doc->section($LANG->getLL("todos_list_master"),$out,1,0); 00939 } 00940 00941 if (count($lines)>1) { 00942 $out = '<table border=0 cellpadding=0 cellspacing=0>'.implode("",$lines).'</table>'; 00943 00944 if ($ownCount) { 00945 $bMenu = '<BR><div align=right><select name="marked_todos_action"> 00946 <option value=-1></option> 00947 <option value=127>'.$LANG->getLL("todos_purge").'</option> 00948 </select><input type="submit" name="marked_todos" value="'.$LANG->getLL("todos_updateMarked").'"></div>'; 00949 } else $bMenu = ""; 00950 00951 00952 $theCode.= $this->pObj->doc->section($LANG->getLL("todos_list"),$out.$bMenu,0,1); 00953 } 00954 return $theCode; 00955 } 00956 function todos_createForm($todoTypes,$editRec="") { 00957 global $LANG; 00958 00959 // CREATE/EDIT/VIEW TODO: 00960 $wF = is_array($editRec) ? $editRec["type"] : t3lib_div::_GP("workflow_type"); 00961 if ($wF && isset($todoTypes[$wF])) { 00962 $type = is_array($editRec) ? $editRec["uid"] : "NEW"; 00963 $formA=array(); 00964 00965 if (!is_array($editRec)) { 00966 // Making the target_user/group selector: 00967 if ($wF=="plain") { // If the type is plain, the todo-item may be assigned to all users accessible for the current user. 00968 // Title selector: 00969 $formA[]=array($LANG->getLL("todos_type").": ", $LANG->getLL("todos_plain")); 00970 $formA[] = $this->tasks_makeTargetSelector($this->userGroupArray[0],$this->userGroupArray[1],$type); 00971 00972 } elseif (substr($wF,0,3)=="wf_" && t3lib_extMgm::isLoaded("sys_workflows")) { // If it's a workflow from sys_workflows table, the list of target groups and users is re-fetched, according the the target_groups definition. 00973 $workflowRecord=t3lib_BEfunc::getRecord("sys_workflows",substr($wF,3)); 00974 if (is_array($workflowRecord) && $workflowRecord["tablename"]) { 00975 $formA[]=array($LANG->getLL("todos_type").": ", $workflowRecord["title"]); 00976 // Get groupnames for todo-tasks 00977 00978 $grL = implode(",",t3lib_div::intExplode(",",$workflowRecord["target_groups"])); 00979 $wf_groupArray=t3lib_BEfunc::getGroupNames("title,uid","AND uid IN (".($grL?$grL:0).")"); 00980 $wf_groupArrayUids=array_keys($wf_groupArray); 00981 $wf_userArray = t3lib_BEfunc::blindUserNames($this->userGroupArray[2],$wf_groupArrayUids,1); 00982 $formA[] = $this->tasks_makeTargetSelector($wf_userArray,$wf_groupArray,$type); 00983 } 00984 } 00985 } 00986 00987 // Title selector: 00988 $formA[]=array($LANG->getLL("todos_title").": ", '<input type="text" name="data[sys_todos]['.$type.'][title]" value="'.htmlspecialchars(is_array($editRec)?$editRec["title"]:$todoTypes[$wF]).'" max=255'.$this->pObj->doc->formWidth(40).'>'); 00989 00990 // Deadline selector: 00991 $curTodoTime=time(); 00992 $formA[]=array($LANG->getLL("todos_deadline").": ", '<input type="text" name="data[sys_todos]['.$type.'][deadline]_hr'.'" onChange="typo3FormFieldGet(\'data[sys_todos]['.$type.'][deadline]\', \'datetime\', \'\', 0,0);"'.$this->pObj->doc->formWidth(20).'> 00993 <input type="hidden" value="'.intval($editRec["deadline"]).'" name="data[sys_todos]['.$type.'][deadline]"> 00994 <select name="_time_selector" onChange=" 00995 document.forms[0][\'data[sys_todos]['.$type.'][deadline]\'].value=(this.options[this.selectedIndex].value>0?this.options[this.selectedIndex].value:(document.forms[0][\'data[sys_todos]['.$type.'][deadline]\'].value!=\'0\'?document.forms[0][\'data[sys_todos]['.$type.'][deadline]\'].value:'.time().')-this.options[this.selectedIndex].value); 00996 this.selectedIndex=0; 00997 typo3FormFieldSet(\'data[sys_todos]['.$type.'][deadline]\', \'datetime\', \'\', 0,0); 00998 "> 00999 <option value="0"></option> 01000 <option value="'.(mktime(0,0,0)+3600*12).'">'.$LANG->getLL("todos_DL_today").'</option> 01001 <option value="'.(mktime(0,0,0)+3600*24+3600*12).'">'.$LANG->getLL("todos_DL_tomorrow").'</option> 01002 <option value="'.(mktime(0,0,0)+3600*24*7+3600*12).'">'.$LANG->getLL("todos_DL_weekLater").'</option> 01003 <option value="'.(mktime(0,0,0)+3600*24*31+3600*12).'">'.$LANG->getLL("todos_DL_monthLater").'</option> 01004 <option value="'.(-3600*24*1).'">+1 '.$LANG->getLL("todos_DL_day").'</option> 01005 <option value="'.(-3600*24*2).'">+2 '.$LANG->getLL("todos_DL_days").'</option> 01006 <option value="'.(-3600*24*4).'">+4 '.$LANG->getLL("todos_DL_days").'</option> 01007 <option value="'.(-3600*24*7).'">+7 '.$LANG->getLL("todos_DL_days").'</option> 01008 <option value="'.(-3600*24*14).'">+14 '.$LANG->getLL("todos_DL_days").'</option> 01009 <option value="'.(-3600*24*31).'">+31 '.$LANG->getLL("todos_DL_days").'</option> 01010 </select> 01011 '); 01012 01013 $t3lib_TCEforms = t3lib_div::makeInstance("t3lib_TCEforms"); 01014 $t3lib_TCEforms->backPath = $this->backPath; 01015 01016 $t3lib_TCEforms->extJSCODE.='typo3FormFieldSet("data[sys_todos]['.$type.'][deadline]", "datetime", "", 0,0);'; 01017 01018 // Description: 01019 $formA[]=array($LANG->getLL("todos_description").": ", '<textarea rows="10" name="data[sys_todos]['.$type.'][description]"'.$this->pObj->doc->formWidthText(40,"","").'>'.t3lib_div::formatForTextarea(is_array($editRec)?$editRec["description"]:"").'</textarea>'); 01020 01021 // Notify email: 01022 if (!is_array($editRec) && $this->BE_USER->user["email"]) { 01023 $formA[]=array(" ", '<input type="checkbox" name="sendAsEmail" value=1>'.$LANG->getLL("todo_email").'<BR>('.$LANG->getLL("lReplyAddress").': '.$this->BE_USER->user["email"].')'); 01024 } 01025 01026 $formA[]=array(" "," "); 01027 $onClick = "if (document.forms[0]['data[sys_todos][".$type."][title]'].value=='') {alert(".$GLOBALS['LANG']->JScharCode($LANG->getLL("todos_mustFillIn")).");return false;}"; 01028 $hidden = '<input type=hidden name="data[sys_todos]['.$type.'][type]" value="'.htmlspecialchars($wF).'">'; 01029 if ($type=="NEW") { 01030 $formA[]=array(" ", '<input type="submit" name="create_todo" value="'.$LANG->getLL("lCreate").'" onClick="'.$onClick.'"> <input type="submit" value="'.$LANG->getLL("lCancel").'">'); 01031 } else { 01032 $formA[]=array(" ", '<input type="submit" name="create_todo" value="'.$LANG->getLL("lUpdate").'"><input type="hidden" name="sys_todos_uid" value="'.$editRec["uid"].'">'); 01033 } 01034 01035 $theCode.= $this->pObj->doc->spacer(20); 01036 $theCode.= $this->pObj->doc->section('<a name="new"></a>'.$LANG->getLL(is_array($editRec)?"todos_update":"todos_new",1),$this->pObj->doc->table($formA).$hidden.$t3lib_TCEforms->JSbottom(),0,!is_array($editRec),0,1); 01037 } else { 01038 // Todo type: 01039 $opt_type=array(); 01040 reset($todoTypes); 01041 $opt_type[]='<option value="0"></option>'; 01042 while(list($uid,$title)=each($todoTypes)) { 01043 $opt_type[]='<option value="'.$uid.'">'.htmlspecialchars($title).'</option>'; 01044 } 01045 // $type_onChange="if (document.forms[0]['data[sys_todos][".$type."][title]'].value=='') document.forms[0]['data[sys_todos][".$type."][title]'].value=document.forms[0]['data[sys_todos][".$type."][type]'].options[document.forms[0]['data[sys_todos][".$type."][type]'].selectedIndex].text;"; 01046 $formA=array(); 01047 $formA[]=array($LANG->getLL("todos_type").": ", '<select name="workflow_type" onChange="document.location=\'index.php?workflow_type=\'+this.options[this.selectedIndex].value+\'#new\';">'.implode("",$opt_type).'</select>'); 01048 $theCode.= $this->pObj->doc->spacer(20); 01049 $theCode.= $this->pObj->doc->section($LANG->getLL("todos_new"),$this->pObj->doc->table($formA),0,1); 01050 } 01051 return $theCode; 01052 } 01053 function linkTodos($str,$id) { 01054 $str='<a href="index.php?sys_todos_uid='.$id.'#todo">'.$str.'</a>'; 01055 return $str; 01056 } 01057 function getEditRedirectUrlForReference($recRef) { 01058 $parts = explode(":",$recRef); 01059 if ($parts[0]=="pages") { 01060 $outUrl = $this->backPath."sysext/cms/layout/db_layout.php?id=".$parts[1]."&SET[function]=0&edit_record=".$parts[0].":".$parts[1]."&returnUrl=".rawurlencode(t3lib_div::getIndpEnv("REQUEST_URI")); 01061 } else { 01062 $outUrl = $this->backPath."alt_doc.php?returnUrl=".rawurlencode(t3lib_div::getIndpEnv("REQUEST_URI"))."&edit[".$parts[0]."][".$parts[1]."]=edit"; 01063 } 01064 return $outUrl; 01065 } 01066 function printUserGroupName($uid,$icon=0) { 01067 if ($uid>0) { 01068 return ($icon?t3lib_iconWorks::getIconImage("be_users",t3lib_BEfunc::getRecord("be_users",$uid),$this->backPath,$params=" align=top"):""). 01069 $this->userGroupArray[2][$uid]["username"].($this->userGroupArray[2][$uid]["realName"]?" (".$this->userGroupArray[2][$uid]["realName"].")":""); 01070 } else { 01071 $grRec = t3lib_BEfunc::getRecord("be_groups",abs($uid)); 01072 return ($icon?t3lib_iconWorks::getIconImage("be_groups",$grRec,$this->backPath,' align="top"'):''). 01073 $grRec["title"]; 01074 } 01075 } 01076 } 01077 01078 if (defined("TYPO3_MODE") && $TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/sys_todos/class.tx_systodos.php"]) { 01079 include_once($TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/sys_todos/class.tx_systodos.php"]); 01080 } 01081 01082 ?>