Puncte:0

Cum se creează un modul cu setări implicite

drapel cn

Am un modul la care lucrez, care leagă la un fișier de sunet și îl redă când se întâmplă ceva. O am astfel încât să existe un buton în configurația admin pentru a seta calea fișierului la o cale implicită, care este un fișier care vine cu modulul. În plus, cineva poate încărca propriul fișier și va trece la redarea acelui fișier atunci când se întâmplă lucrul. Problema este că modulul de la o instalare nouă nu face nimic, atunci când vreau să aibă acel sunet implicit configurat pentru a fi redat imediat după instalare. Am încercat să fac asta cu un fișier settings.yml, dar încercând să accesez acele date returnează null până când intru în configurația admin și fie o setez la implicit, fie încărc propriul fișier.

Iată o privire asupra fișierelor:

MYMODULE.settings.yml

pathToSound: „/assets/sound.mp3”

MYMODULE.schema.yml

MYMODULE.settings:
  tip: config_object
  etichetă: „MYMODULE Settings”
  cartografiere:
    pathToSound:
      tip: sfoară
      etichetă: „Path to Sound”

MYMODULE.modul

<?php

utilizați Drupal\Core\Form\FormStateInterface;

funcția MYMODULE_page_attachments(array &$attachments) {
  $attachments['#attached']['library'][] = 'MYMODULE/MYMODULE';
  $attachments['#attached']['drupalSettings']['MYMODULE'] = [
  'pathToSound' => \Drupal::config('MYMODULE.settings')->get('pathToSound'),
  ];
}

MYMODULE.js

/**
 * @fișier
 */
(funcție ($, Drupal) {
  „utilizați strict”;

  Drupal.behaviors.MYMODULE = {
    /**
     * Comportamentul de ataşare Drupal.
     */

    atașați: funcție (context, setări) {
      // Se declanșează când memoria cache este golită pentru a reda un sunet.
      $('body', context).once('MYMODULE').each(function () {
        console.log(settings.MYMODULE.pathToSound);
        var sound = document.createElement('audio');
        sound.setAttribute('src', settings.MYMODULE.pathToSound);
        sunet.play();
      });
    },
  };
  })(jQuery, Drupal, drupalSettings, o dată);

Am încercat să exclud cât mai mult cod irelevant posibil. Oricum, există și un formular care editează MYMODULE.settings „pathToSound” atunci când modulul este configurat în meniul admin. În cele din urmă, există fișierul JS care redă sunetul. După cum am spus, funcționează după ce este configurat în meniul de administrare, dar nu înainte. Mă întreb înainte de a fi configurat, pathToSound returnează null, chiar dacă este setat în MYMODULE.settings. Orice idee ar fi foarte apreciată, mulțumesc!

EDIT: Cod ajustat conform sugestiilor, încă nu funcționează. De asemenea, a adăugat JS care rulează jurnalul consolei care returnează null.

4uk4 avatar
drapel cn
După ce ați configurat modulul în meniul de administrare, puteți exporta configurația și o puteți utiliza ca șablon pentru configurația implicită a modulului. Cred că problema este că fișierul yaml stochează valoarea în al doilea nivel în timp ce recuperați o valoare de la primul nivel.
drapel ru
Ați plasat fișierul settings.yml în subfolderul `config/install` al modulului dvs.?
apaderno avatar
drapel us
Cu acel obiect de configurare, codul ar trebui să apeleze `\Drupal::config('myModule.settings')->get('path.pathToSound')` pentru a obține valoarea *pathToSound*. Totuși, schema nu s-ar potrivi cu obiectul de configurare; trebuie schimbat si asta. Verificați, de asemenea, că fișierul .settings.yml este în directorul corect, așa cum a sugerat @Hudri.
Joseph avatar
drapel cn
settings.yml se află în directorul corect și am încercat să schimb codul și fișierul schema așa cum sugerează @apaderno, fără niciun rezultat. Cum aș proceda pentru a exporta configurația după ce am configurat modulul așa cum sugerează 4uk4?
apaderno avatar
drapel us
Odată ce modulul este instalat, schimbarea fișierului de configurare sau a fișierului de schemă nu ajută. Modulul trebuie mai întâi dezinstalat; apoi, puteți schimba acele fișiere.
Puncte:2
drapel us

Schema de configurare trebuie să se potrivească cu fișierul de configurare. De exemplu, următoarele se potrivesc.

myModule.settings.yml

pathToSound: „/assets/sound.mp3”

myModule.schema.yml

setări de spălare:
  tip: config_object
  etichetă: „Flush Settings”
  cartografiere:
    pathToSound:
      tip: sfoară
      etichetă: „Path to Sound”

În acest caz, \Drupal::config('myModule.settings')->get('pathToSound') ar returna caleaSunetului valoare.

Pentru un fișier de configurare care conține următoarele linii, schema respectivă nu va funcționa.

cale:
  pathToSound: „/assets/sound.mp3”

Schema corectă ar fi următoarea.

setări de spălare:
  tip: config_object
  etichetă: „Setări de spălare”
  cartografiere:
    cale:
      tip: cartografiere
      etichetă: „Setări cale”
      cartografiere:
        pathToSound:
          tip: sfoară
          etichetă: „Cale către sunet”

În acest caz, \Drupal::config('myModule.settings')->get('path.pathToSound') ar returna caleaSunetului valoare.

Ca o notă secundară, modificarea schemei de configurare sau a fișierului de configurare după ce modulul este instalat nu ajută. Drupal a încărcat deja valorile implicite din fișierul de configurare și va folosi în continuare schema de configurare anterioară.
Pentru a permite Drupal să observe că ambele fișiere au fost modificate, modulul trebuie mai întâi dezinstalat, fișierele schimbate și modulul reinstalat.

Joseph avatar
drapel cn
Mulțumiri. Actualizat din nou pentru a afișa schema curentă și fișierele de setări. Încă nu funcționează, dar ar trebui să fie așa cum ați sugerat să arate
Joseph avatar
drapel cn
Acest cod chiar funcționează, nu funcționa înainte din cauza unei probleme externe.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.