clarkk
clarkk

Reputation: 1

Update/delete Google apps entry - No ETag found

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/[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>

Upvotes: 11

Views: 1410

Answers (2)

creativedutchmen
creativedutchmen

Reputation: 515

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.

Upvotes: 5

Ronn0
Ronn0

Reputation: 2269

You need to add an header with the E-tag, if you don't want to care about it you may use:

$this->gdata->setHeaders('If-Match: *');

Upvotes: 3

Related Questions