JcarouselViewAjaxController.php in jCarousel 8.5
File
src/Controller/JcarouselViewAjaxController.php
View source
<?php
namespace Drupal\jcarousel\Controller;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Ajax\AppendCommand;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\EventSubscriber\AjaxResponseSubscriber;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Render\RenderContext;
use Drupal\jcarousel\Ajax\JcarouselAppendCommand;
use Drupal\views\Ajax\ViewAjaxResponse;
use Drupal\views\Controller\ViewAjaxController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class JcarouselViewAjaxController extends ViewAjaxController implements ContainerInjectionInterface {
public function ajaxView(Request $request) {
$name = $request->request
->get('view_name');
$display_id = $request->request
->get('view_display_id');
if (isset($name) && isset($display_id)) {
$args = $request->request
->get('view_args');
$args = isset($args) && $args !== '' ? explode('/', $args) : [];
$args = array_map(function ($arg) {
return $arg == '' ? NULL : $arg;
}, $args);
$path = $request->request
->get('view_path');
$dom_id = $request->request
->get('view_dom_id');
$dom_id = isset($dom_id) ? preg_replace('/[^a-zA-Z0-9_-]+/', '-', $dom_id) : NULL;
$pager_element = $request->request
->get('pager_element');
$pager_element = isset($pager_element) ? intval($pager_element) : NULL;
$response = new ViewAjaxResponse();
foreach ([
'view_name',
'view_display_id',
'view_args',
'view_path',
'view_dom_id',
'pager_element',
'view_base_path',
AjaxResponseSubscriber::AJAX_REQUEST_PARAMETER,
] as $key) {
$request->query
->remove($key);
$request->request
->remove($key);
}
if (!($entity = $this->storage
->load($name))) {
throw new NotFoundHttpException();
}
$view = $this->executableFactory
->get($entity);
if ($view && $view
->access($display_id)) {
$response
->setView($view);
if (!empty($path)) {
$this->currentPath
->setPath('/' . $path, $request);
}
$request_all = $request->request
->all();
$query_all = $request->query
->all();
$request->query
->replace($request_all + $query_all);
$origin_destination = $path;
$query = UrlHelper::buildQuery($request->query
->all());
if ($query != '') {
$origin_destination .= '?' . $query;
}
$this->redirectDestination
->set($origin_destination);
if (isset($pager_element)) {
$view->displayHandlers
->get($display_id)
->setOption('pager_element', $pager_element);
}
$view->dom_id = $dom_id;
$context = new RenderContext();
$preview = $this->renderer
->executeInRenderContext($context, function () use ($view, $display_id, $args) {
return $view
->preview($display_id, $args);
});
if (!$context
->isEmpty()) {
$bubbleable_metadata = $context
->pop();
foreach ($view->result as $row) {
$rendered_row = $view->rowPlugin
->render($row);
BubbleableMetadata::createFromRenderArray($rendered_row)
->merge($bubbleable_metadata)
->applyTo($rendered_row);
$next_page = NULL;
if ($view->pager->total_items == PHP_INT_MAX / 2) {
$next_page = $view
->getCurrentPage() + 1;
}
$response
->addCommand(new JcarouselAppendCommand(".js-view-dom-id-{$dom_id}", $rendered_row, [
'next_page' => $next_page,
]));
}
}
return $response;
}
else {
throw new AccessDeniedHttpException();
}
}
else {
throw new NotFoundHttpException();
}
}
}