<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.service.delicious">
    <title>Zend_Service_Delicious</title>

    <sect2 id="zend.service.delicious.introduction">
        <title>Introduction</title>

        <para>
            <classname>Zend_Service_Delicious</classname> is simple <acronym>API</acronym> for using
            <ulink url="http://del.icio.us">del.icio.us</ulink> <acronym>XML</acronym> and
            <acronym>JSON</acronym> web services. This component gives you read-write access to
            posts at del.icio.us if you provide credentials. It also allows read-only access to
            public data of all users.
        </para>

        <example id="zend.service.delicious.introduction.getAllPosts">
            <title>Get all posts</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getAllPosts();

foreach ($posts as $post) {
    echo "--\n";
    echo "Title: {$post->getTitle()}\n";
    echo "Url: {$post->getUrl()}\n";
}
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.retrieving_posts">
        <title>Retrieving posts</title>

        <para>
            <classname>Zend_Service_Delicious</classname> provides three methods for retrieving
            posts: <methodname>getPosts()</methodname>, <methodname>getRecentPosts()</methodname>
            and <methodname>getAllPosts()</methodname>. All of these methods return an instance of
            <classname>Zend_Service_Delicious_PostList</classname>, which holds all retrieved posts.
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Get posts matching the arguments. If no date or url is given,
 * most recent date will be used.
 *
 * @param string $tag Optional filtering by tag
 * @param Zend_Date $dt Optional filtering by date
 * @param string $url Optional filtering by url
 * @return Zend_Service_Delicious_PostList
 */
public function getPosts($tag = null, $dt = null, $url = null);

/**
 * Get recent posts
 *
 * @param string $tag   Optional filtering by tag
 * @param string $count Maximal number of posts to be returned
 *                      (default 15)
 * @return Zend_Service_Delicious_PostList
 */
public function getRecentPosts($tag = null, $count = 15);

/**
 * Get all posts
 *
 * @param string $tag Optional filtering by tag
 * @return Zend_Service_Delicious_PostList
 */
public function getAllPosts($tag = null);
]]></programlisting>
    </sect2>

    <sect2 id="zend.service.delicious.postlist">
        <title>Zend_Service_Delicious_PostList</title>

        <para>
            Instances of this class are returned by the <methodname>getPosts()</methodname>,
            <methodname>getAllPosts()</methodname>, <methodname>getRecentPosts()</methodname>, and
            <methodname>getUserPosts()</methodname> methods of
            <classname>Zend_Service_Delicious</classname>.
        </para>

        <para>
            For easier data access this class implements the <code>Countable</code>,
            <code>Iterator</code>, and <code>ArrayAccess</code> interfaces.
        </para>

        <example id="zend.service.delicious.postlist.accessing_post_lists">
            <title>Accessing post lists</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getAllPosts();

// count posts
echo count($posts);

// iterate over posts
foreach ($posts as $post) {
    echo "--\n";
    echo "Title: {$post->getTitle()}\n";
    echo "Url: {$post->getUrl()}\n";
}

// get post using array access
echo $posts[0]->getTitle();
]]></programlisting>
        </example>

        <note>
            <para>
                The <methodname>ArrayAccess::offsetSet()</methodname> and
                <methodname>ArrayAccess::offsetUnset()</methodname> methods throw exceptions in this
                implementation. Thus, code like <code>unset($posts[0]);</code> and
                <code>$posts[0] = 'A';</code> will throw exceptions because these properties are
                read-only.
            </para>
        </note>

        <para>
            Post list objects have two built-in filtering capabilities. Post lists may be filtered
            by tags and by <acronym>URL</acronym>.
        </para>

        <example id="zend.service.delicious.postlist.example.withTags">
            <title>Filtering a Post List with Specific Tags</title>

            <para>
                Posts may be filtered by specific tags using <methodname>withTags()</methodname>. As
                a convenience, <methodname>withTag()</methodname> is also provided for when only a
                single tag needs to be specified.
            </para>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getAllPosts();

