<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Delicious
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Post.php 24594 2012-01-05 21:27:01Z matthew $
*/
/**
* @see Zend_Date
*/
require_once 'Zend/Date.php';
/**
* @see Zend_Service_Delicious_SimplePost
*/
require_once 'Zend/Service/Delicious/SimplePost.php';
/**
* Zend_Service_Delicious_Post represents a post of a user that can be edited
*
* @category Zend
* @package Zend_Service
* @subpackage Delicious
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Delicious_Post extends Zend_Service_Delicious_SimplePost
{
/**
* Service that has downloaded the post
*
* @var Zend_Service_Delicious
*/
protected $_service;
/**
* @var int Number of people that have the same post
*/
protected $_others;
/**
* @var Zend_Date Post date
*/
protected $_date;
/**
* @var bool Post share
*/
protected $_shared = true;
/**
* @var string Post hash
*/
protected $_hash;
/**
* Constructs a new del.icio.us post
*
* @param Zend_Service_Delicious $service Service that has downloaded the post
* @param DOMElement|array $values Post content
* @throws Zend_Service_Delicious_Exception
* @return void
*/
public function __construct(Zend_Service_Delicious $service, $values)
{
$this->_service = $service;
if ($values instanceof DOMElement) {
$values = self::_parsePostNode($values);
}
if (!is_array($values) || !isset($values['url']) || !isset($values['title'])) {
/**
* @see Zend_Service_Delicious_Exception
*/
require_once 'Zend/Service/Delicious/Exception.php';
throw new Zend_Service_Delicious_Exception("Second argument must be array with at least 2 keys ('url' and"
. " 'title')");
}
if (isset($values['date']) && ! $values['date'] instanceof Zend_Date) {
/**
* @see Zend_Service_Delicious_Exception
*/
require_once 'Zend/Service/Delicious/Exception.php';
throw new Zend_Service_Delicious_Exception("Date has to be an instance of Zend_Date");
}
foreach (array('url', 'title', 'notes', 'others', 'tags', 'date', 'shared', 'hash') as $key) {
if (isset($values[$key])) {
$this->{"_$key"} = $values[$key];
}
}
}
/**
* Setter for title
*
* @param string $newTitle
* @return Zend_Service_Delicious_Post
*/
public function setTitle($newTitle)
{
$this->_title = (string) $newTitle;
return $this;
}
/**
* Setter for notes
*
* @param string $newNotes
* @return Zend_Service_Delicious_Post
*/
public function setNotes($newNotes)
{
$this->_notes = (string) $newNotes;
return $this;
}
/**
* Setter for tags
*
* @param array $tags
* @return Zend_Service_Delicious_Post
*/
public function setTags(array $tags)
{
$this->_tags = $tags;
return $this;
}
/**
* Add a tag
*
* @param string $tag
* @return Zend_Service_Delicious_Post
*/
public function addTag($tag)
{
$this->_tags[] = (string) $tag;
return $this;
}
/**
* Remove a tag
*
* @param string $tag
* @return Zend_Service_Delicious_Post
*/
public function removeTag($tag)
{
$this->_tags = array_diff($this->_tags, array((string) $tag));
return $this;
}
/**
* Getter for date
*
* @return Zend_Date
*/
public function getDate()
{
return $this->_date;
}
/**
* Getter for others
*
* This property is only populated when posts are retrieved
* with getPosts() method. The getAllPosts() and getRecentPosts()
* methods will not populate this property.
*
* @return int
*/
public function getOthers()
{
return $this->_others;
}
/**
* Getter for hash
*
* @return string
*/
public function getHash()
{
return $this->_hash;
}
/**
* Getter for shared
*
* @return bool
*/
public function getShared()
{
return $this->_shared;
}
/**
* Setter for shared
*
* @param bool $isShared
* @return Zend_Service_Delicious_Post
*/
public function setShared($isShared)
{
$this->_shared = (bool) $isShared;
return $this;
}
/**
* Deletes post
*
* @return Zend_Service_Delicious
*/
public function delete()
{
return $this->_service->deletePost($this->_url);
}
/**
* Saves post
*
* @return DOMDocument
*/
public function save()
{
$parms = array(
'url' => $this->_url,
'description'=> $this->_title,
'extended' => $this->_notes,
'shared' => ($this->_shared ? 'yes' : 'no'),
'tags' => implode(' ', (array) $this->_tags),
'replace' => 'yes'
);
/*
if ($this->_date instanceof Zend_Date) {
$parms['dt'] = $this->_date->get('Y-m-d\TH:i:s\Z');
}
*/
return $this->_service->makeRequest(Zend_Service_Delicious::PATH_POSTS_ADD, $parms);
}
/**
* Extracts content from the DOM element of a post
*
* @param DOMElement $node
* @return array
*/
protected static function _parsePostNode(DOMElement $node)
{
return array(
'url' => $node->getAttribute('href'),
'title' => $node->getAttribute('description'),
'notes' => $node->getAttribute('extended'),
'others' => (int) $node->getAttribute('others'),
'tags' => explode(' ', $node->getAttribute('tag')),
/**
* @todo replace strtotime() with Zend_Date equivalent
*/
'date' => new Zend_Date(strtotime($node->getAttribute('time'))),
'shared' => ($node->getAttribute('shared') == 'no' ? false : true),
'hash' => $node->getAttribute('hash')
);
}
}