Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/ControllerPlugin/OrderToggle.php
<?php

namespace XF\ControllerPlugin;

class
OrderToggle extends AbstractPlugin
{
    public function
actionUpdate($identifier, $displayOrderColumn = 'display_order', $activeColumn = 'active', array $options = [])
    {
       
$this->assertPostOnly();

       
$this->update($identifier, $displayOrderColumn, $activeColumn, $options);

        return
$this->message(\XF::phrase('your_changes_have_been_saved'));
    }

    public function
update($identifier, $displayOrderColumn = 'display_order', $activeColumn = 'active', array $options = [])
    {
       
$options = array_replace([
           
'activeInput' => null,
           
'displayOrderInput' => null,
           
'preSaveCallback' => null,
           
'fastOrderUpdate' => true, // TODO
       
], $options);

        if (!
$options['displayOrderInput'])
        {
           
$options['displayOrderInput'] = $displayOrderColumn;
        }

        if (!
$options['activeInput'])
        {
           
$options['activeInput'] = $activeColumn;
        }

       
$displayOrderInput = $this->request->filter($options['displayOrderInput'], 'array');
       
$activeState = $this->request->filter($options['activeInput'], 'array-bool');

       
$entities = $this->em->findByIds($identifier, $displayOrderInput);

       
$orderValue = 0;
        foreach (
$displayOrderInput AS $id)
        {
            if (
$entity = $entities[$id] ?? null)
            {
               
$orderValue += 10;

                if (
$entity->getExistingValue($displayOrderColumn) != $orderValue)
                {
                   
$entity->$displayOrderColumn = $orderValue;
                }

               
$activeState[$id] = $activeState[$id] ?? false;
                if (
$entity->getExistingValue($activeColumn) != $activeState[$id])
                {
                   
$entity->$activeColumn = $activeState[$id];
                }

                if (
$entity->isChanged([$displayOrderColumn, $activeColumn]))
                {
                    if (
$options['preSaveCallback'])
                    {
                       
$cb = $options['preSaveCallback'];
                       
$cb($entity);
                    }

                   
$entity->save();
                }
            }
        }
    }
}