// Print posts having "php" and "zend" tags
foreach ($posts->withTags(array('php', 'zend')) as $post) {
    echo "Title: {$post->getTitle()}\n";
    echo "Url: {$post->getUrl()}\n";
}
]]></programlisting>
        </example>

        <example id="zend.service.delicious.postlist.example.byUrl">
            <title>Filtering a Post List by URL</title>

            <para>
                Posts may be filtered by <acronym>URL</acronym> matching a specified regular
                expression using the <methodname>withUrl()</methodname> method:
            </para>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getAllPosts();

// Print posts having "help" in the URL
foreach ($posts->withUrl('/help/') as $post) {
    echo "Title: {$post->getTitle()}\n";
    echo "Url: {$post->getUrl()}\n";
}
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.editing_posts">
        <title>Editing posts</title>

        <example id="zend.service.delicious.editing_posts.post_editing">
            <title>Post editing</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getPosts();

// set title
$posts[0]->setTitle('New title');
// save changes
$posts[0]->save();
]]></programlisting>
        </example>

        <example id="zend.service.delicious.editing_posts.method_call_chaining">
            <title>Method call chaining</title>

            <para>
               Every setter method returns the post object so that you can chain method calls using
               a fluent interface.
            </para>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');
$posts = $delicious->getPosts();

$posts[0]->setTitle('New title')
         ->setNotes('New notes')
         ->save();
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.deleting_posts">
        <title>Deleting posts</title>

        <para>
            There are two ways to delete a post, by specifying the post <acronym>URL</acronym> or by
            calling the <methodname>delete()</methodname> method upon a post object.
        </para>

        <example id="zend.service.delicious.deleting_posts.deleting_posts">
            <title>Deleting posts</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');

// by specifying URL
$delicious->deletePost('http://framework.zend.com');

// or by calling the method upon a post object
$posts = $delicious->getPosts();
$posts[0]->delete();

// another way of using deletePost()
$delicious->deletePost($posts[0]->getUrl());
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.adding_posts">
        <title>Adding new posts</title>

        <para>
            To add a post you first need to call the <methodname>createNewPost()</methodname>
            method, which returns a <classname>Zend_Service_Delicious_Post</classname> object. When
            you edit the post, you need to save it to the del.icio.us database by calling the
            <methodname>save()</methodname> method.
        </para>

        <example id="zend.service.delicious.adding_posts.adding_a_post">
            <title>Adding a post</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');

// create a new post and save it (with method call chaining)
$delicious->createNewPost('Zend Framework', 'http://framework.zend.com')
          ->setNotes('Zend Framework Homepage')
          ->save();

// create a new post and save it  (without method call chaining)
$newPost = $delicious->createNewPost('Zend Framework',
                                     'http://framework.zend.com');
$newPost->setNotes('Zend Framework Homepage');
$newPost->save();
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.tags">
        <title>Tags</title>

        <example id="zend.service.delicious.tags.tags">
            <title>Tags</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');

// get all tags
print_r($delicious->getTags());

