0

We purchased some new workflow software for work and I didn't realise how much I would need to know PHP and JavaScript.

With this in mind I am reading 'PHP in a NutShell' as recommended by another forum however even this is hard to digest as it assumes you understand how loops and functions already work.

I can get the basics of variables and how they are used in the code but arrays, loops and functions are a little hard to grasp. There are a couple of PHP code triggers that I cant seem to get right and below is my code as well as a sample from the support techs, I have designed the forms and allocated users but basically the below code is supposed to email all PDFs uploaded at a particular step to the original requested.

If I want to email the PDFs attached to a single field the below code works:

$caseId = @@APPLICATION; //Unique ID for the current case
$inDocDef = "173362805574c6ebbd80c15022322251"; //change for the Input Document definition's unique ID
$aAttachFiles = array();

$inDocQuery = "SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID='$caseId' AND AD.DOC_UID='$inDocDef' AND AD.APP_DOC_STATUS='ACTIVE' AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = 'APP_DOC_FILENAME'";

$inDocs = executeQuery($inDocQuery);

@@respQuery= $inDocs ;


if (is_array($inDocs)) {

    foreach ($inDocs as $inDoc)
    {

        $ext = pathinfo($inDoc['FILENAME'], PATHINFO_EXTENSION);

        $aAttachFiles[$inDoc['FILENAME']] = PATH_DOCUMENT . G::getPathFromUID($caseId) . PATH_SEP .
         $inDoc['APP_DOC_UID'] . '_' . $inDoc['DOC_VERSION'] . '.' .$ext;


   }
}


@@respfinalArray = $aAttachFiles;


$usr = userInfo(@@USER_LOGGED);
PMFSendMessage(@@APPLICATION, '%server email address%', $usr['mail'], '', '', 
   'Client documents uploaded', 'emailitinerary.html', array(), $aAttachFiles);

The trouble is when I try to email from 3 input fields that a user uploads PDF's too. I may have completely butchered the code but here is where I am up to:

$usr = userInfo(@@USER_LOGGED);
$caseId = @@APPLICATION; //Unique ID for the current case
$inDocDef = "834960937575e046b8e06e1049453847"; 
$inDocDef1 = "133361816575e046b8ae8c0018840374";
$inDocDef2 = "887481689575e046b8e5a22014533981";//change for the Input Document definition's unique ID
$aAttachFiles = array();

$inDocQuery = 'SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID="$caseId" AND AD.DOC_UID="$inDocDef" AND AD.APP_DOC_STATUS="ACTIVE" AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = "APP_DOC_FILENAME"';

$inDocQuery1 = 'SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID="$caseId" AND AD.DOC_UID="$inDocDef1" AND AD.APP_DOC_STATUS="ACTIVE" AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = "APP_DOC_FILENAME"';

$inDocQuery2 = 'SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID="$caseId" AND AD.DOC_UID="$inDocDef2" AND AD.APP_DOC_STATUS="ACTIVE" AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = "APP_DOC_FILENAME"';



$inDocs = executeQuery($inDocQuery);

$inDocs1 = executeQuery($inDocQuery1);

$inDocs2 = executeQuery($inDocQuery2);

