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' => '*'));
Expected response code 200, got 409
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 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/[email protected]/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="[email protected]" 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:
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="BxAaTxRZAyp7ImBq">
Edit: The docs can of course be found by Googlin', but maybe a direct link is easier.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With