When trying to update an entry on Google Apps No ETag found is returned.. Adding entries works just fine, but can’t neither update or delete entries!?
The ETag is added to the header in one of the last lines in the code:
$this->gdata->updateEntry($doc->saveXML(), $update_entry->getEditLink()->href, null, array('If-Match' => '*'));
Exception
Expected response code 200, got 409
Code
private function update_entry($data, $update_entry=null){
$doc = new DOMDocument();
$doc->formatOutput = true;
$entry = $doc->createElement('atom:entry');
$entry->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:atom', 'http://www.w3.org/2005/Atom');
$entry->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:gd', 'http://schemas.google.com/g/2005');
$doc->appendChild($entry);
if($update_entry){
preg_match('/^"?([^"]*)"?$/i', $update_entry->getEtag(), $matches);
$etag_value = $matches[1];
$entry->setAttribute('gd:etag', $etag_value);
$id = $doc->createElement('id', 'http://www.google.com/m8/feeds/contacts/'.$this->admin_user.'/base/'.$data['alias']);
$entry->appendChild($id);
}
$name = $doc->createElement('gd:name');
$entry->appendChild($name);
$fullName = $doc->createElement('gd:fullName', $data['name']);
$name->appendChild($fullName);
if($data['title']){
$org = $doc->createElement('gd:organization');
$org->setAttribute('rel' ,'http://schemas.google.com/g/2005#work');
$entry->appendChild($org);
$orgName = $doc->createElement('gd:orgTitle', $data['title']);
$org->appendChild($orgName);
}
if($data['email']){
$email = $doc->createElement('gd:email');
$email->setAttribute('address', $data['email']);
$email->setAttribute('rel', 'http://schemas.google.com/g/2005#work');
$entry->appendChild($email);
}
if($data['phone_work']){
$phone_work = $doc->createElement('gd:phoneNumber', $data['phone_work']);
$phone_work->setAttribute('rel', 'http://schemas.google.com/g/2005#work');
$entry->appendChild($phone_work);
}
if($data['phone_work_mobile']){
$phone_work_mobile = $doc->createElement('gd:phoneNumber', $data['phone_work_mobile']);
$phone_work_mobile->setAttribute('rel', 'http://schemas.google.com/g/2005#work_mobile');
$entry->appendChild($phone_work_mobile);
}
if($update_entry){
echo $doc->saveXML();
$this->gdata->updateEntry($doc->saveXML(), $update_entry->getEditLink()->href, null, array('If-Match' => $etag_value));
}
else{
$this->gdata->insertEntry($doc->saveXML(), 'http://www.google.com/m8/feeds/contacts/'.self::DOMAIN.'/full');
}
}
XML
<?xml version="1.0"?>
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="CxFbERtcFit7I2Bu">
<id>http://www.google.com/m8/feeds/contacts/admin_user@domain.com/base/alias</id>
<gd:name>
<gd:fullName>name</gd:fullName>
</gd:name>
<gd:organization rel="http://schemas.google.com/g/2005#work">
<gd:orgTitle>title</gd:orgTitle>
</gd:organization>
<gd:email address="mail@domain.com" rel="http://schemas.google.com/g/2005#work"/>
<gd:phoneNumber rel="http://schemas.google.com/g/2005#work">22260435</gd:phoneNumber>
<gd:phoneNumber rel="http://schemas.google.com/g/2005#work_mobile">1112223</gd:phoneNumber>
</atom:entry>
At first glance everything seems to be OK, but looking at the google docs (pun intended), it seems google puts the etag as an attribute on the entry tag directly:
Edit: The docs can of course be found by Googlin’, but maybe a direct link is easier.