// rename tag ZF to zendFramework
$delicious->renameTag('ZF', 'zendFramework');
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.bundles">
        <title>Bundles</title>

        <example id="zend.service.delicious.bundles.example">
            <title>Bundles</title>

            <programlisting language="php"><![CDATA[
$delicious = new Zend_Service_Delicious('username', 'password');

// get all bundles
print_r($delicious->getBundles());

// delete bundle someBundle
$delicious->deleteBundle('someBundle');

// add bundle
$delicious->addBundle('newBundle', array('tag1', 'tag2'));
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.service.delicious.public_data">
        <title>Public data</title>

        <para>
            The del.icio.us web <acronym>API</acronym> allows access to the public data of all
            users.
        </para>

        <table id="zend.service.delicious.public_data.functions_for_retrieving_public_data">
            <title>Methods for retrieving public data</title>

            <tgroup cols="3">
                <thead>
                    <row>
                        <entry>Name</entry>
                        <entry>Description</entry>
                        <entry>Return type</entry>
                    </row>
                </thead>

                <tbody>
                    <row>
                        <entry><methodname>getUserFans()</methodname></entry>
                        <entry>Retrieves fans of a user</entry>
                        <entry>Array</entry>
                    </row>

                    <row>
                        <entry><methodname>getUserNetwork()</methodname></entry>
                        <entry>Retrieves network of a user</entry>
                        <entry>Array</entry>
                    </row>

                    <row>
                        <entry><methodname>getUserPosts()</methodname></entry>
                        <entry>Retrieves posts of a user</entry>
                        <entry>Zend_Service_Delicious_PostList</entry>
                    </row>

                    <row>
                        <entry><methodname>getUserTags()</methodname></entry>
                        <entry>Retrieves tags of a user</entry>
                        <entry>Array</entry>
                    </row>
                </tbody>
            </tgroup>
        </table>

        <note>
            <para>
                When using only these methods, a username and password combination is not required
                when constructing a new <classname>Zend_Service_Delicious</classname> object.
            </para>
        </note>

        <example id="zend.service.delicious.public_data.retrieving_public_data">
            <title>Retrieving public data</title>

            <programlisting language="php"><![CDATA[
// username and password are not required
$delicious = new Zend_Service_Delicious();

// get fans of user someUser
print_r($delicious->getUserFans('someUser'));

// get network of user someUser
print_r($delicious->getUserNetwork('someUser'));

// get tags of user someUser
print_r($delicious->getUserTags('someUser'));
]]></programlisting>
        </example>

        <sect3 id="zend.service.delicious.public_data.posts">
            <title>Public posts</title>

            <para>
                When retrieving public posts with the <methodname>getUserPosts()</methodname>
                method, a <classname>Zend_Service_Delicious_PostList</classname> object is returned,
                and it contains <classname>Zend_Service_Delicious_SimplePost</classname> objects,
                which contain basic information about the posts, including <acronym>URL</acronym>,
                title, notes, and tags.
            </para>

            <table id="zend.service.delicious.public_data.posts.SimplePost_methods">
                <title>Methods of the Zend_Service_Delicious_SimplePost class</title>

                <tgroup cols="3">
                    <thead>
                        <row>
                            <entry>Name</entry>
                            <entry>Description</entry>
                            <entry>Return type</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry><methodname>getNotes()</methodname></entry>
                            <entry>Returns notes of a post</entry>
                            <entry>String</entry>
                        </row>

                        <row>
                            <entry><methodname>getTags()</methodname></entry>
                            <entry>Returns tags of a post</entry>
                            <entry>Array</entry>
                        </row>

                        <row>
                            <entry><methodname>getTitle()</methodname></entry>
                            <entry>Returns title of a post</entry>
                            <entry>String</entry>
                        </row>

                        <row>
                            <entry><methodname>getUrl()</methodname></entry>
                            <entry>Returns <acronym>URL</acronym> of a post</entry>
                            <entry>String</entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>
        </sect3>
    </sect2>

    <sect2 id="zend.service.delicious.httpclient">
        <title>HTTP client</title>

        <para>
            <classname>Zend_Service_Delicious</classname> uses
            <classname>Zend_Rest_Client</classname> for making <acronym>HTTP</acronym> requests to
            the del.icio.us web service. To change which <acronym>HTTP</acronym> client
            <classname>Zend_Service_Delicious</classname> uses, you need to change the
            <acronym>HTTP</acronym> client of <classname>Zend_Rest_Client</classname>.
        </para>

        <example id="zend.service.delicious.httpclient.changing">
            <title>Changing the HTTP client of Zend_Rest_Client</title>

            <programlisting language="php"><![CDATA[
$myHttpClient = new My_Http_Client();
Zend_Rest_Client::setHttpClient($myHttpClient);
]]></programlisting>
        </example>

        <para>
            When you are making more than one request with
            <classname>Zend_Service_Delicious</classname> to speed your requests, it's better to
            configure your <acronym>HTTP</acronym> client to keep connections alive.
        </para>

        <example id="zend.service.delicious.httpclient.keepalive">
            <title>Configuring your HTTP client to keep connections alive</title>

            <programlisting language="php"><![CDATA[
Zend_Rest_Client::getHttpClient()->setConfig(array(
        'keepalive' => true
));
]]></programlisting>
        </example>

        <note>
            <para>
                When a <classname>Zend_Service_Delicious</classname> object is constructed, the
                <acronym>SSL</acronym> transport of <classname>Zend_Rest_Client</classname> is set
                to <code>'ssl'</code> rather than the default of <code>'ssl2'</code>. This is
                because del.icio.us has some problems with <code>'ssl2'</code>, such as requests
                taking a long time to complete (around 2 seconds).
            </para>
        </note>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
