Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Poll/ResponseEditor.php
<?php

namespace XF\Poll;

use function
count, strlen;

class
ResponseEditor
{
   
/** @var \XF\Entity\Poll  */
   
protected $poll;

   
/** @var \XF\Entity\PollResponse[] */
   
protected $existingResponses = [];

    protected
$deleteResponses = [];
    protected
$replaceResponses = [];
    protected
$addResponses = [];

    public function
__construct(\XF\Entity\Poll $poll)
    {
        if (
$poll->poll_id)
        {
           
$responses = $poll->Responses->toArray();
        }
        else
        {
           
$responses = [];
        }

       
$this->poll = $poll;
       
$this->existingResponses = $responses;
    }

    public function
getExistingResponses()
    {
        return
$this->existingResponses;
    }

    public function
addResponses(array $responses)
    {
        foreach (
$responses AS $response)
        {
           
$this->addResponse($response);
        }
    }

    public function
addResponse($response)
    {
       
$response = trim($response);
        if (
strlen($response))
        {
           
$this->addResponses[] = $response;
            return
true;
        }
        else
        {
            return
false;
        }
    }

    public function
getAddedResponses()
    {
        return
$this->addResponses;
    }

    public function
deleteResponse($responseId)
    {
        if (!isset(
$this->existingResponses[$responseId]))
        {
            return
false;
        }

       
$this->deleteResponses[$responseId] = $responseId;
        return
true;
    }

    public function
getDeletedResponses()
    {
        return
$this->deleteResponses;
    }

    public function
replaceResponse($responseId, $newResponse)
    {
        if (!isset(
$this->existingResponses[$responseId]))
        {
            return
false;
        }

       
$newResponse = trim($newResponse);
        if (!
strlen($newResponse))
        {
           
$this->deleteResponse($responseId);
        }
        else
        {
           
$this->replaceResponses[$responseId] = $newResponse;
        }

        return
true;
    }

    public function
getReplacedResponses()
    {
        return
$this->replaceResponses;
    }

    public function
updateResponses(array $responses)
    {
        foreach (
$responses AS $id => $response)
        {
           
// this handles deleting if needed
           
$this->replaceResponse($id, $response);
        }
    }

    public function
countResponses()
    {
        return
count($this->existingResponses) + count($this->addResponses) - count($this->deleteResponses);
    }

    public function
saveChanges()
    {
        if (!
$this->poll->poll_id)
        {
            throw new \
LogicException("Poll must be saved before responses can be saved");
        }

        if (!
$this->addResponses && !$this->deleteResponses && !$this->replaceResponses)
        {
            return;
        }

       
$db = $this->poll->em()->getDb();
       
$existingResponses = $this->existingResponses;

       
$db->beginTransaction();

        foreach (
$this->deleteResponses AS $responseId)
        {
           
$response = $existingResponses[$responseId];
           
$response->delete(true, false);
        }

        foreach (
$this->replaceResponses AS $responseId => $value)
        {
           
$response = $existingResponses[$responseId];
           
$response->response = utf8_substr($value, 0, 100);
           
$response->save(true, false);
        }

        foreach (
$this->addResponses AS $value)
        {
           
$response = \XF::em()->create('XF:PollResponse');
           
$response->poll_id = $this->poll->poll_id;
           
$response->response = utf8_substr($value, 0, 100);
           
$response->save(true, false);
        }

       
$db->commit();

       
$this->poll->clearCache('Responses');
    }

    public function
getResponseCountErrorMessage($maxResponses = null)
    {
       
$count = $this->countResponses();
        if (
$count < 2)
        {
            return \
XF::phrase('please_enter_at_least_two_poll_responses');
        }

        if (
$maxResponses && $count > $maxResponses)
        {
            return \
XF::phrase('too_many_poll_responses_have_been_entered');
        }

        return
null;
    }
}