- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是VTiger新手,正在使用5.2.0版本尝试,学习实现Issue Tracking。
简介:
客户发送电子邮件至 support@company.com,邮件转换器或邮件扫描器..扫描新电子邮件,如果找到则创建新票。
如果管理员看到在问题工单中提出的新工单,则进行一些更改,例如将其分配给某人或发表评论等。VTiger CRM 会向客户发送一封电子邮件,说明管理员已对门票。
假设客户想要一些更改,所以他回复 support@company.com,因为新邮件到达并且邮件扫描器创建了新票,所以提出了新票。
问题:
不是更新客户之前发送的现有工单,而是每次都创建一个新工单,通过为一个问题制作许多工单来重复问题,这是一个大问题。
当客户向 support@company.com 发送邮件时,电子邮件的主题作为工单的标题,电子邮件正文作为工单的描述。
让我们说
Title of Ticket is SubjectClientSent
管理员修改后客户不喜欢,客户决定回复VTiger发给他的邮件,一般都是这种方式。
Re: TT17 [ Ticket Id : 22 ] Re : SubjectClientSent
我不希望 Mail Scanner 创建一个标题为 Re: TT17 [ Ticket Id : 22 ] Re: SubjectClientSent
的新票证,我希望它更新标题为 SubjectClientSent
我试图通过创建类似这样的新规则来做到这一点..
但是,它仍在创建一个新工单。
你能帮我改正这个吗?
是否有更好的方法来更新现有工单?
感谢您的帮助和支持。
最佳答案
找到解决方案!
整个答案是从 VTiger PDF document 窃取信息而写的, VTiger Forum , VTiger Bug Link
下图显示了使用 MailScanner 或 MailConverter 自动化票务的基本过程
![邮件扫描器基本流程][4]
1:客户(有联系人/帐户记录)发送电子邮件至 support@company.com,主题“测试故障单”
2:Mail Scanner 创建工单,将其链接到由 emailid 过滤的匹配联系人/帐户记录抬头。HelpDeskHandler 将发送一封确认电子邮件,其中包含有关如何回复的更多信息进一步向客户。电子邮件主题类似于“TT15 [Ticket Id: 1483] Test Trouble Ticket”
3:客户回复确认邮件,保留部分主题不变支持@company.com。由于邮件扫描器在主题上配置了 Regex 规则并找到了匹配链接到客户的故障单,它会使用电子邮件正文更新评论。
4:当支持团队更新他们的评论时,会再次向客户发送一封电子邮件。
下面的步骤将帮助我们实现这个功能
第 1 步:设置外发邮件服务器
如果您的发送邮件服务器是 Gmail,则以下设置应该适合您
Mail Server Settings (SMTP)
Server Name ssl://smtp.gmail.com:465
User Name username@gmail.com
Password ******
From Email from.email@gmail.com
Requires Authentication? Yes
第 2 步:设置 MailScanner 或 MailConverter
DEFAULT Information
Scanner Name DEFAULT
Server Name imap.gmail.com
Protocol imap4
User Name support.company@gmail.com
SSL Type ssl
SSL Method novalidate-cert
Connect URL {imap.gmail.com:993/imap4/ssl/novalidate-cert}
Status Enabled
Scanning Information
Look for All Messages from lastscan
After scan Mark message as Read
第 3 步:设置规则以在 MailScanner 或 MailConverter 中创建和更新票证
Rules For Mail Converter [DEFAULT]
Priority
From
To
Subject Regex Ticket Id[^:]?: ([0-9]+)
Body
Match All Condition
Action Update Ticket
Priority
From
To
Subject
Body
Match Any Condition
Action Create Ticket
第四步:配置config.inc.php
更新 config.inc.php 中的以下变量
$HELPDESK_SUPPORT_EMAIL_ID
发送邮件时使用的 FROM 地址信息示例:automated-reply@company.com
$HELPDESK_SUPPORT_EMAIL_ID = 'auto.reply.company@gmail.com';
$HELPDESK_SUPPORT_NAME
用于显示已发送电子邮件的 FROM 名称。示例:自动回复
$HELPDESK_SUPPORT_NAME = 'Company Support';
$HELPDESK_SUPPORT_EMAIL_REPLY_ID
要在发送的电子邮件中设置的回复地址。示例:support@company.com
$HELPDESK_SUPPORT_EMAIL_REPLY_ID = 'support.company@gmail.com';
设置此信息是自动出票的重要步骤之一。当用户尝试回复自动电子邮件时地址将由邮件客户端设置并到达邮箱我们已经设置了扫描。
第 5 步:在 VTigerCRM/modules/HelpDesk/中创建 HelpDeskHandler.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.
************************************************************************************/
class HelpDeskHandler extends VTEventHandler {
function __getSendToEmail($crmid) {
if(empty($crmid)) return false;
$sendtoemail = false;
global $adb;
$metaresult = $adb->pquery("SELECT setype FROM vtiger_crmentity WHERE crmid=? AND deleted = 0", array($crmid));
if($metaresult && $adb->num_rows($metaresult)) {
$metaresultrow = $adb->fetch_array($metaresult);
$emailres = false;
if($metaresultrow['setype'] == 'Contacts') {
$emailres = $adb->pquery("SELECT email,yahooid FROM vtiger_contactdetails WHERE contactid = ?", array($crmid));
} else if($metaresultrow['setype'] == 'Accounts') {
$emailres = $adb->pquery("SELECT email1,email2 FROM vtiger_account WHERE accountid = ?", array($crmid));
}
if($emailres && $adb->num_rows($emailres)) {
$emailresrow = $adb->fetch_array($emailres);
if(!empty($emailresrow[0])) $sendtoemail = $emailresrow[0];
if(!empty($emailresrow[1])) $sendtoemail = $emailresrow[1];
}
}
return $sendtoemail;
}
function handleEvent($eventName, $entityData) {
global $log, $adb;
if($eventName == 'vtiger.entity.aftersave') {
$moduleName = $entityData->getModuleName();
// Event not related to HelpDesk - IGNORE
if($moduleName != 'HelpDesk') {
return;
}
// Take action if the service running is MailScanner (either via Cron/Scan Now)
if(isset($_REQUEST) && $_REQUEST['service'] == 'MailScanner' ) {
$focus = $entityData->focus;
$sendToEmail = $this->__getSendToEmail($focus->column_fields['parent_id']);
// If the entity is create new and we know whom to send the mail proceed.
if($entityData->isNew() && $sendToEmail) {
global $HELPDESK_SUPPORT_EMAIL_ID, $HELPDESK_SUPPORT_NAME, $HELPDESK_SUPPORT_EMAIL_REPLY_ID;
include_once 'vtlib/Vtiger/Mailer.php';
$mailer = new Vtiger_Mailer();
$mailer->ConfigSenderInfo($HELPDESK_SUPPORT_EMAIL_ID, $HELPDESK_SUPPORT_NAME);
$mailer->AddReplyTo($HELPDESK_SUPPORT_EMAIL_REPLY_ID);
$mailer->initFromTemplate('Auto Ticket First Response Template');
// Update the email subject
$mailer->Subject = sprintf("%s [ Ticket Id : %s ] Re : %s",
$focus->column_fields['ticket_no'],
$focus->id,
$focus->column_fields['ticket_title']
);
$mailer->SendTo( $sendToEmail, '', false, false, true );
}
}
}
}
}
?>
第 6 步:创建名为“Auto Ticket First Response”的电子邮件模板
这是客户发送电子邮件至 support.company@gmail.com 后公司支持自动发送的确认电子邮件
要创建电子邮件模板,请转到设置/电子邮件模板;选择新模板并将其命名为“Auto Ticket First Response”
第 7 步:创建一个新的 PHP 文件并将其命名为 RegisterHelpDeskHandler.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.
************************************************************************************/
$Vtiger_Utils_Log = true;
include_once 'vtlib/Vtiger/Module.php';
include_once 'vtlib/Vtiger/Event.php';
$moduleInstance = Vtiger_Module::getInstance('HelpDesk');
Vtiger_Event::register($moduleInstance, 'vtiger.entity.aftersave', 'HelpDeskHandler', 'modules/HelpDesk/HelpDeskHandler.php');
?>
要执行,只需输入以下 URL
http://localhost:8888/registerHelpDeskHandler.php
您应该在浏览器中看到以下输出
Registering Event vtiger.entity.aftersave with [modules/HelpDesk/HelpDeskHandler.php] HelpDeskHandler ... DONE
第 9 步:检查错误!
如果您使用的是 VTiger 5.2.0,该错误已修复!
如果没有,转到 modules/Settings/MailScanner/core/MailScannerAction.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.
*
********************************************************************************/
require_once('modules/Emails/Emails.php');
require_once('modules/HelpDesk/HelpDesk.php');
require_once('modules/Users/Users.php');
require_once('modules/Documents/Documents.php');
/**
* Mail Scanner Action
*/
class Vtiger_MailScannerAction {
// actionid for this instance
var $actionid = false;
// scanner to which this action is associated
var $scannerid = false;
// type of mailscanner action
var $actiontype= false;
// text representation of action
var $actiontext= false;
// target module for action
var $module = false;
// lookup information while taking action
var $lookup = false;
// Storage folder to use
var $STORAGE_FOLDER = 'storage/mailscanner/';
/** DEBUG functionality */
var $debug = false;
function log($message) {
global $log;
if($log && $this->debug) { $log->debug($message); }
else if($this->debug) echo "$message\n";
}
/**
* Constructor.
*/
function __construct($foractionid) {
$this->initialize($foractionid);
}
/**
* Initialize this instance.
*/
function initialize($foractionid) {
global $adb;
$result = $adb->pquery("SELECT * FROM vtiger_mailscanner_actions WHERE actionid=? ORDER BY sequence", Array($foractionid));
if($adb->num_rows($result)) {
$this->actionid = $adb->query_result($result, 0, 'actionid');
$this->scannerid = $adb->query_result($result, 0, 'scannerid');
$this->actiontype = $adb->query_result($result, 0, 'actiontype');
$this->module = $adb->query_result($result, 0, 'module');
$this->lookup = $adb->query_result($result, 0, 'lookup');
$this->actiontext = "$this->actiontype,$this->module,$this->lookup";
}
}
/**
* Create/Update the information of Action into database.
*/
function update($ruleid, $actiontext) {
global $adb;
$inputparts = explode(',', $actiontext);
$this->actiontype = $inputparts[0]; // LINK, CREATE
$this->module = $inputparts[1]; // Module name
$this->lookup = $inputparts[2]; // FROM, TO
$this->actiontext = $actiontext;
if($this->actionid) {
$adb->pquery("UPDATE vtiger_mailscanner_actions SET scannerid=?, actiontype=?, module=?, lookup=? WHERE actionid=?",
Array($this->scannerid, $this->actiontype, $this->module, $this->lookup, $this->actionid));
} else {
$this->sequence = $this->__nextsequence();
$adb->pquery("INSERT INTO vtiger_mailscanner_actions(scannerid, actiontype, module, lookup, sequence) VALUES(?,?,?,?,?)",
Array($this->scannerid, $this->actiontype, $this->module, $this->lookup, $this->sequence));
$this->actionid = $adb->database->Insert_ID();
}
$checkmapping = $adb->pquery("SELECT COUNT(*) AS ruleaction_count FROM vtiger_mailscanner_ruleactions
WHERE ruleid=? AND actionid=?", Array($ruleid, $this->actionid));
if($adb->num_rows($checkmapping) && !$adb->query_result($checkmapping, 0, 'ruleaction_count')) {
$adb->pquery("INSERT INTO vtiger_mailscanner_ruleactions(ruleid, actionid) VALUES(?,?)",
Array($ruleid, $this->actionid));
}
}
/**
* Delete the actions from tables.
*/
function delete() {
global $adb;
if($this->actionid) {
$adb->pquery("DELETE FROM vtiger_mailscanner_actions WHERE actionid=?", Array($this->actionid));
$adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions WHERE actionid=?", Array($this->actionid));
}
}
/**
* Get next sequence of Action to use.
*/
function __nextsequence() {
global $adb;
$seqres = $adb->pquery("SELECT max(sequence) AS max_sequence FROM vtiger_mailscanner_actions", Array());
$maxsequence = 0;
if($adb->num_rows($seqres)) {
$maxsequence = $adb->query_result($seqres, 0, 'max_sequence');
}
++$maxsequence;
return $maxsequence;
}
/**
* Apply the action on the mail record.
*/
function apply($mailscanner, $mailrecord, $mailscannerrule, $matchresult) {
$returnid = false;
if($this->actiontype == 'CREATE') {
if($this->module == 'HelpDesk') {
$returnid = $this->__CreateTicket($mailscanner, $mailrecord);
}
} else if($this->actiontype == 'LINK') {
$returnid = $this->__LinkToRecord($mailscanner, $mailrecord);
} else if($this->actiontype == 'UPDATE') {
if($this->module == 'HelpDesk') {
$returnid = $this->__UpdateTicket($mailscanner, $mailrecord,
$mailscannerrule->hasRegexMatch($matchresult));
}
}
return $returnid;
}
/**
* Update ticket action.
*/
function __UpdateTicket($mailscanner, $mailrecord, $regexMatchInfo) {
global $adb;
$returnid = false;
$usesubject = false;
if($this->lookup == 'SUBJECT') {
// If regex match was performed on subject use the matched group
// to lookup the ticket record
if($regexMatchInfo) $usesubject = $regexMatchInfo['matches'];
else $usesubject = $mailrecord->_subject;
// Get the ticket record that was created by SENDER earlier
$fromemail = $mailrecord->_from[0];
$linkfocus = $mailscanner->GetTicketRecord($usesubject, $fromemail);
$relatedid = $linkfocus->column_fields[parent_id];
// If matching ticket is found, update comment, attach email
if($linkfocus) {
$timestamp = $adb->formatDate(date('YmdHis'), true);
$adb->pquery("INSERT INTO vtiger_ticketcomments(ticketid, comments, ownerid, ownertype, createdtime) VALUES(?,?,?,?,?)",
Array($linkfocus->id, $mailrecord->getBodyText(), $relatedid, 'customer', $timestamp));
// Set the ticket status to Open if its Closed
$adb->pquery("UPDATE vtiger_troubletickets set status=? WHERE ticketid=? AND status='Closed'", Array('Open', $linkfocus->id));
$returnid = $this->__CreateNewEmail($mailrecord, $this->module, $linkfocus);
} else {
// TODO If matching ticket was not found, create ticket?
// $returnid = $this->__CreateTicket($mailscanner, $mailrecord);
}
}
return $returnid;
}
/**
* Create ticket action.
*/
function __CreateTicket($mailscanner, $mailrecord) {
// Prepare data to create trouble ticket
$usetitle = $mailrecord->_subject;
$description = $mailrecord->getBodyText();
// There will be only on FROM address to email, so pick the first one
$fromemail = $mailrecord->_from[0];
$linktoid = $mailscanner->LookupContact($fromemail);
if(!$linktoid) $linktoid = $mailscanner->LookupAccount($fromemail);
/** Now Create Ticket **/
global $current_user;
if(!$current_user) $current_user = new Users();
$current_user->id = 1;
// Create trouble ticket record
$ticket = new HelpDesk();
$ticket->column_fields['ticket_title'] = $usetitle;
$ticket->column_fields['description'] = $description;
$ticket->column_fields['ticketstatus'] = 'Open';
$ticket->column_fields['assigned_user_id'] = $current_user->id;
if($linktoid) $ticket->column_fields['parent_id'] = $linktoid;
$ticket->save('HelpDesk');
// Associate any attachement of the email to ticket
$this->__SaveAttachements($mailrecord, 'HelpDesk', $ticket);
return $ticket->id;
}
/**
* Add email to CRM record like Contacts/Accounts
*/
function __LinkToRecord($mailscanner, $mailrecord) {
$linkfocus = false;
$useemail = false;
if($this->lookup == 'FROM') $useemail = $mailrecord->_from;
else if($this->lookup == 'TO') $useemail = $mailrecord->_to;
if($this->module == 'Contacts') {
foreach($useemail as $email) {
$linkfocus = $mailscanner->GetContactRecord($email);
if($linkfocus) break;
}
} else if($this->module == 'Accounts') {
foreach($useemail as $email) {
$linkfocus = $mailscanner->GetAccountRecord($email);
if($linkfocus) break;
}
}
$returnid = false;
if($linkfocus) {
$returnid = $this->__CreateNewEmail($mailrecord, $this->module, $linkfocus);
}
return $returnid;
}
/**
* Create new Email record (and link to given record) including attachements
*/
function __CreateNewEmail($mailrecord, $module, $linkfocus) {
global $current_user, $adb;
if(!$current_user) $current_user = new Users();
$current_user->id = 1;
$focus = new Emails();
$focus->column_fields['parent_type'] = $module;
$focus->column_fields['activitytype'] = 'Emails';
$focus->column_fields['parent_id'] = "$linkfocus->id@-1|";
$focus->column_fields['subject'] = $mailrecord->_subject;
$focus->column_fields['description'] = $mailrecord->getBodyHTML();
$focus->column_fields['assigned_user_id'] = $linkfocus->column_fields['assigned_user_id'];
$focus->column_fields["date_start"]= date('Y-m-d', $mailrecord->_date);
$from=$mailrecord->_from[0];
$to = $mailrecord->_to[0];
$cc = (!empty($mailrecord->_cc))? implode(',', $mailrecord->_cc) : '';
$bcc= (!empty($mailrecord->_bcc))? implode(',', $mailrecord->_bcc) : '';
$flag=''; // 'SENT'/'SAVED'
//emails field were restructured and to,bcc and cc field are JSON arrays
$focus->column_fields['from_email'] = $from;
$focus->column_fields['saved_toid'] = $to;
$focus->column_fields['ccmail'] = $cc;
$focus->column_fields['bccmail'] = $bcc;
$focus->save('Emails');
$emailid = $focus->id;
$this->log("Created [$focus->id]: $mailrecord->_subject linked it to " . $linkfocus->id);
// TODO: Handle attachments of the mail (inline/file)
$this->__SaveAttachements($mailrecord, 'Emails', $focus);
return $emailid;
}
/**
* Save attachments from the email and add it to the module record.
*/
function __SaveAttachements($mailrecord, $basemodule, $basefocus) {
global $adb;
// If there is no attachments return
if(!$mailrecord->_attachments) return;
$userid = $basefocus->column_fields['assigned_user_id'];
$setype = "$basemodule Attachment";
$date_var = $adb->formatDate(date('YmdHis'), true);
foreach($mailrecord->_attachments as $filename=>$filecontent) {
$attachid = $adb->getUniqueId('vtiger_crmentity');
$description = $filename;
$usetime = $adb->formatDate($date_var, true);
$adb->pquery("INSERT INTO vtiger_crmentity(crmid, smcreatorid, smownerid,
modifiedby, setype, description, createdtime, modifiedtime, presence, deleted)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
Array($attachid, $userid, $userid, $userid, $setype, $description, $usetime, $usetime, 1, 0));
$issaved = $this->__SaveAttachmentFile($attachid, $filename, $filecontent);
if($issaved) {
// Create document record
$document = new Documents();
$document->column_fields['notes_title'] = $filename;
$document->column_fields['filename'] = $filename;
$document->column_fields['filestatus'] = 1;
$document->column_fields['filelocationtype'] = 'I';
$document->column_fields['folderid'] = 1; // Default Folder
$document->column_fields['assigned_user_id'] = $userid;
$document->save('Documents');
// Link file attached to document
$adb->pquery("INSERT INTO vtiger_seattachmentsrel(crmid, attachmentsid) VALUES(?,?)",
Array($document->id, $attachid));
// Link document to base record
$adb->pquery("INSERT INTO vtiger_senotesrel(crmid, notesid) VALUES(?,?)",
Array($basefocus->id, $document->id));
}
}
}
/**
* Save the attachment to the file
*/
function __SaveAttachmentFile($attachid, $filename, $filecontent) {
global $adb;
$dirname = $this->STORAGE_FOLDER;
if(!is_dir($dirname)) mkdir($dirname);
$description = $filename;
$filename = str_replace(' ', '-', $filename);
$saveasfile = "$dirname$attachid" . "_$filename";
if(!file_exists($saveasfile)) {
$this->log("Saved attachement as $saveasfile\n");
$fh = fopen($saveasfile, 'wb');
fwrite($fh, $filecontent);
fclose($fh);
}
$mimetype = MailAttachmentMIME::detect($saveasfile);
$adb->pquery("INSERT INTO vtiger_attachments SET attachmentsid=?, name=?, description=?, type=?, path=?",
Array($attachid, $filename, $description, $mimetype, $dirname));
return true;
}
}
?>
Step10:如果您仍然遇到问题,仍然无法获取更新票证功能; 查看 VTiger 论坛。
[4]:http://i.stack.imgur.com/5ZU7Q.jpg 强调文字*强调文字*
关于php - 更新 VTiger 中的现有工单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3985561/
我是 vtiger 的新手。我正在尝试从 TroubleTicket 模块中的服务模块插入字段“服务名称”,但到目前为止我无法做到这一点。 一般来说,是否可以从另一个模块插入一个模块中的字段?如果是这
我是 vtiger 的新手。我正在尝试从 TroubleTicket 模块中的服务模块插入字段“服务名称”,但到目前为止我无法做到这一点。 一般来说,是否可以从另一个模块插入一个模块中的字段?如果是这
我在托管服务器上安装了 vTiger 6.4 实例,但扩展市场出现问题。 我已经创建了一个帐户,但当我尝试登录时,收到一条错误消息,提示“未经授权”。 我尝试使用 Market Place 登录我可以
我是 vtigercrm 的新用户。我需要一个自定义操作来使用网络服务从 vtiger_tab 表中获取所有模块。 如何为 Web 服务 Vtiger CRM 创建自定义操作? 最佳答案 要定义新的
我需要在联系人模块中创建一个自定义字段。但该字段不得编辑。它有一个来自数据库查询的值。 我该怎么做? 谢谢 最佳答案 有两种可能性。第一的:使用 vTiger 创建自定义字段并更新您的数据库查询第二:
对于这样的新手问题,我很抱歉,但我有两个表: vtiger_assets +-----------+---------+------+-----+---------+----------------+
我即将开始从 Java 应用程序设置对 vTiger 5 的编程访问,并且我正在寻找一个能够与 REST API 交互的客户端库。 vtwsclib 库似乎是正确的(唯一的?)方法。看起来 v1.0
我是 Vtiger 的初学者,我想完成修改。我需要了解Vtiger函数的顺序。 这是我的问题: 哪个文件夹包含大部分 PHP 函数? (例如vlib?),我搜索了所有模块文件,这些似乎调用了从其他地方
邮件转换器和更新票证存在问题,据我所知,它在缺少链接表的查询上失败,在打开调试并运行邮件转换器后,这是它返回的查询: INFO VT - PearDatabase ->ADODB error Quer
当我想在 Vtiger 中创建发票时,我转到发票 > 添加发票向下滚动到项目详细信息。通常,当开始在标有“要搜索的类型”的字段中输入内容时,产品应该会显示但没有显示(我得到“未找到结果”)。这同样适用
我面临自动登录 Vtiger crm 6.2.0 的问题。当我点击 crm url 时,它没有要求登录而是重定向到 vtiger crm 主页,没有任何身份验证。根据 this post , conf
我是VTiger新手,正在使用5.2.0版本尝试,学习实现Issue Tracking。 简介: 客户发送电子邮件至 support@company.com,邮件转换器或邮件扫描器..扫描新电子邮件,
我必须修改 vtiger crm 上的帐户密码。问题是我不知道数据库的位置。有人知道包含用户凭据的数据库的路径吗? 最佳答案 如果您的用户名以“ad”开头,例如“admin”。使用以下 mysql 查
您好,我是 vtiger 的新手。现在我想知道的是如何在不使用现有模块设计器或其他相同东西的情况下创建服装模块。例如,我想创建一个自定义模块来保存某个人的姓名和姓氏。实际上我在互联网上进行了研究,并没
我在帐户模块的摘要 View 中制作了一个小部件。在此小部件中,我想使用 SlideToggle 来显示一些详细信息。有时代码工作得很好,但有时它会双重切换并立即关闭详细信息。 JS: $(d
实际上我想在 Vtiger CRM 中使用第三个 Paty 应用程序进行 SSO。例如,如果我登录应用程序,我也想在 Vtiger 中登录相同的用户。我已经使用入口点使用 SugarCRM 和 Sui
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我在 vTiger 之外创建了一个网络表单,我想将其推送到 vTiger 使用的数据库中。 这是将数据推送到数据库的 SQL 代码: $sql="INSERT INTO vtiger_potentia
我有一个可以使用的电话掩码,但是当我将 jQuery 添加到 vTiger header 时,联系页面无法绘制。 在 Header.tpl 中我有 js 引用: 当我将所需的代码放入 header
我是 Vtiger CRM 的新手,我进行了很多搜索以找到如何在 Vtiger CRM 中创建一个自定义模块,并从头开始关联一个表格。我无法遵循 Vtiger 提供的文档。 最佳答案 请引用此 url
我是一名优秀的程序员,十分优秀!