268 lines
8.1 KiB
PHP
268 lines
8.1 KiB
PHP
|
<?php
|
||
|
/*+**********************************************************************************
|
||
|
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
|
||
|
* ("License"); You may not use this file except in compliance with the License
|
||
|
* The Original Code is: vtiger CRM Open Source
|
||
|
* The Initial Developer of the Original Code is vtiger.
|
||
|
* Portions created by vtiger are Copyright (C) vtiger.
|
||
|
* All Rights Reserved.
|
||
|
************************************************************************************/
|
||
|
include_once('vtlib/Vtiger/Utils.php');
|
||
|
include_once('vtlib/Vtiger/Utils/StringTemplate.php');
|
||
|
include_once 'vtlib/Vtiger/LinkData.php';
|
||
|
|
||
|
/**
|
||
|
* Provides API to handle custom links
|
||
|
* @package vtlib
|
||
|
*/
|
||
|
class Vtiger_Link {
|
||
|
var $tabid;
|
||
|
var $linkid;
|
||
|
var $linktype;
|
||
|
var $linklabel;
|
||
|
var $linkurl;
|
||
|
var $linkicon;
|
||
|
var $sequence;
|
||
|
var $status = false;
|
||
|
var $handler_path;
|
||
|
var $handler_class;
|
||
|
var $handler;
|
||
|
|
||
|
// Ignore module while selection
|
||
|
const IGNORE_MODULE = -1;
|
||
|
|
||
|
/**
|
||
|
* Constructor
|
||
|
*/
|
||
|
function __construct() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initialize this instance.
|
||
|
*/
|
||
|
function initialize($valuemap) {
|
||
|
$this->tabid = $valuemap['tabid'];
|
||
|
$this->linkid = $valuemap['linkid'];
|
||
|
$this->linktype=$valuemap['linktype'];
|
||
|
$this->linklabel=$valuemap['linklabel'];
|
||
|
$this->linkurl =decode_html($valuemap['linkurl']);
|
||
|
$this->linkicon =decode_html($valuemap['linkicon']);
|
||
|
$this->sequence =$valuemap['sequence'];
|
||
|
$this->status =$valuemap['status'];
|
||
|
$this->handler_path =$valuemap['handler_path'];
|
||
|
$this->handler_class=$valuemap['handler_class'];
|
||
|
$this->handler =$valuemap['handler'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get module name.
|
||
|
*/
|
||
|
function module() {
|
||
|
if(!empty($this->tabid)) {
|
||
|
return getTabModuleName($this->tabid);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get unique id for the insertion
|
||
|
*/
|
||
|
static function __getUniqueId() {
|
||
|
global $adb;
|
||
|
return $adb->getUniqueID('vtiger_links');
|
||
|
}
|
||
|
|
||
|
/** Cache (Record) the schema changes to improve performance */
|
||
|
static $__cacheSchemaChanges = Array();
|
||
|
|
||
|
/**
|
||
|
* Initialize the schema (tables)
|
||
|
*/
|
||
|
static function __initSchema() {
|
||
|
if(empty(self::$__cacheSchemaChanges['vtiger_links'])) {
|
||
|
if(!Vtiger_Utils::CheckTable('vtiger_links')) {
|
||
|
Vtiger_Utils::CreateTable(
|
||
|
'vtiger_links',
|
||
|
'(linkid INT NOT NULL PRIMARY KEY,
|
||
|
tabid INT, linktype VARCHAR(20), linklabel VARCHAR(30), linkurl VARCHAR(255), linkicon VARCHAR(100), sequence INT, status INT(1) NOT NULL DEFAULT 1)',
|
||
|
true);
|
||
|
Vtiger_Utils::ExecuteQuery(
|
||
|
'CREATE INDEX link_tabidtype_idx on vtiger_links(tabid,linktype)');
|
||
|
}
|
||
|
self::$__cacheSchemaChanges['vtiger_links'] = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add link given module
|
||
|
* @param Integer Module ID
|
||
|
* @param String Link Type (like DETAILVIEW). Useful for grouping based on pages.
|
||
|
* @param String Label to display
|
||
|
* @param String HREF value or URL to use for the link
|
||
|
* @param String ICON to use on the display
|
||
|
* @param Integer Order or sequence of displaying the link
|
||
|
*/
|
||
|
static function addLink($tabid, $type, $label, $url, $iconpath='',$sequence=0, $handlerInfo=null) {
|
||
|
global $adb;
|
||
|
self::__initSchema();
|
||
|
$checkres = $adb->pquery('SELECT linkid FROM vtiger_links WHERE tabid=? AND linktype=? AND linkurl=? AND linkicon=? AND linklabel=?',
|
||
|
Array($tabid, $type, $url, $iconpath, $label));
|
||
|
if(!$adb->num_rows($checkres)) {
|
||
|
$uniqueid = self::__getUniqueId();
|
||
|
$sql = 'INSERT INTO vtiger_links (linkid,tabid,linktype,linklabel,linkurl,linkicon,'.
|
||
|
'sequence';
|
||
|
$params = Array($uniqueid, $tabid, $type, $label, $url, $iconpath, $sequence);
|
||
|
if(!empty($handlerInfo)) {
|
||
|
$sql .= (', handler_path, handler_class, handler');
|
||
|
$params[] = $handlerInfo['path'];
|
||
|
$params[] = $handlerInfo['class'];
|
||
|
$params[] = $handlerInfo['method'];
|
||
|
}
|
||
|
$sql .= (') VALUES ('.generateQuestionMarks($params).')');
|
||
|
$adb->pquery($sql, $params);
|
||
|
self::log("Adding Link ($type - $label) ... DONE");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete link of the module
|
||
|
* @param Integer Module ID
|
||
|
* @param String Link Type (like DETAILVIEW). Useful for grouping based on pages.
|
||
|
* @param String Display label
|
||
|
* @param String URL of link to lookup while deleting
|
||
|
*/
|
||
|
static function deleteLink($tabid, $type, $label, $url=false) {
|
||
|
global $adb;
|
||
|
self::__initSchema();
|
||
|
if($url) {
|
||
|
$adb->pquery('DELETE FROM vtiger_links WHERE tabid=? AND linktype=? AND linklabel=? AND linkurl=?',
|
||
|
Array($tabid, $type, $label, $url));
|
||
|
self::log("Deleting Link ($type - $label - $url) ... DONE");
|
||
|
} else {
|
||
|
$adb->pquery('DELETE FROM vtiger_links WHERE tabid=? AND linktype=? AND linklabel=?',
|
||
|
Array($tabid, $type, $label));
|
||
|
self::log("Deleting Link ($type - $label) ... DONE");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete all links related to module
|
||
|
* @param Integer Module ID.
|
||
|
*/
|
||
|
static function deleteAll($tabid) {
|
||
|
global $adb;
|
||
|
self::__initSchema();
|
||
|
$adb->pquery('DELETE FROM vtiger_links WHERE tabid=?', Array($tabid));
|
||
|
self::log("Deleting Links ... DONE");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all the links related to module
|
||
|
* @param Integer Module ID.
|
||
|
*/
|
||
|
static function getAll($tabid) {
|
||
|
return self::getAllByType($tabid);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all the link related to module based on type
|
||
|
* @param Integer Module ID
|
||
|
* @param mixed String or List of types to select
|
||
|
* @param Map Key-Value pair to use for formating the link url
|
||
|
*/
|
||
|
static function getAllByType($tabid, $type=false, $parameters=false) {
|
||
|
global $adb, $current_user;
|
||
|
self::__initSchema();
|
||
|
|
||
|
$multitype = false;
|
||
|
|
||
|
if($type) {
|
||
|
// Multiple link type selection?
|
||
|
if(is_array($type)) {
|
||
|
$multitype = true;
|
||
|
if($tabid === self::IGNORE_MODULE) {
|
||
|
$sql = 'SELECT * FROM vtiger_links WHERE linktype IN ('.
|
||
|
Vtiger_Utils::implodestr('?', count($type), ',') .') ';
|
||
|
$params = $type;
|
||
|
$permittedTabIdList = getPermittedModuleIdList();
|
||
|
if(count($permittedTabIdList) > 0 && $current_user->is_admin !== 'on') {
|
||
|
$sql .= ' and tabid IN ('.
|
||
|
Vtiger_Utils::implodestr('?', count($permittedTabIdList), ',').')';
|
||
|
$params[] = $permittedTabIdList;
|
||
|
}
|
||
|
$result = $adb->pquery($sql, Array($adb->flatten_array($params)));
|
||
|
} else {
|
||
|
$result = $adb->pquery('SELECT * FROM vtiger_links WHERE tabid=? AND linktype IN ('.
|
||
|
Vtiger_Utils::implodestr('?', count($type), ',') .')',
|
||
|
Array($tabid, $adb->flatten_array($type)));
|
||
|
}
|
||
|
} else {
|
||
|
// Single link type selection
|
||
|
if($tabid === self::IGNORE_MODULE) {
|
||
|
$result = $adb->pquery('SELECT * FROM vtiger_links WHERE linktype=?', Array($type));
|
||
|
} else {
|
||
|
$result = $adb->pquery('SELECT * FROM vtiger_links WHERE tabid=? AND linktype=?', Array($tabid, $type));
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$result = $adb->pquery('SELECT * FROM vtiger_links WHERE tabid=?', Array($tabid));
|
||
|
}
|
||
|
|
||
|
$strtemplate = new Vtiger_StringTemplate();
|
||
|
if($parameters) {
|
||
|
foreach($parameters as $key=>$value) $strtemplate->assign($key, $value);
|
||
|
}
|
||
|
|
||
|
$instances = Array();
|
||
|
if($multitype) {
|
||
|
foreach($type as $t) $instances[$t] = Array();
|
||
|
}
|
||
|
|
||
|
while($row = $adb->fetch_array($result)){
|
||
|
$instance = new self();
|
||
|
$instance->initialize($row);
|
||
|
if(!empty($row['handler_path']) && isFileAccessible($row['handler_path'])) {
|
||
|
require_once $row['handler_path'];
|
||
|
$linkData = new Vtiger_LinkData($instance, $current_user);
|
||
|
$ignore = call_user_func(array($row['handler_class'], $row['handler']), $linkData);
|
||
|
if(!$ignore) {
|
||
|
self::log("Ignoring Link ... ".var_export($row, true));
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if($parameters) {
|
||
|
$instance->linkurl = $strtemplate->merge($instance->linkurl);
|
||
|
$instance->linkicon= $strtemplate->merge($instance->linkicon);
|
||
|
}
|
||
|
if($multitype) {
|
||
|
$instances[$instance->linktype][] = $instance;
|
||
|
} else {
|
||
|
$instances[] = $instance;
|
||
|
}
|
||
|
}
|
||
|
return $instances;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Helper function to log messages
|
||
|
* @param String Message to log
|
||
|
* @param Boolean true appends linebreak, false to avoid it
|
||
|
* @access private
|
||
|
*/
|
||
|
static function log($message, $delimit=true) {
|
||
|
Vtiger_Utils::Log($message, $delimit);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether the user is admin or not
|
||
|
* @param Vtiger_LinkData $linkData
|
||
|
* @return Boolean
|
||
|
*/
|
||
|
static function isAdmin($linkData) {
|
||
|
$user = $linkData->getUser();
|
||
|
return $user->is_admin == 'on' || $user->column_fields['is_admin'] == 'on';
|
||
|
}
|
||
|
|
||
|
}
|
||
|
?>
|