You are here

public function FasttoggleController::toggle in Fasttoggle 8.2

Same name and namespace in other branches
  1. 8.3 src/Controller/FasttoggleController.php \Drupal\fasttoggle\Controller\FasttoggleController::toggle()

Toggle a setting.

Parameters

$request: The request object.

1 string reference to 'FasttoggleController::toggle'
fasttoggle.routing.yml in ./fasttoggle.routing.yml
fasttoggle.routing.yml

File

src/Controller/FasttoggleController.php, line 123

Class

FasttoggleController
Route controller for Fasttoggle.

Namespace

Drupal\fasttoggle\Controller

Code

public function toggle(Request $request) {

  // I don't like this - I should be able to just specify args in the routing
  // like the docs say and put them as args to this function. It wouldn't work
  // however...
  // We need to do our own handling of the path if we're coming via a view.
  $parts = explode('/', $request
    ->getPathInfo());
  if (count($parts) != 4 && count($parts) != 5) {
    $response = new Response();
    $response
      ->setContent('Incorrect number of parameters');
    $response
      ->setStatusCode(400);
    return $response;
  }

  // Use the token to look up cached parameters.
  // Fasttoggle Parameters
  // - Entity type
  // - Entity ID
  // - Setting Group
  // - Setting
  // - Language code
  // - Base formatter
  // Formatter parameters
  // - Plugin definition
  // - Field definition
  // - Settings
  // - Label
  // - View mode
  // - Third party settings
  $cid = $parts[3];
  $newValue = count($parts) == 5 ? NULL : $parts[4];
  $cached = \Drupal::cache()
    ->get('fasttoggle-' . $cid);
  if (!$cached) {
    $response = new Response();
    $response
      ->setContent('Unrecognised setting hash.');
    $response
      ->setStatusCode(400);
    return $response;
  }
  $entity_type = $cached->data['object_type'];
  $entity_id = $cached->data['object_id'];
  $group = $cached->data['group'];
  $setting = $cached->data['setting'];

  // Validate parameters.
  $this->objectManager = \Drupal::service('plugin.manager.fasttoggle.setting_object');
  $objects = $this->objectManager
    ->getDefinitions();
  if (!$objects[$entity_type]) {
    $response = new Response();
    $response
      ->setContent('Unrecognised entity type.');
    $response
      ->setStatusCode(400);
    return $response;
  }
  $controller = \Drupal::entityTypeManager()
    ->getStorage($entity_type);
  $entity = $controller
    ->load($entity_id);
  if (!$entity) {
    $response = new Response();
    $response
      ->setContent('Invalid entity ID.');
    $response
      ->setStatusCode(400);
    return $response;
  }
  $settings = $this->settingManager
    ->getDefinitions();
  if (empty($settings[$entity_type]) || empty($settings[$entity_type][$group]) || empty($settings[$entity_type][$group][$setting])) {
    return;
  }

  // Check access to the setting group.
  $plugin = $this->settingManager
    ->createInstance($setting);
  $plugin
    ->setObject($entity);
  $plugin
    ->setField($cached->data['field_definition']);

  // Check permissions.
  if (!$plugin
    ->mayEdit()
    ->allowed()) {
    $response = new Response();
    $response
      ->setContent('No edit permission.');
    $response
      ->setStatusCode(400);
    return $response;
  }

  // Apply the change - will need modifying for roles.

  //$instance = array_search($setting, $this->attributes);
  $instance = 0;
  if (is_null($newValue)) {
    $plugin
      ->nextValue($instance);
  }
  else {
    $plugin
      ->setValue($instance, $newValue);
  }
  $plugin
    ->save();
  $renderer = \Drupal::service('renderer');
  $delta = $plugin
    ->get_field();
  $render_array = $plugin
    ->formatter($delta, $cached->data);
  $html = $renderer
    ->render($render_array);

  // Return Ajax for the modified content and modified link.
  $response = new AjaxResponse();
  $response
    ->addCommand(new ReplaceCommand('#fasttoggle-' . $cid, $html . ""));
  return $response;
}