Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 81 |
| ContextualLinks | |
0.00% |
0 / 1 |
|
16.67% |
1 / 6 |
272 | |
0.00% |
0 / 81 |
| usesGroupBy | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| defineOptions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| buildOptionsForm | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 20 |
|||
| preRender | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
| render | |
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 46 |
|||
| query | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\contextual\Plugin\views\field\ContextualLinks. | |
| */ | |
| namespace Drupal\contextual\Plugin\views\field; | |
| use Drupal\Component\Serialization\Json; | |
| use Drupal\Component\Utility\Html; | |
| use Drupal\Component\Utility\UrlHelper; | |
| use Drupal\Core\Form\FormStateInterface; | |
| use Drupal\Core\Routing\RedirectDestinationTrait; | |
| use Drupal\Core\Url; | |
| use Drupal\views\Plugin\views\field\FieldPluginBase; | |
| use Drupal\views\ResultRow; | |
| /** | |
| * Provides a handler that adds contextual links. | |
| * | |
| * @ingroup views_field_handlers | |
| * | |
| * @ViewsField("contextual_links") | |
| */ | |
| class ContextualLinks extends FieldPluginBase { | |
| use RedirectDestinationTrait; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function usesGroupBy() { | |
| return FALSE; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function defineOptions() { | |
| $options = parent::defineOptions(); | |
| $options['fields'] = array('default' => array()); | |
| $options['destination'] = array('default' => 1); | |
| return $options; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildOptionsForm(&$form, FormStateInterface $form_state) { | |
| $all_fields = $this->view->display_handler->getFieldLabels(); | |
| // Offer to include only those fields that follow this one. | |
| $field_options = array_slice($all_fields, 0, array_search($this->options['id'], array_keys($all_fields))); | |
| $form['fields'] = array( | |
| '#type' => 'checkboxes', | |
| '#title' => $this->t('Fields'), | |
| '#description' => $this->t('Fields to be included as contextual links.'), | |
| '#options' => $field_options, | |
| '#default_value' => $this->options['fields'], | |
| ); | |
| $form['destination'] = array( | |
| '#type' => 'select', | |
| '#title' => $this->t('Include destination'), | |
| '#description' => $this->t('Include a "destination" parameter in the link to return the user to the original view upon completing the contextual action.'), | |
| '#options' => array( | |
| '0' => $this->t('No'), | |
| '1' => $this->t('Yes'), | |
| ), | |
| '#default_value' => $this->options['destination'], | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function preRender(&$values) { | |
| // Add a row plugin css class for the contextual link. | |
| $class = 'contextual-region'; | |
| if (!empty($this->view->style_plugin->options['row_class'])) { | |
| $this->view->style_plugin->options['row_class'] .= " $class"; | |
| } | |
| else { | |
| $this->view->style_plugin->options['row_class'] = $class; | |
| } | |
| } | |
| /** | |
| * Overrides \Drupal\views\Plugin\views\field\FieldPluginBase::render(). | |
| * | |
| * Renders the contextual fields. | |
| * | |
| * @param \Drupal\views\ResultRow $values | |
| * The values retrieved from a single row of a view's query result. | |
| * | |
| * @see contextual_preprocess() | |
| * @see contextual_contextual_links_view_alter() | |
| */ | |
| public function render(ResultRow $values) { | |
| $links = array(); | |
| foreach ($this->options['fields'] as $field) { | |
| $rendered_field = $this->view->style_plugin->getField($values->index, $field); | |
| if (empty($rendered_field)) { | |
| continue; | |
| } | |
| $title = $this->view->field[$field]->last_render_text; | |
| $path = ''; | |
| if (!empty($this->view->field[$field]->options['alter']['path'])) { | |
| $path = $this->view->field[$field]->options['alter']['path']; | |
| } | |
| elseif (!empty($this->view->field[$field]->options['alter']['url']) && $this->view->field[$field]->options['alter']['url'] instanceof Url) { | |
| $path = $this->view->field[$field]->options['alter']['url']->toString(); | |
| } | |
| if (!empty($title) && !empty($path)) { | |
| // Make sure that tokens are replaced for this paths as well. | |
| $tokens = $this->getRenderTokens(array()); | |
| $path = strip_tags(Html::decodeEntities(strtr($path, $tokens))); | |
| $links[$field] = array( | |
| 'href' => $path, | |
| 'title' => $title, | |
| ); | |
| if (!empty($this->options['destination'])) { | |
| $links[$field]['query'] = $this->getDestinationArray(); | |
| } | |
| } | |
| } | |
| // Renders a contextual links placeholder. | |
| if (!empty($links)) { | |
| $contextual_links = array( | |
| 'contextual' => array( | |
| '', | |
| array(), | |
| array( | |
| 'contextual-views-field-links' => UrlHelper::encodePath(Json::encode($links)), | |
| ) | |
| ) | |
| ); | |
| $element = array( | |
| '#type' => 'contextual_links_placeholder', | |
| '#id' => _contextual_links_to_id($contextual_links), | |
| ); | |
| return drupal_render($element); | |
| } | |
| else { | |
| return ''; | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function query() { } | |
| } |