Come faccio ad aggiungere una scheda personalizzata nella pagina del profilo utente?


11

Devo aggiungere una scheda personalizzata nella pagina del profilo utente. Ho definito il mio percorso come di seguito:

mymodule.routing.yml

mymodule.account:
path: '/user/{user}/custom'
defaults: 
  _form: '\Drupal\mymodule\Form\MyModuleUserSettingsForm'
  _title: 'Custom Settings'
  user: \d+
requirements:
  _permission: 'access content'

mymodule.links.task.yml

mymodule.account:
  title: Mymodule Settings
  route_name: mymodule.account
  base_route: entity.user.canonical

mymodule.links.menu.yml

mymodule.account:
  title: My module Settings
  parent: entity.user.canonical
  route_name: mymodule.account

Quindi, dopo che è stata visualizzata la scheda della cache vuota nella pagina del profilo. Ma quando apro url / user / 1 / custom vedo il messaggio pagina non trovata.


1
utente: \ d + dovrebbe andare sotto i requisiti - apporta quella modifica, svuota tutta la cache, vedi se la pagina non viene ancora trovata.
Kevin,

Risposte:


5

Il tuo problema è nel mymodule.routing.ymlfile, il grosso problema è il posto di user: \d+, questa riga deve essere nella requirements:sezione, l'altro problema è il rientro. Quindi il codice finale dovrebbe essere:

mymodule.account:
  path: '/user/{user}/custom'
  defaults: 
    _form: '\Drupal\mymodule\Form\MyModuleUserSettingsForm'
    _title: 'Custom Settings'
  requirements:
    _permission: 'access content'
    user: \d+

E ovviamente hai bisogno della definizione della classe del modulo in src/Form/MyModuleUserSettingsForm.php

<?php

namespace Drupal\mymodule\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Class MyModuleUserSettingsForm.
 *
 * @package Drupal\mymodule\Form
 */
class MyModuleUserSettingsForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'simple_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['title'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Title'),
      '#maxlength' => 64,
      '#size' => 64,
      '#required' => TRUE,
    ];
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Submit'),
    ];

    return $form;
  }

  public function validateForm(array &$form, FormStateInterface $form_state) {  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {  }

}

E un mymodule.info.ymlfile per completare il modulo (in questo caso denominato mymodule)

name: My Module
type: module
description: 'My module'
core: 8.x
package: Custom

Riferimento: struttura dei percorsi


Interessante che la struttura dei percorsi non menzioni la chiave user:né dove dovrebbe andare ... Forse i documenti devono essere migliorati / modificati? o mi sono perso qualcosa?
No Sssweat,

nvm, vedo, è sotto _entity_access: e hanno usato il nodo come esempio lì, quindi perché il mio "user:" CTRL + F non ha trovato nulla.
No Sssweat,

3

Esistono due modi per caricare un modulo utilizzando un percorso. È possibile caricare un callback che carica un modulo e lo restituisce come parte dell'array di build oppure è possibile caricare il modulo direttamente impostando il parametro _form per impostazione predefinita.

Puoi cercare nella base di codice per trovare esempi funzionanti, copiarli in mymodule.routing.yml, modificarli in base alle tue esigenze e quindi ricostruire la cache.

Caricamento modulo dal callback:

C'è un esempio funzionante nel modulo di contatto:

/core/modules/contact/contact.routing.yml

entity.user.contact_form:
  path: '/user/{user}/contact'
  defaults:
    _title: 'Contact'
    _controller: '\Drupal\contact\Controller\ContactController::contactPersonalPage'
  requirements:
    _access_contact_personal_tab: 'TRUE'
    user: \d+

Quindi in /core/modules/contact/src/Controller/ContactController.php

puoi vedere un esempio di come caricare un modulo nel callback:

  public function contactPersonalPage(UserInterface $user) {
    // Do not continue if the user does not have an email address configured.
    if (!$user->getEmail()) {
      throw new NotFoundHttpException();
    }

    $message = $this->entityManager()->getStorage('contact_message')->create(array(
      'contact_form' => 'personal',
      'recipient' => $user->id(),
    ));

    $form = $this->entityFormBuilder()->getForm($message);
    $form['#title'] = $this->t('Contact @username', array('@username' => $user->getDisplayName()));
    $form['#cache']['contexts'][] = 'user.permissions';
    return $form;
  }

Caricamento modulo direttamente dal percorso:

Se desideri caricare il modulo direttamente utilizzando il valore predefinito _form, c'è un esempio nel modulo di scelta rapida in /core/modules/shortcut/shortcut.routing.yml

shortcut.set_switch:
  path: '/user/{user}/shortcuts'
  defaults:
    _form: 'Drupal\shortcut\Form\SwitchShortcutSet'
    _title: 'Shortcuts'
  requirements:
    _custom_access: 'Drupal\shortcut\Form\SwitchShortcutSet::checkAccess'
  options:
    _admin_route: TRUE
    user: \d+

In questo caso, l'utente viene passato come parametro al modulo, vedere /core/modules/shortcut/src/Form/SwitchShortcutSet.php

  public function buildForm(array $form, FormStateInterface $form_state, UserInterface $user = NULL) {

1

Alcune cose che posso individuare a portata di mano ...

Hai TUTTO chiamato mymodule.account. Lo diversificherei un po '. Prendi in considerazione l'idea per la pagina delle attività:

mymodule.account_tab:
  title: Mymodule Settings
  route_name: mymodule.account
  base_route: entity.user.canonical

Non credo nemmeno che tu abbia bisogno di qualcosa nel menu per questo.

Tra quei due, dovresti essere bravo ad andare! Sentiti libero di contattarmi direttamente se non riesci a capirlo perché - SOLO-- ho fatto in modo che funzioni sulla mia porta D8 di Apply For Role!


1

In modulename.routing.yml devi passare l'argomento utente come di seguito

profile.user_information:
  path: '/user/{user}/profile'
  defaults:
    _form: '\Drupal\profile\Form\UserInformation'
    _title: 'UserInformation'
  requirements:
    _permission: 'access content'
  options:
    user: \d+

e in modulename.links.task.yml hai il codice come sotto

profile.user_information:
  title: User profile
  route_name: profile.user_information
  base_route: entity.user.canonical
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.