Undefined index in $values array in postCreate event
Undefined index in $values array in postCreate event
I'm getting a system error in a postCreate event where the $values array should contain information from two different tables. The error is caused by invalid JSON in the response. The JSON is invalid because of an Undefined index: tickets error in the $values array returned to the postCreate event. I have a very similar structure in a different application which works correctly, and I can't see what's wrong here.
The fields definition in my editor is:
fields: [
{
label: "ticket Id",
name: "notes.ticket_id",
type: "readonly"
},
{
label: "commenter:",
name: "notes.email",
def: function() {
var user = $('#theUser').attr('data-user');
return user;
}
},
{
label: "new note:",
name: "notes.content",
type: "textarea"
},
{
name: 'tickets.email',
type: 'hidden',
def: function () {
return tickets.email;
}
},
{
label: "resolved?:",
name: "notes.resolved",
type: "select",
placeholder: "yes/no",
options: [
"no",
"yes"
],
def: "no"
}
]
The relevant PHP code in my Ajax routine is:
Editor::inst( $db, 'notes', 'id' )
->fields(
Field::inst( 'notes.id' )
->set(false),
Field::inst( 'notes.created' )
->setValue(date("Y-m-d H:i:s"))
->validator( 'Validate::dateFormat', array( 'format'=>'Y-m-d H:i:s' ) )
->getFormatter( 'Format::datetime', array( 'from'=>'Y-m-d H:i:s', 'to' =>'Y-m-d H:i:s' ) )
->setFormatter( 'Format::datetime', array( 'to' =>'Y-m-d H:i:s', 'from'=>'Y-m-d H:i:s' ) ),
Field::inst( 'notes.content' ),
Field::inst( 'notes.resolved' ),
Field::inst( 'notes.email' ),
Field::inst( 'notes.ticket_id' )
->options( 'tickets', 'id', 'id' )
->validator( 'Validate::dbValues' ),
Field::inst( 'tickets.email' ),
Field::inst( 'tickets.id' )
)
->on('postCreate', function($editor,$id,$values,$row) { // Notify techs and originator of new note
notify($values['notes']['ticket_id'], $values['tickets']['email'], $values['notes']['content']);
} )
->leftJoin('tickets','tickets.id','=','notes.ticket_id') // Fetch notes for the selected ticket
->where('ticket_id',$_POST['ticket'])
->process( $_POST )
->json();
The error message is: A system error has occurred (More information).
The JSON response is:
<br />
<b>Notice</b>: Undefined index: tickets in <b>/var/www/vhosts/bajzek.com/asccintranet.bajzek.com/ITTracker/php/table.notes.php</b> on line <b>87</b><br />
{"data":[{"DT_RowId":"row_2854","notes":{"id":"2854","created":"2019-05-03 08:32:29","content":"Testing notification.","resolved":"no","email":"tom","ticket_id":"4128"},"tickets":{"email":"cory","id":"4128"}}]}
It appears that the correct information is returned in the Ajax response, insofar as the tickets data is provided, but I don't see the reason for the 'tickets' index to be invalid. What is the actual problem here?
Thanks,
Tom
Answers
Are you inline editing perhaps? That (by default) will submit only the field which has changed, so if you change a
notes
field value, the client-side wouldn't be submitting the tickets object.I'd suggest a simple solution - use
$row['tickets']['email']
rather than$values...
.$row
is what was read from the db, while$values
is what was submitting from the client-side.Allan
Allan,
It's not inline editing. I really don't want to change anything in the tickets table here. I just need to use the email field from the tickets table as the email address for the notification I want to send. If I leave out the tickets.id from the PHP, I get "Requested unknown parameter 'tickets.id' for row 0, column 1" when I try to load the notes editor. Thus, I have included it.
I tried your solution, and it did work. This leads me to other questions:
Thanks,
Tom
Basically yes. When you update a row using the Editor libraries it will then query the database to get the latest data for that row (including the updated field - it doesn't just echo the field back to the client). This is for two reasons:
Yes, use
preSubmit
to modify the data object being sent to the server. You can then read the data from$_POST
as normal.Allan