Hello,
Please help me solution to display popup alert by logic hooks
This logic hooks after save of Case, when Case set to Closed but Task in subpanel is not Completed, the logic hooks will popup alert and restrict save.
Thanks
Hello,
Please help me solution to display popup alert by logic hooks
This logic hooks after save of Case, when Case set to Closed but Task in subpanel is not Completed, the logic hooks will popup alert and restrict save.
Thanks
Hi,
You can use throw exception and popup the alert.Using exception you can restrict the save. Put below code in your logic hooks and check.
throw new SugarApiExceptionNotAuthorized('SUGAR_API_EXCEPTION_RECORD_NOT_AUTHORIZED',array('view'));
throw new SugarApiExceptionInvalidParameter(string_format(
$GLOBALS['app_strings']['LBL_UPLOAD_IMAGE_FILE_NOT_SUPPORTED'],
array($extension)
));
throw new SugarApiExceptionError('Unable to load field definition');
Another way is use the Validations of sugarcrm. Please check one of sugarcrm link http://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_7.6/UI_Model/Views/Examples/Adding_Field…
Let me know if you need more help.
-BPATEL
Hi Bhavesh Patel,
Thank you very much, I'll try and feedback
Regards
Hi Bhavesh Patel
This is my logic hooks
<?php
class CheckClosed
{
public function CheckTask(SugarBean $bean, $event, $args)
{
global $sugar_config, $db,$current_user;
//check Task status
$id = $bean->id;
$query = "SELECT status FROM tasks WHERE parent_id = '$id' AND deleted = '0'";
$result = $db->query($query,true);
$rows = $db->fetchByAssoc($result);
$check = 0;
foreach ($row as $rows) {
if ($row['status'] != 'Completed') {
$check = 1;
$GLOBALS['log']->test('check: '.$id);
break;
}
}
if ($check = 1) {
throw new SugarApiExceptionError('Unable to Closed. Please set Task to Completed');
$GLOBALS['log']->test('check: '.$check);
}
}
}
It dose not work with your code throw new SugarApiExceptionError('Unable to Closed. Please set Task to Completed');
Please help me. Thanks
1) Are you sure the logic hook is firing at all? Have you added this function to the logic hooks array and done a repair and rebuild? Alternatively, you could put this at the top of the function to check it's firing:
$GLOBALS['log']->test('Logic hook is active');
2) You've got an assignment in your code where you should have a comparison operator. Instead of:
if ($check = 1) {
You should have:
if ($check == 1) {
3) Instead of using throw new SugarApiExceptionError, have you tried sugar_die as I recommended:
sugar_die('Unable to Closed. Please set Task to Completed.');
So, the logic hooks approach isn't going to work. For some reason I thought you were using Sugar 6/a BWC module. It used to work in Sugar 6, but seeing as you're not using a BWC module, there's no way to communicate back to front end interface using a logic hook in the manner you describe.
The way to solve your problem is using javascript. The sugarcrm examples of using validation are here: http://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_7.6/UI_Model/Views/Examples/Adding_Field…
The way to do it is to add a file in /custom/modules/Cases/clients/base/views/record/record.js
The file should have this in it:
({
extendsFrom: 'RecordView',
initialize: function (options) {
this._super('initialize', [options]);
//add the validation task
this.model.addValidationTask('validate_cases', _.bind(this._doValidateCases, this));
},
_doValidateCases: function (fields, errors, callback) {
var case = this.model;
if(case.attributes.status == 'Closed'){
var tasks = case.getRelatedCollection('case_tasks');
//fetch the tasks
var fetchTasks = tasks.fetch({relate: true});
//wait until the fetch finishes before executing the next bit
fetchAllocations.xhr.done(function () {
tasksJSON = tasks.toJSON();
//loop through all the tasks
_.each(tasksJSON, function (task) {
//if one of the tasks isn't completed, throw an error message, and add a validation problem
if (task.status != 'Completed'){
app.alert.show('message-id', {
level: 'error',
messages: 'The Case has a related task that is not completed and therefore the Task cannot be closed',
autoClose: true
});
errors['status'] = errors['status'] || {};
errors['status'].required = true;
}
});
//proceed to the callbacks
callback(null, fields, errors);
});
}
} else {
//proceed to the callbacks
callback(null, fields, errors);
}
},
})
BTW This will not prevent save on mobile. You'll need to do a repair and rebuild and delete your local cache (try it from incognito mode) to test it. Also, I've written all this from memory, so there might be a bug in the code. Let me know if you have any problems.
Hi Alan Apter,
I updated record.js and then repari and rebuild, but my sugar is loading, it can not display home
the apache is not error.
Thank you very much
Sorry, made a few mistakes with the code - I wrote it all from memory as I don't have access to my developer environment. I've fixed the mistakes I can see, here is my updated code, try this. If it doesn't work, open up the javascript console (ctrl-shift-i, then click on console) and see if there are any errors.
({
extendsFrom: 'RecordView',
initialize: function (options) {
this._super('initialize', [options]);
//add the validation task
this.model.addValidationTask('validate_cases', _.bind(this._doValidateCases, this));
},
_doValidateCases: function (fields, errors, callback) {
var singleCase = this.model;
if (singleCase.attributes.status == 'Closed') {
var tasks = singleCase.getRelatedCollection('case_tasks');
//fetch the tasks
var fetchTasks = tasks.fetch({relate: true});
//wait until the fetch finishes before executing the next bit
fetchTasks.xhr.done(function () {
tasksJSON = tasks.toJSON();
//loop through all the tasks
_.each(tasksJSON, function (task) {
//if one of the tasks isn't completed, throw an error message, and add a validation problem
if (task.status != 'Completed') {
app.alert.show('message-id', {
level: 'error',
messages: 'The Case has a related task that is not completed and therefore the Task cannot be closed',
autoClose: true
});
errors['status'] = errors['status'] || {};
errors['status'].required = true;
}
});
//proceed to the callbacks
callback(null, fields, errors);
});
} else {
//proceed to the callbacks
callback(null, fields, errors);
}
}
})
Hi Alan Apter,
Thank you very much
I have some error from javascript console, I am debugging, I'll feedback soon
Thanks
Hi Alan Apter
I received error from console when I save Case set to Closed
Thanks for the logging information, it has helped me with the issue. It's a bit of an edge case, the problem appears to be with:
var tasks = singleCase.getRelatedCollection('case_tasks');
The relationship is called case_tasks in studio, but you fetch the related collection just using 'tasks'. It's annoyingly inconsistent, but so is life. Here is the fixed code:
({
extendsFrom: 'RecordView',
initialize: function (options) {
this._super('initialize', [options]);
//add the validation task
this.model.addValidationTask('validate_cases', _.bind(this._doValidateCases, this));
},
_doValidateCases: function (fields, errors, callback) {
var singleCase = this.model;
if (singleCase.attributes.status == 'Closed') {
var tasks = singleCase.getRelatedCollection('tasks');
//fetch the tasks
var fetchTasks = tasks.fetch({relate: true});
//wait until the fetch finishes before executing the next bit
fetchTasks.xhr.done(function () {
tasksJSON = tasks.toJSON();
//loop through all the tasks
_.each(tasksJSON, function (task) {
//if one of the tasks isn't completed, throw an error message, and add a validation problem
if (task.status != 'Completed') {
app.alert.show('message-id', {
level: 'error',
messages: 'The Case has a related task that is not completed and therefore the Task cannot be closed',
autoClose: true
});
errors['status'] = errors['status'] || {};
errors['status'].required = true;
}
});
//proceed to the callbacks
callback(null, fields, errors);
});
} else {
//proceed to the callbacks
callback(null, fields, errors);
}
}
})
Let me know if this works, and if it doesn't, let me know what the console says. I'm hoping to get a development environment up soon so I can test it myself.
Bao Tran Hoang Did this work for you? Otherwise I'll finish setting up an environment to test it on.
Hi Alan Apter,
I've just teted, It worked. You are my HERO, thank you very much Alan
Hi Alan Apter,
The red alert display in sort time, how can display this alert more time
I'm glad I helped.
If you want the alert to display forever, try changing 'autoClose: true' to false - that way the message will display until the user closes it.
If you want to display it for a specific amount of time and then close it, you can check the documentation:
Basically you'd change autoclose to false, and then you'd add something below the alert that would close the alert after some time. E.g.:
setTimeout(
function() {
app.alert.dismiss('message-id');
}, 5000);
That will dismiss the message after a specific amount of time.
I'm glad I helped.
If you want the alert to display forever, try changing 'autoClose: true' to false - that way the message will display until the user closes it.
If you want to display it for a specific amount of time and then close it, you can check the documentation:
Basically you'd change autoclose to false, and then you'd add something below the alert that would close the alert after some time. E.g.:
setTimeout(
function() {
app.alert.dismiss('message-id');
}, 5000);
That will dismiss the message after a specific amount of time.
Hi Alan Apter,
I used autoCloseDelay: and It worked
Thanks