AjaxController.php in Sortableviews 8
File
src/Controller/AjaxController.php
View source
<?php
namespace Drupal\sortableviews\Controller;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\PrependCommand;
use Drupal\Core\Ajax\RemoveCommand;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
class AjaxController implements ContainerInjectionInterface {
use StringTranslationTrait;
protected $entityManager;
public function __construct(EntityTypeManagerInterface $entity_manager) {
$this->entityManager = $entity_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'));
}
protected function retrieveOrderFromRequest(Request $request) {
if ($request
->get('items_per_page') && $request
->get('sort_order') == 'asc') {
$adjusted_order = [];
foreach ($request
->get('current_order') as $index => $value) {
$new_index = $index + $request
->get('page_number') * $request
->get('items_per_page');
$adjusted_order[$new_index] = $value;
}
return $adjusted_order;
}
if ($request
->get('items_per_page') && $request
->get('sort_order') == 'desc') {
$complete_pages = (int) ($request
->get('total_rows') / $request
->get('items_per_page'));
if ($complete_pages == $request
->get('page_number')) {
return $request
->get('current_order');
}
$adjusted_order = [];
$mod = (int) $request
->get('total_rows') % $request
->get('items_per_page');
foreach ($request
->get('current_order') as $index => $value) {
$new_index = $index + ($complete_pages - ($request
->get('page_number') + 1)) * $request
->get('items_per_page') + $mod;
$adjusted_order[$new_index] = $value;
}
return $adjusted_order;
}
return $request
->get('current_order');
}
public function ajaxSave(Request $request) {
$entity_type = $request
->get('entity_type');
$field = $request
->get('weight_field');
$current_order = $this
->retrieveOrderFromRequest($request);
$entities = $this->entityManager
->getStorage($entity_type)
->loadMultiple(array_values($current_order));
foreach ($entities as $entity) {
$entity
->set($field, array_search($entity
->id(), $current_order));
$entity
->save();
}
$content = [
'#type' => 'container',
'#attributes' => [
'class' => 'status-messages',
],
'messages' => [
'#theme' => 'status_messages',
'#message_list' => [
'status' => [
$this
->t('Changes have been saved.'),
],
],
],
];
$response = new AjaxResponse();
$response
->addCommand(new PrependCommand('.js-view-dom-id-' . $request
->get('dom_id'), $content));
$response
->addCommand(new RemoveCommand('.js-view-dom-id-' . $request
->get('dom_id') . ' .sortableviews-ajax-trigger'));
return $response;
}
}