Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Behavior/Indexable.php
<?php

namespace XF\Behavior;

use
XF\Mvc\Entity\Behavior;

use function
is_array, is_string;

class
Indexable extends Behavior
{
    protected function
getDefaultConfig()
    {
        return [
           
'checkForUpdates' => null
       
];
    }

    protected function
verifyConfig()
    {
        if (!
$this->contentType())
        {
            throw new \
LogicException("Structure must provide a contentType value");
        }

        if (
$this->config['checkForUpdates'] === null && !is_callable([$this->entity, 'requiresSearchIndexUpdate']))
        {
            throw new \
LogicException("If checkForUpdates is null/not specified, the entity must define requiresSearchIndexUpdate");
        }
    }

    public function
postSave()
    {
        if (
$this->requiresIndexUpdate())
        {
           
$this->triggerReindex();
        }
    }

    public function
triggerReindex()
    {
       
// if inserting this content, it won't exist, so don't need to trigger a delete
       
$deleteIfNeeded = $this->entity->isInsert() ? false : true;

        \
XF::runOnce(
           
'searchIndex-' . $this->contentType() . $this->entity->getEntityId(),
            function() use(
$deleteIfNeeded)
            {
               
$this->app()->search()->index($this->contentType(), $this->entity, $deleteIfNeeded);
            }
        );
    }

    protected function
requiresIndexUpdate()
    {
        if (
$this->entity->isInsert())
        {
            return
true;
        }

       
$checkForUpdates = $this->config['checkForUpdates'];

        if (
$checkForUpdates === null)
        {
           
// method is verified above
           
return $this->entity->requiresSearchIndexUpdate();
        }
        else if (
is_array($checkForUpdates) || is_string($checkForUpdates))
        {
            return
$this->entity->isChanged($checkForUpdates);
        }
        else
        {
            return
$checkForUpdates;
        }
    }

    public function
postDelete()
    {
        \
XF::runOnce(
           
'searchIndex-' . $this->contentType() . $this->entity->getEntityId(),
            function()
            {
               
$this->app()->search()->delete($this->contentType(), $this->entity);
            }
        );
    }
}