Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 82 |
ViewFormBase | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
1260 | |
0.00% |
0 / 82 |
init | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
buildForm | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 6 |
|||
prepareEntity | |
0.00% |
0 / 1 |
156 | |
0.00% |
0 / 21 |
|||
getDisplayTabs | |
0.00% |
0 / 1 |
132 | |
0.00% |
0 / 38 |
|||
isDefaultDisplayShown | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
getDisplayLabel | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 9 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\views_ui\ViewFormBase. | |
*/ | |
namespace Drupal\views_ui; | |
use Drupal\Core\Entity\EntityForm; | |
use Drupal\Core\Form\FormStateInterface; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
/** | |
* Base form for Views forms. | |
*/ | |
abstract class ViewFormBase extends EntityForm { | |
/** | |
* The name of the display used by the form. | |
* | |
* @var string | |
*/ | |
protected $displayID; | |
/** | |
* {@inheritdoc} | |
*/ | |
public function init(FormStateInterface $form_state) { | |
parent::init($form_state); | |
// @todo Remove the need for this. | |
$form_state->loadInclude('views_ui', 'inc', 'admin'); | |
$form_state->set('view', $this->entity); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildForm(array $form, FormStateInterface $form_state, $display_id = NULL) { | |
if (isset($display_id) && $form_state->has('display_id') && ($display_id !== $form_state->get('display_id'))) { | |
throw new \InvalidArgumentException('Mismatch between $form_state->get(\'display_id\') and $display_id.'); | |
} | |
$this->displayID = $form_state->has('display_id') ? $form_state->get('display_id') : $display_id; | |
return parent::buildForm($form, $form_state); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function prepareEntity() { | |
// Determine the displays available for editing. | |
if ($tabs = $this->getDisplayTabs($this->entity)) { | |
if (empty($this->displayID)) { | |
// If a display isn't specified, use the first one after sorting by | |
// #weight. | |
uasort($tabs, 'Drupal\Component\Utility\SortArray::sortByWeightProperty'); | |
foreach ($tabs as $id => $tab) { | |
if (!isset($tab['#access']) || $tab['#access']) { | |
$this->displayID = $id; | |
break; | |
} | |
} | |
} | |
// If a display is specified, but we don't have access to it, return | |
// an access denied page. | |
if ($this->displayID && !isset($tabs[$this->displayID])) { | |
throw new NotFoundHttpException(); | |
} | |
elseif ($this->displayID && (isset($tabs[$this->displayID]['#access']) && !$tabs[$this->displayID]['#access'])) { | |
throw new AccessDeniedHttpException(); | |
} | |
} | |
elseif ($this->displayID) { | |
throw new NotFoundHttpException(); | |
} | |
} | |
/** | |
* Adds tabs for navigating across Displays when editing a View. | |
* | |
* This function can be called from hook_menu_local_tasks_alter() to implement | |
* these tabs as secondary local tasks, or it can be called from elsewhere if | |
* having them as secondary local tasks isn't desired. The caller is responsible | |
* for setting the active tab's #active property to TRUE. | |
* | |
* @param $display_id | |
* The display_id which is edited on the current request. | |
*/ | |
public function getDisplayTabs(ViewUI $view) { | |
$executable = $view->getExecutable(); | |
$executable->initDisplay(); | |
$display_id = $this->displayID; | |
$tabs = array(); | |
// Create a tab for each display. | |
foreach ($view->get('display') as $id => $display) { | |
// Get an instance of the display plugin, to make sure it will work in the | |
// UI. | |
$display_plugin = $executable->displayHandlers->get($id); | |
if (empty($display_plugin)) { | |
continue; | |
} | |
$tabs[$id] = array( | |
'#theme' => 'menu_local_task', | |
'#weight' => $display['position'], | |
'#link' => array( | |
'title' => $this->getDisplayLabel($view, $id), | |
'localized_options' => array(), | |
'url' => $view->urlInfo('edit-display-form')->setRouteParameter('display_id', $id), | |
), | |
); | |
if (!empty($display['deleted'])) { | |
$tabs[$id]['#link']['localized_options']['attributes']['class'][] = 'views-display-deleted-link'; | |
} | |
if (isset($display['display_options']['enabled']) && !$display['display_options']['enabled']) { | |
$tabs[$id]['#link']['localized_options']['attributes']['class'][] = 'views-display-disabled-link'; | |
} | |
} | |
// If the default display isn't supposed to be shown, don't display its tab, unless it's the only display. | |
if ((!$this->isDefaultDisplayShown($view) && $display_id != 'default') && count($tabs) > 1) { | |
$tabs['default']['#access'] = FALSE; | |
} | |
// Mark the display tab as red to show validation errors. | |
$errors = $executable->validate(); | |
foreach ($view->get('display') as $id => $display) { | |
if (!empty($errors[$id])) { | |
// Always show the tab. | |
$tabs[$id]['#access'] = TRUE; | |
// Add a class to mark the error and a title to make a hover tip. | |
$tabs[$id]['#link']['localized_options']['attributes']['class'][] = 'error'; | |
$tabs[$id]['#link']['localized_options']['attributes']['title'] = $this->t('This display has one or more validation errors.'); | |
} | |
} | |
return $tabs; | |
} | |
/** | |
* Controls whether or not the default display should have its own tab on edit. | |
*/ | |
public function isDefaultDisplayShown(ViewUI $view) { | |
// Always show the default display for advanced users who prefer that mode. | |
$advanced_mode = \Drupal::config('views.settings')->get('ui.show.master_display'); | |
// For other users, show the default display only if there are no others, and | |
// hide it if there's at least one "real" display. | |
$additional_displays = (count($view->getExecutable()->displayHandlers) == 1); | |
return $advanced_mode || $additional_displays; | |
} | |
/** | |
* Placeholder function for overriding $display['display_title']. | |
* | |
* @todo Remove this function once editing the display title is possible. | |
*/ | |
public function getDisplayLabel(ViewUI $view, $display_id, $check_changed = TRUE) { | |
$display = $view->get('display'); | |
$title = $display_id == 'default' ? $this->t('Master') : $display[$display_id]['display_title']; | |
$title = views_ui_truncate($title, 25); | |
if ($check_changed && !empty($view->changed_display[$display_id])) { | |
$changed = '*'; | |
$title = $title . $changed; | |
} | |
return $title; | |
} | |
} |