/** * {@inheritdoc} */ public function isFrontPage() { // Cache the result as this is called often. if (!isset($this->isCurrentFrontPage)) { $this->isCurrentFrontPage = FALSE; // Ensure that the code can also be executed when there is no active // route match, like on exception responses. if ($this->routeMatch->getRouteName()) { $url = Url::fromRouteMatch($this->routeMatch); $this->isCurrentFrontPage = $url->getRouteName() && '/' . $url->getInternalPath() === $this->getFrontPagePath(); } } return $this->isCurrentFrontPage; }
/** * {@inheritdoc} */ public function blockContents() { $sharethis_config = $this->configFactory->get('sharethis.settings'); $config = $this->configFactory->get('system.site'); if ($sharethis_config->get('location') == 'block') { // First Get all of the options for sharethis widget from database. $data_options = $this->getOptions(); $current_path = \Drupal::routeMatch()->getRouteName() ? Url::fromRouteMatch(\Drupal::routeMatch())->getInternalPath() : ''; $path = isset($current_path) ? $current_path : '<front>'; global $base_url; $path_obj = Url::fromUri($base_url . '/' . $path, array('absolute' => TRUE)); $m_path = $path_obj->toString(); $request = \Drupal::request(); $route_match = \Drupal::routeMatch(); $mtitle = $this->titleResolver->getTitle($request, $route_match->getRouteObject()); $m_title = is_object($mtitle) ? $mtitle->getUntranslatedString() : $config->get('name'); return $this->renderSpans($data_options, $m_title, $m_path); } }
/** * Provide a standard set of Apply/Cancel/OK buttons for the forms. Also provide * a hidden op operator because the forms plugin doesn't seem to properly * provide which button was clicked. * * TODO: Is the hidden op operator still here somewhere, or is that part of the * docblock outdated? */ public function getStandardButtons(&$form, FormStateInterface $form_state, $form_id, $name = NULL) { $form['actions'] = array('#type' => 'actions'); if (empty($name)) { $name = t('Apply'); if (!empty($this->stack) && count($this->stack) > 1) { $name = t('Apply and continue'); } $names = array(t('Apply'), t('Apply and continue')); } // Views provides its own custom handling of AJAX form submissions. Usually // this happens at the same path, but custom paths may be specified in // $form_state. $form_url = $form_state->get('url') ?: Url::fromRouteMatch(\Drupal::routeMatch()); // Forms that are purely informational set an ok_button flag, so we know not // to create an "Apply" button for them. if (!$form_state->get('ok_button')) { $form['actions']['submit'] = array('#type' => 'submit', '#value' => $name, '#id' => 'edit-submit-' . Html::getUniqueId($form_id), '#submit' => array(array($this, 'standardSubmit')), '#button_type' => 'primary', '#ajax' => array('url' => $form_url)); // Form API button click detection requires the button's #value to be the // same between the form build of the initial page request, and the // initial form build of the request processing the form submission. // Ideally, the button's #value shouldn't change until the form rebuild // step. However, \Drupal\views_ui\Form\Ajax\ViewsFormBase::getForm() // implements a different multistep form workflow than the Form API does, // and adjusts $view->stack prior to form processing, so we compensate by // extending button click detection code to support any of the possible // button labels. if (isset($names)) { $form['actions']['submit']['#values'] = $names; $form['actions']['submit']['#process'] = array_merge(array('views_ui_form_button_was_clicked'), \Drupal::service('element_info')->getInfoProperty($form['actions']['submit']['#type'], '#process', array())); } // If a validation handler exists for the form, assign it to this button. $form['actions']['submit']['#validate'][] = [$form_state->getFormObject(), 'validateForm']; } // Create a "Cancel" button. For purely informational forms, label it "OK". $cancel_submit = function_exists($form_id . '_cancel') ? $form_id . '_cancel' : array($this, 'standardCancel'); $form['actions']['cancel'] = array('#type' => 'submit', '#value' => !$form_state->get('ok_button') ? t('Cancel') : t('Ok'), '#submit' => array($cancel_submit), '#validate' => array(), '#ajax' => array('path' => $form_url), '#limit_validation_errors' => array()); // Compatibility, to be removed later: // TODO: When is "later"? // We used to set these items on the form, but now we want them on the $form_state: if (isset($form['#title'])) { $form_state->set('title', $form['#title']); } if (isset($form['#section'])) { $form_state->set('#section', $form['#section']); } // Finally, we never want these cached -- our object cache does that for us. $form['#no_cache'] = TRUE; }
/** * Tests the fromRouteMatch() method. */ public function testFromRouteMatch() { $route = new Route('/test-route/{foo}'); $route_match = new RouteMatch('test_route', $route, ['foo' => (object) [1]], ['foo' => 1]); $url = Url::fromRouteMatch($route_match); $this->assertSame('test_route', $url->getRouteName()); $this->assertEquals(['foo' => '1'], $url->getRouteParameters()); }
/** * {@inheritdoc} */ function buildForm(array $form, FormStateInterface $form_state, array $build = NULL) { // Store the entity in the form state so we can easily create the job in the // submit handler. $form_state->set('entity', $build['#entity']); $overview = $build['content_translation_overview']; $form['#title'] = $this->t('Translations of @title', array('@title' => $build['#entity']->label())); $form['actions'] = array('#type' => 'details', '#title' => t('Operations'), '#open' => TRUE, '#attributes' => array('class' => array('tmgmt-source-operations-wrapper'))); $form['actions']['request'] = array('#type' => 'submit', '#button_type' => 'primary', '#value' => $this->t('Request translation'), '#submit' => array('::submitForm')); tmgmt_add_cart_form($form['actions'], $form_state, 'content', $form_state->get('entity')->getEntityTypeId(), $form_state->get('entity')->id()); // Inject our additional column into the header. array_splice($overview['#header'], -1, 0, array(t('Pending Translations'))); // Make this a tableselect form. $form['languages'] = array('#type' => 'tableselect', '#header' => $overview['#header'], '#options' => array()); $languages = \Drupal::languageManager()->getLanguages(); // Check if there is a job / job item that references this translation. $entity_langcode = $form_state->get('entity')->language()->getId(); $items = tmgmt_job_item_load_latest('content', $form_state->get('entity')->getEntityTypeId(), $form_state->get('entity')->id(), $entity_langcode); foreach ($languages as $langcode => $language) { if ($langcode == LanguageInterface::LANGCODE_DEFAULT) { // Never show language neutral on the overview. continue; } // Since the keys are numeric and in the same order we can shift one element // after the other from the original non-form rows. $option = array_shift($overview['#rows']); if ($langcode == $entity_langcode) { $additional = array('data' => array('#markup' => '<strong>' . t('Source') . '</strong>')); // This is the source object so we disable the checkbox for this row. $form['languages'][$langcode] = array('#type' => 'checkbox', '#disabled' => TRUE); } elseif (isset($items[$langcode])) { $item = $items[$langcode]; $states = JobItem::getStates(); $path = \Drupal::routeMatch()->getRouteName() ? Url::fromRouteMatch(\Drupal::routeMatch())->getInternalPath() : ''; $destination = array('destination' => $path); $additional = \Drupal::l($states[$item->getState()], $item->urlInfo()->setOption('query', $destination)); // Disable the checkbox for this row since there is already a translation // in progress that has not yet been finished. This way we make sure that // we don't stack multiple active translations for the same item on top // of each other. $form['languages'][$langcode] = array('#type' => 'checkbox', '#disabled' => TRUE); } else { // There is no translation job / job item for this target language. $additional = t('None'); } // Inject the additional column into the array. // The generated form structure has changed, support both an additional // 'data' key (that is not supported by tableselect) and the old version // without. if (isset($option['data'])) { array_splice($option['data'], -1, 0, array($additional)); // Append the current option array to the form. $form['languages']['#options'][$langcode] = $option['data']; } else { array_splice($option, -1, 0, array($additional)); // Append the current option array to the form. $form['languages']['#options'][$langcode] = $option; } } return $form; }
/** * {@inheritdoc} */ public function build(RouteMatchInterface $route_match) { $links = array(); // General path-based breadcrumbs. Use the actual request path, prior to // resolving path aliases, so the breadcrumb can be defined by simply // creating a hierarchy of path aliases. $path = trim($this->context->getPathInfo(), '/'); $path_elements = explode('/', $path); $exclude = array(); // Don't show a link to the front-page path. $front = $this->config->get('page.front'); $exclude[$front] = TRUE; // /user is just a redirect, so skip it. // @todo Find a better way to deal with /user. $exclude['user'] = TRUE; while (count($path_elements) > 1) { array_pop($path_elements); // Copy the path elements for up-casting. $route_request = $this->getRequestForPath(implode('/', $path_elements), $exclude); if ($route_request) { $route_match = RouteMatch::createFromRequest($route_request); $access = $this->accessManager->check($route_match, $this->currentUser); if ($access) { $title = $this->titleResolver->getTitle($route_request, $route_match->getRouteObject()); } if ($access) { if (!isset($title)) { // Fallback to using the raw path component as the title if the // route is missing a _title or _title_callback attribute. $title = str_replace(array('-', '_'), ' ', Unicode::ucfirst(end($path_elements))); } $url = Url::fromRouteMatch($route_match); $links[] = new Link($title, $url); } } } if ($path && $path != $front) { // Add the Home link, except for the front page. $links[] = Link::createFromRoute($this->t('Home'), '<front>'); } return array_reverse($links); }