Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Bookmark/LabelChanger.php
<?php

namespace XF\Service\Bookmark;

use
XF\Entity\BookmarkItem;
use
XF\Entity\User;
use
XF\Service\AbstractService;

use function
is_array;

class
LabelChanger extends AbstractService
{
   
/**
     * @var BookmarkItem
     */
   
protected $bookmark;

   
/**
     * @var \XF\Entity\User
     */
   
protected $user;

    protected
$existingLabelUses = [];

    protected
$createLabels = [];
    protected
$addLabels = [];
    protected
$removeLabels = [];

    public function
__construct(\XF\App $app, BookmarkItem $bookmark, User $user)
    {
       
parent::__construct($app);
       
$this->bookmark = $bookmark;
       
$this->user = $user;

        if (
$bookmark->isUpdate())
        {
           
$this->existingLabelUses = $this->finder('XF:BookmarkLabelUse')
                ->
where('bookmark_id', $bookmark->bookmark_id)
                ->
keyedBy('label_id')
                ->
fetch()->toArray();
        }
    }

    public function
setLabels($labelList)
    {
        if (!
is_array($labelList))
        {
           
$labelList = $this->splitLabels($labelList);
        }

       
$removeExisting = $this->existingLabelUses;

       
$addLabels = $this->getBookmarkRepo()->getLabelsForUser($labelList, $this->user, $createLabels);
        foreach (
$addLabels AS $label)
        {
           
$id = $label->label_id;
            if (isset(
$this->existingLabelUses[$id]) && !isset($this->removeLabels[$id]))
            {
               
// label already applied
               
unset($removeExisting[$id]);
                continue;
            }

           
$this->addLabels[$id] = $label->label;
        }

       
$this->createLabels = array_combine($createLabels, $createLabels);

        foreach (
$removeExisting AS $label)
        {
           
/** @var \XF\Entity\BookmarkLabelUse $label */
           
$this->removeLabels[$label->label_id] = $label->label;
        }
    }

    public function
save()
    {
       
$bookmarkRepo = $this->getBookmarkRepo();
       
$bookmark = $this->bookmark;

       
$this->db()->beginTransaction();

        foreach (
$this->createLabels AS $create)
        {
           
$label = $bookmarkRepo->createLabelForUser($create, $this->user);
            if (
$label)
            {
               
$this->addLabels[$label->label_id] = $label->label;
            }
        }

       
$cache = $bookmarkRepo->modifyBookmarkLabelUses(
           
$bookmark,
           
array_keys($this->addLabels),
           
array_keys($this->removeLabels)
        );

       
$this->db()->commit();

        return
$cache;
    }

   
/**
     * @param string $labels
     *
     * @return array
     */
   
protected function splitLabels($labels)
    {
        return
$this->getBookmarkRepo()->splitLabels($labels);
    }

   
/**
     * @return \XF\Mvc\Entity\Repository|\XF\Repository\Bookmark
     */
   
protected function getBookmarkRepo()
    {
        return
$this->repository('XF:Bookmark');
    }
}