Kullanıcı profili sayfasına nasıl özel sekme ekleyebilirim?


11

Kullanıcı profili sayfasına özel bir sekme eklemem gerekiyor. Güzergahımı aşağıdaki gibi tanımladım:

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

Ardından önbellek sekmesini temizledikten sonra profil sayfasında görünür. Ancak url / user / 1 / custom'u açtığımda sayfanın bulunamadı iletisini görüyorum.


1
kullanıcı: \ d + gereksinimler altında olmalıdır - bu değişikliği yapın, tüm önbelleği temizleyin, hala sayfa bulunamadı mı bakalım.
Kevin

Yanıtlar:


5

Sorununuz mymodule.routing.ymldosyada, büyük sorun yer user: \d+, bu satır requirements:bölümün altında olmalı , diğer sorun girintidir. Yani son kod şöyle olmalıdır:

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

Ve elbette form sınıfı tanımına ihtiyacınız var 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) {  }

}

Ve mymodule.info.ymlmodülünüzü tamamlamak için bir dosya (bu durumda mymodule adlı)

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

Referans: Güzergahların yapısı


Rotanın yapısının anahtardan user:veya nereye gitmesi gerektiğinden bahsetmemesi ilginçtir ... Belki de belgelerin geliştirilmesi / düzenlenmesi gerekir? yoksa bir şey mi kaçırdım?
Hayır Sssweat

nvm, anladım, _entity_access altında : ve orada örnek olarak düğüm kullandılar, bu nedenle benim CTRL + F "kullanıcı:" hiçbir şey bulamadı.
Hayır Sssweat

3

Bir yolu kullanarak bir form yüklemenin iki yolu vardır. Bir formu yükleyen ve derleme dizisinin bir parçası olarak döndüren bir geri çağrı yükleyebilir veya _form parametresini varsayılanlar altında ayarlayarak formu doğrudan yükleyebilirsiniz.

Çalışma örneklerini bulmak için kod tabanında arama yapabilir, bunları mymodule.routing.yml dosyasına kopyalayabilir, ihtiyaçlarınıza göre düzenleyebilir ve ardından önbelleği yeniden oluşturabilirsiniz.

Geri aramadan form yükleniyor:

Kontak modülünde çalışan bir örnek var:

/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+

Ardından /core/modules/contact/src/Controller/ContactController.php

geri aramaya nasıl form yükleneceği ile ilgili bir örnek görebilirsiniz:

  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;
  }

Formu doğrudan rotadan yükleme:

Formu doğrudan _form varsayılanını kullanarak yüklemek isterseniz, /core/modules/shortcut/shortcut.routing.yml adresindeki kısayol modülünde bir örnek vardır.

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+

Bu durumda, kullanıcı forma parametre olarak iletilir, bkz. /Core/modules/shortcut/src/Form/SwitchShortcutSet.php

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

1

Elimi tespit edebileceğim birkaç şey ...

Mymodule.account adlı HERŞEYİN var. Bunu biraz çeşitlendirirdim. Görevler sayfası için bunu düşünün:

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

Ben de bunun için menüde bir şeye ihtiyacınız olduğuna inanmıyorum.

Bu ikisi arasında, gitmek için iyi olmalısın! Bunu anlayamıyorsanız doğrudan bana ulaşmaktan çekinmeyin, çünkü ben - SADECE - D8 Rolü Başvurun portumda çalışmak için bunu aldım!


1

Modulename.routing.yml dosyasında aşağıdaki gibi kullanıcı bağımsız değişkenini iletmeniz gerekir

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

ve modulename.links.task.yml dosyasında aşağıdaki kodu kullanabilirsiniz

profile.user_information:
  title: User profile
  route_name: profile.user_information
  base_route: entity.user.canonical
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.