public function FasttoggleController::toggle in Fasttoggle 8.2
Same name and namespace in other branches
- 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'
File
- src/
Controller/ FasttoggleController.php, line 123
Class
- FasttoggleController
- Route controller for Fasttoggle.
Namespace
Drupal\fasttoggle\ControllerCode
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;
}