if (is_array(($inDocs) AND ($inDocs1) AND ($inDocs2)) {

    foreach ($inDocs as $inDoc and $inDocs1 as $inDoc1 and $inDocs2 as $inDoc2)
    {       
        $ext = pathinfo($inDoc['FILENAME'], PATHINFO_EXTENSION);

        $aAttachFiles[$inDoc['FILENAME']] = PATH_DOCUMENT . G::getPathFromUID($caseId) . PATH_SEP .
         $inDoc['APP_DOC_UID'] . '_' . $inDoc['DOC_VERSION'] . '.' .$ext;


   }
}



PMFSendMessage(@@APPLICATION, '', '%my email address%', '', '', 
   'Client documents uploaded', 'emailitinerary.html', array(), $aAttachFiles);

The foreach section is where I am struggling. Any help would be greatly appreciated.

halfer
  • 19,824
  • 17
  • 99
  • 186
Gunna
  • 13
  • 4

1 Answers1

1

Alright, since aman failed to fix his answer I'll post the fixed one.

Based on your code that works, all we need to do is modify the SQL Query to fetch information from records with all the DOC_UID you want, instead of just one of them. It is that simple. So instead of using this:

$inDocDef = "173362805574c6ebbd80c15022322251";
$inDocQuery = "SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID='$caseId' AND AD.DOC_UID='$inDocDef' AND AD.APP_DOC_STATUS='ACTIVE' AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = 'APP_DOC_FILENAME'";

We will be doing this:

$inDocDef = array("834960937575e046b8e06e1049453847", "133361816575e046b8ae8c0018840374", "887481689575e046b8e5a22014533981");
$inDocQuery = "SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID='$caseId' AND AD.DOC_UID IN ('" . implode("', '", $inDocDef) . "') AND AD.APP_DOC_STATUS='ACTIVE' AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = 'APP_DOC_FILENAME'";

Full code:

$caseId = @@APPLICATION; //Unique ID for the current case
$inDocDef = array("834960937575e046b8e06e1049453847", "133361816575e046b8ae8c0018840374", "887481689575e046b8e5a22014533981");
$aAttachFiles = array();

$inDocQuery = "SELECT AD.APP_DOC_UID, AD.DOC_VERSION, C.CON_VALUE AS FILENAME FROM APP_DOCUMENT AD, CONTENT C 
   WHERE AD.APP_UID='$caseId' AND AD.DOC_UID IN ('" . implode("', '", $inDocDef) . "') AND AD.APP_DOC_STATUS='ACTIVE' AND 
   AD.APP_DOC_UID = C.CON_ID AND C.CON_CATEGORY = 'APP_DOC_FILENAME'";

$inDocs = executeQuery($inDocQuery);

@@respQuery = $inDocs;

if (is_array($inDocs)) {

    foreach ($inDocs as $inDoc)
    {

        $ext = pathinfo($inDoc['FILENAME'], PATHINFO_EXTENSION);

        $aAttachFiles[$inDoc['FILENAME']] = PATH_DOCUMENT . G::getPathFromUID($caseId) . PATH_SEP .
         $inDoc['APP_DOC_UID'] . '_' . $inDoc['DOC_VERSION'] . '.' .$ext;


   }
}

@@respfinalArray = $aAttachFiles;


$usr = userInfo(@@USER_LOGGED);
PMFSendMessage(@@APPLICATION, '%server email address%', $usr['mail'], '', '', 
   'Client documents uploaded', 'emailitinerary.html', array(), $aAttachFiles);

Notes to your PHP code:

Notice that in your attempt to solve the problem, you inverted all ' for ". This will not work, because those two quotes do not behave the same. Both PHP and the SQL server handle them differently.

Related questions:

Also, the foreach() loop can only iterate through one set. You cannot use and to simply add more. To do that, you have to merge all 3 arrays into one:

foreach (array_merge($inDocs, $inDocs1, $inDocs2) as $inDoc)

But theres no point in doing it in 3 queries when you can do in 1, so I recommend abandoning that code and using this one.

Community
  • 1
  • 1
Havenard
  • 27,022
  • 5
  • 36
  • 62
  • Thank you, no way I would have come up with that solution so promptly. – Gunna Jun 16 '16 at 22:34
  • Also are you able to go into further detail on: AD.DOC_UID IN ('" . implode("', '", $inDocDef) . "') – Gunna Jun 16 '16 at 22:45
  • @Gunna You can check http://php.net/implode to see what the function does. It basically creates a string joining the elements in `$inDocDef` using `', '` as separator between them, so that it can form a valid SQL query when we concatenate it with the other strings that form the query. – Havenard Jun 16 '16 at 23:03
  • @Gunna And details about the SQL `IN` clause can be seen here: http://www.tutorialspoint.com/mysql/mysql-in-clause.htm – Havenard Jun 16 '16 at 23:04