Believe_ Posted June 10, 2019 Share Posted June 10, 2019 Hello Guys, I've set up a bash script to automate few tasks that we did manually, but to complete this we would need to execute this script at the time of accepting an order. From reviewing some online threads, I guess it could be possible using the WHMCS AcceptOrder hook [ https://developers.whmcs.com/hooks-reference/shopping-cart/#acceptorder ] , but I'm not sure how this can be applied to get it work. My requirement is: - We have a custom product, once they have paid the fee and when the order accepted a bash script need to execute. - The client will give an IP address on a custom field at the time of order, and that need to pass as an argument to the script including the client name and email address. - for eg: /root/automate_script.sh $ipaddress $name $email If so, how would I go further doing it? Can someone shed some light on this with an example code, that would be much helpful. Thanks, 🙂 0 Quote Link to comment Share on other sites More sharing options...
Kian Posted June 11, 2019 Share Posted June 11, 2019 Create a PHP file in your includes/hook directory with this action hook: <?php use WHMCS\Database\Capsule; add_hook('AcceptOrder', 1, function($vars) { // Replace with the ID of your Product Custom Field $CustomFieldID = '4'; // Retreiving email and firstname and relid needed to get IPs later on $Data = Capsule::select(Capsule::raw('SELECT t2.relid, t3.email, t3.firstname FROM tblorders AS t1 LEFT JOIN tblinvoiceitems AS t2 ON t1.invoiceid = t2.invoiceid LEFT JOIN tblclients AS t3 ON t2.userid = t3.id WHERE t1.id = "' . $vars['orderid'] . '" AND t2.type = "Hosting"')); $Email = $Data[0]->email; $Firstname = $Data[0]->firstname; foreach ($Data as $item) $relids[] = $item->relid; // Retreiving IP $CustomFieldValue = Capsule::select(Capsule::raw('SELECT value FROM tblcustomfieldsvalues WHERE relid IN (\'' . implode('\',\'', $relids) . '\') AND fieldid = "' . $CustomFieldID . '"')); foreach ($CustomFieldValue as $ip) { // I'm just priting the command you'll need to run with exec or stuff like that. This is the output: // /root/automate_script.sh 127.0.0.1 Mike mike@example.com // /root/automate_script.sh 127.0.0.2 Mike mike@example.com echo '/root/automate_script.sh ' . $ip->value . ' ' . $Firstname . ' ' . $Email . '<hr>'; } }); 1 Quote Link to comment Share on other sites More sharing options...
Believe_ Posted June 12, 2019 Author Share Posted June 12, 2019 Hi Kian, Thank you so much for this code. Can you change it a bit to include Last Name too, and the Name should include both First and Last name before passing to the script. Also, is it possible to use shell_exec function within this hook to execute the script there? I would also like to confirm if I have more than one products with the same custom field name, then the customfield ID would varies so how I would set if ordered product is 'Hosting' then CustomFieldID would be 4, and if it is 'Email Hosting' then CustomFieldID would be 5. So a if check needed before that statement. Can you assist me to implement this. Once again thanks for this code 😊 0 Quote Link to comment Share on other sites More sharing options...
Kian Posted June 13, 2019 Share Posted June 13, 2019 <?php use WHMCS\Database\Capsule; add_hook('AcceptOrder', 1, function($vars) { // Replace with the ID of your Product Custom Field $CustomFieldID[] = '4'; $CustomFieldID[] = '5'; // Retreiving email and firstname and relid needed to get IPs later on $Data = Capsule::select(Capsule::raw('SELECT t2.relid, t3.email, t3.firstname, t3.lastname, CONCAT(t3.firstname, " ", t3.lastname) AS clientname FROM tblorders AS t1 LEFT JOIN tblinvoiceitems AS t2 ON t1.invoiceid = t2.invoiceid LEFT JOIN tblclients AS t3 ON t2.userid = t3.id WHERE t1.id = "' . $vars['orderid'] . '" AND t2.type = "Hosting"')); $Email = $Data[0]->email; $Firstname = $Data[0]->firstname; $Lastname = $Data[0]->lastname; $Clientname = $Data[0]->clientname; foreach ($Data as $item) $relids[] = $item->relid; // Retreiving IP $CustomFieldValue = Capsule::select(Capsule::raw('SELECT value FROM tblcustomfieldsvalues WHERE relid IN (\'' . implode('\',\'', $relids) . '\') AND fieldid IN (\'' . implode('\',\'', $CustomFieldID) . '\')')); foreach ($CustomFieldValue as $ip) { // I'm just priting the command you'll need to run with exec or stuff like that. This is the output: // /root/automate_script.sh 127.0.0.1 Mike mike@example.com // /root/automate_script.sh 127.0.0.2 Mike mike@example.com echo '/root/automate_script.sh ' . $ip->value . ' ' . $Firstname . ' ' . $Email . '<hr>'; } }); Where... $Firstname -> Jack $Lastname -> Black $Clientname -> Jack Black $Email -> whatever@example.com 19 hours ago, Believe_ said: Also, is it possible to use shell_exec function within this hook to execute the script there? This is what you are supposed to do. 19 hours ago, Believe_ said: I would also like to confirm if I have more than one products with the same custom field name, then the customfield ID would varies so how I would set if ordered product is 'Hosting' then CustomFieldID would be 4, and if it is 'Email Hosting' then CustomFieldID would be 5. So a if check needed before that statement. Can you assist me to implement this. The updated script already support this thing. You need to add an element for each of your Product. $CustomFieldID[] = '4'; $CustomFieldID[] = '5'; $CustomFieldID[] = '6'; $CustomFieldID[] = '7'; 0 Quote Link to comment Share on other sites More sharing options...
Averus Posted April 5, 2020 Share Posted April 5, 2020 Did you solve this exec bash part? How to? 0 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.