238 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the package buepro/bookmark_pages.
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please read the
 | 
						|
 * LICENSE file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
namespace WapplerSystems\BookmarksLikesRatings\Domain\Model;
 | 
						|
 | 
						|
use TYPO3\CMS\Core\Utility\GeneralUtility;
 | 
						|
 | 
						|
/**
 | 
						|
 *
 | 
						|
 */
 | 
						|
class Bookmark
 | 
						|
{
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $id;
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $title;
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $url;
 | 
						|
    /**
 | 
						|
     * @var int
 | 
						|
     */
 | 
						|
    protected $pid;
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $parameter;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Bookmark constructor.
 | 
						|
     * Initialize the bookmark with data
 | 
						|
     *
 | 
						|
     * @param string|array $url Full url or bookmark data array (same as array from toArray())
 | 
						|
     * @param null $title
 | 
						|
     * @param null $pid page id
 | 
						|
     * @param null $parameter
 | 
						|
     */
 | 
						|
    public function __construct($url, $title = null, $pid = null, $parameter = null)
 | 
						|
    {
 | 
						|
        if (is_array($url)) {
 | 
						|
            $this->id = $url['id'];
 | 
						|
            $this->title = $url['title'];
 | 
						|
            $this->url = $url['url'];
 | 
						|
            $this->pid = $url['pid'];
 | 
						|
            $this->parameter = $url['parameter'];
 | 
						|
        } else {
 | 
						|
            $this->id = md5($pid . ':' . $parameter);
 | 
						|
            $this->title = $title;
 | 
						|
            $this->url = $url;
 | 
						|
            $this->pid = $pid;
 | 
						|
            $this->parameter = $parameter;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create bookmark from the current TSFE page
 | 
						|
     *
 | 
						|
     * @param string url to bookmark, if null TYPO3_REQUEST_URL will be used - which is wrong when we're in ajax context, then we use HTTP_REFERER
 | 
						|
     * @return Bookmark
 | 
						|
     */
 | 
						|
    public static function createFromCurrent($url = null)
 | 
						|
    {
 | 
						|
        if ($url === null) {
 | 
						|
            if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
 | 
						|
                //request is ajax
 | 
						|
                $url = GeneralUtility::getIndpEnv('HTTP_REFERER');
 | 
						|
            } else {
 | 
						|
                $url = GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL');
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        $pid = self::getFrontend()->id;
 | 
						|
        $title = self::getCurrentPageTitle();
 | 
						|
 | 
						|
        /*
 | 
						|
 | 
						|
        The idea was to store get parameters to make bookmark handling more flexible.
 | 
						|
        Unfortunately that didn't worked out.
 | 
						|
 | 
						|
        When we use ajax to trigger bookmarking the current page, we can pass the current url as parameter.
 | 
						|
        But the url doesn't have the parameters in it when you use speaking urls (realurl, simulatestatic, ...).
 | 
						|
        The problem is that there's no common api to decode urls and get the parameters.
 | 
						|
 | 
						|
        One solution would be to make the parameters available to the ajax javascript during page rendering.
 | 
						|
 | 
						|
        We skip all this and use a bit from the url for hashing and add the page id.
 | 
						|
 | 
						|
         */
 | 
						|
 | 
						|
        $urlParts = parse_url($url);
 | 
						|
        $parameter = $urlParts['path'] . '?' . $urlParts['query'] . '#' . $urlParts['fragment'];
 | 
						|
 | 
						|
        return new self($url, $title, $pid, $parameter);
 | 
						|
 | 
						|
        /*
 | 
						|
         * So what is the idea of storing the pid and the get vars?
 | 
						|
         *
 | 
						|
         * This might makes sense if urls changed for the same page (realurl).
 | 
						|
         * With this information the new working url can be restored.
 | 
						|
         *
 | 
						|
         * Not sure which way is better ...
 | 
						|
         */
 | 
						|
        //        $parameter = (array)GeneralUtility::_GET();
 | 
						|
        //        unset($parameter['id']);
 | 
						|
        //        // @todo remove cHash?
 | 
						|
        //        ksort($parameter);
 | 
						|
        //        $parameter = $parameter ? GeneralUtility::implodeArrayForUrl(false, $parameter) : '';
 | 
						|
        //
 | 
						|
        //        return new self($url, $title, $pid, $parameter);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getId()
 | 
						|
    {
 | 
						|
        return $this->id;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $id
 | 
						|
     */
 | 
						|
    public function setId($id)
 | 
						|
    {
 | 
						|
        $this->id = $id;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getTitle()
 | 
						|
    {
 | 
						|
        return $this->title;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $title
 | 
						|
     */
 | 
						|
    public function setTitle($title)
 | 
						|
    {
 | 
						|
        $this->title = $title;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getUrl()
 | 
						|
    {
 | 
						|
        return $this->url;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $url
 | 
						|
     */
 | 
						|
    public function setUrl($url)
 | 
						|
    {
 | 
						|
        $this->url = $url;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public function getPid()
 | 
						|
    {
 | 
						|
        return $this->pid;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param int $pid
 | 
						|
     */
 | 
						|
    public function setPid($pid)
 | 
						|
    {
 | 
						|
        $this->pid = $pid;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getParameter()
 | 
						|
    {
 | 
						|
        return $this->parameter;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $parameter
 | 
						|
     */
 | 
						|
    public function setParameter($parameter)
 | 
						|
    {
 | 
						|
        $this->parameter = $parameter;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the bookmark data as array
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function toArray()
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'id' => $this->id,
 | 
						|
            'title' => $this->title,
 | 
						|
            'url' => $this->url,
 | 
						|
            'pid' => $this->pid,
 | 
						|
            'parameter' => $this->parameter,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the current page title
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected static function getCurrentPageTitle()
 | 
						|
    {
 | 
						|
        return self::getFrontend()->altPageTitle ? self::getFrontend()->altPageTitle : self::getFrontend()->page['title'];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *
 | 
						|
     * @return \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
 | 
						|
     */
 | 
						|
    protected static function getFrontend()
 | 
						|
    {
 | 
						|
        return $GLOBALS['TSFE'];
 | 
						|
    }
 | 
						|
}
 |