Puncte:0

How would one make a variable in a module's JS editable via admin menu?

drapel cn

Say I have a library that is attached to a page that brings along with it some JavaScript. For this example, let's say the JavaScript has a variable which is the path to an image that the JS displays. This would look something like:

variable.setAttribute('src', drupalSettings.path.baseUrl + pathToPicture)

Now let's say I want to have pathToPicture configurable via Admin Menu so that one may add their own path to their own picture, instead of using the one that is defaulted to.

How might one go about accomplishing this task? I know the basics of setting up a form and adding it to the admin menu, but I don't know enough to complete something like this on my own. If there is existing documentation on this sort of procedure, I'd appreciate being directed towards it. Otherwise any ideas are welcome. Thanks!

leymannx avatar
drapel ne
Puteți trece variabile de la PHP la JS (drupalSettings), de exemplu, dintr-un cârlig de preprocesare. Așadar, aveți imaginea stocată undeva, poate profilul utilizatorului, apoi preprocesați în matricea de randare unde aveți nevoie de JS, obțineți utilizatorul curent, obțineți imaginea acestuia, obțineți URL-ul imaginii și transmiteți-l la drupalSettings.
No Sssweat avatar
drapel ua
Iată o idee: vă rugăm să furnizați codul formularului și codul de procesare, dacă îl aveți deja.
apaderno avatar
drapel us
Deoarece întrebarea spune *pentru ca cineva să-și adauge propria cale la propria sa parte a imaginii*, cum ați realiza acest lucru și cum ar face acest lucru posibil utilizarea codului JavaScript? Cu codul afișat în răspuns, obțineți o valoare transmisă de la PHP la JavaScript, dar cum ar schimba utilizatorii acea valoare fără a avea acces la formularul de setări? Dacă au acces la formular, trebuie doar să trimită formularul.
apaderno avatar
drapel us
Dacă aș dori să permit utilizatorilor finali să stabilească o valoare care este apoi utilizată din modulul meu, aș crea un formular pe care să îl poată accesa pentru a seta acea valoare. Codul meu ar folosi apoi acea valoare acolo unde este necesar. Nu ar trebui să scriu cod JavaScript pentru a realiza asta.
Puncte:2
drapel de

Imaginează-ți un modul numit Imagine configurabilă. Doriți ca calea către imagine să fie configurabilă prin interfața de utilizare admin. O cale este un șir, așa că primul lucru de făcut este să definiți configurația pentru cale. În acest caz, obiectul de configurare va fi configurabil_picture.settings calea_spre_imagine.

configurable_picture/config/schema/configurable_picture.schema.yml:

configurable_picture.settings:
  tip: config_object
  etichetă: „Setări configurabile pentru imagine”
  cartografiere:
    drum_to_picture:
      tip: sfoară
      etichetă: „Cale către imagine”

Următorul pas este să creați un formular de configurare care vă permite să editați elementul de configurare definit în schema de mai sus. Iată documentația despre crearea formularelor de configurare: https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms

Cu pașii de mai sus, veți putea salva calea către imagine pe pagina de configurare pe care ați creat-o.

Există doi pași necesari pentru a furniza acea setare de configurare fișierului JavaScript. Primul este să adăugați o dependență la core/drupalSettings în biblioteca dvs. JS.

configurable_picture/configurable_picture.libraries.yml:

formă_imagine:
  js:
    cale/către/fișier.js: {}
  dependențe:
    - core/drupalSettings

Apoi, atașați biblioteca și setările la formular:

$form['#attached']['library'][] = 'configurable_picture/picture_form';
// Cheia configurableSettings va deveni spațiul de nume din interiorul 
// obiect drupalSettings în fișierul JS.
$form['#attached']['drupalSettings']['configurablePicture'] = [
  // Setați calea pe baza valorii salvate în configurare:
  'pathToPicture' => \Drupal::config('configurable_picture')->get('path_to_picture'),
];

Apoi, path/to/file.js poate accesa obiectul setări astfel:

(funcție ($, Drupal, drupalSettings) {

  funcția getPathToPicture() {
    returnează drupalSettings.configurablePicture.pathToPicture;
  }

  // Sau, din obiectul setări din Drupal.behaviors:
  Drupal.behaviors.configurablePicture = {
    atașați: funcție (context, setări) {
      console.log(settings.configurablePicture.pathToPicture);
    }
  };
}(jQuery, Drupal, drupalSettings));
Joseph avatar
drapel cn
Multumesc pentru asta. Am folosit drupalSettings înainte pentru a face acest tip de comunicare, așa că cred că acea parte va fi ușoară. Mi-am actualizat postarea inițială pentru a arăta cum arată structura mea actuală de fișiere (mai puțin fișierul JS), deoarece, deși cred că am urmat corect instrucțiunile, nu apare niciun formular în pagina de configurare. Vedeți ceva în mod evident în neregulă cu codul meu?
Jaypan avatar
drapel de
Ți-am răspuns la întrebarea inițială, despre cum să rotești o variabilă de configurare în JS. Problema dvs. cu formularul de configurare care nu funcționează este un subiect nou și ar trebui să deschideți un fir nou pentru asta. Drupal answers este un forum cu o singură întrebare și un singur răspuns, întrebările noi obțin fire noi.
Jaypan avatar
drapel de
De asemenea, ar trebui să postați codul real, în loc să înlocuiți totul cu mymodule. Prea ușor să ratați greșelile de scriere atunci când nu afișați codul real.
Joseph avatar
drapel cn
Bine, îmi pare rău, sunt foarte nou în acest domeniu și mi-am făcut griji să blochez forumul cu mai multe întrebări, mai ales dacă au soluții simple.
Jaypan avatar
drapel de
Totul este bine - toți trecem prin același lucru pe care l-ai făcut tu când venim aici! Bun venit la Drupal Answers și suntem aici pentru a răspunde la întrebări despre Drupal, așa că nu ezitați să deschideți subiecte pentru a pune întrebări.
Joseph avatar
drapel cn
Bună @Jaypan, am o întrebare despre răspunsul tău. Ce este .pathToFile? Nu reușesc să găsesc documentație despre el sau să o fac să funcționeze. Primesc această eroare în consolă: Nu pot citi proprietățile lui undefined (citește „pathToFile”). Am înțeles greșit ce faci?
Jaypan avatar
drapel de
Trebuie să înlocuiți asta cu calea reală către fișierul dvs. JS. Deci, dacă aveți `file.js` în folderul `js` al modulului dvs., ați pune `js/file.js: {}`.
Joseph avatar
drapel cn
Da, îmi pare rău că am înțeles, mă refeream la când îl utilizați aici, de exemplu: `console.log(settings.configurablePicture.pathToFile);` .pathToFile ar trebui să fie înlocuit cu o cale către fișierul JS? Pare ciudat?
Jaypan avatar
drapel de
Corect. `settings` conține setările pentru `contextul` curent. Acestea sunt cele două variabile transmise metodei `.attach` de comportamente Drupal. La încărcarea inițială a documentului, `context` este întregul document, iar `settings` este întregul obiect `drupalSettings`. Dar comportamentele Drupal sunt numite și atunci când elemente noi sunt inserate în DOM cu Ajax, iar `settings` conține setările pentru noul `context`. Vă puteți referi în continuare la `drupalSettings`, dar conține atât setările de la încărcarea inițială a paginii, cât și încărcarea ajax, făcându-l mai puțin simplificat.
Jaypan avatar
drapel de
Ar trebui să adaug, `settings.configurablePath.pathToFile` este ceea ce este înlocuit cu calea fișierului. Presupunând că este o cale așa cum ați descris-o, veți avea nevoie de rădăcina Drupal înaintea: `settings.path.baseUrl + settings.configurablePath.pathToFile`.
Joseph avatar
drapel cn
Deci așa ar trebui să arate? `console.log(drupalSettings.path.baseUrl + settings.pathToSound.js/configurablePicture.js);`? Asta încă nu are prea mult sens pentru mine, de ce conectez fișierul JS când sunt deja în fișierul JS?
Jaypan avatar
drapel de
Nu, acesta va fi înlocuit cu calea către imagine, nu cu fișierul JS. Aveți dreptate că acest cod merge în fișierul JS. Indiferent de valoarea pe care ați introdus-o în formularul de pe pagina de configurare va fi în `ssettings.configurablePath.pathToPicture`
Jaypan avatar
drapel de
De asemenea, apelul la console.log este pur și simplu astfel încât să puteți vedea valoarea în consola dvs. JS, nu aveți nevoie de el pentru a executa codul. Este un instrument de depanare. Singura parte care este relevantă este `settings.configurablePath.pathToFile`
Joseph avatar
drapel cn
Bine, văd unde este confuzia. Am crezut că trebuie să înlocuiesc partea `.pathToFile` din `settings.configurablePath.pathToFile` cu altceva. Văd ce spui acum. Cu toate acestea, folosind `settings.configurablePath.pathToFile` îmi dă această eroare: `drupal.js?v=9.3.9:16 Uncaught TypeError: Nu pot citi proprietățile lui undefined (citind 'pathToFile')` pentru că nu cred în dvs. exemplu pathToFile a fost transmis vreodată fișierului JS printr-un atașament? Acesta ar fi motivul pentru care nu merge?
Jaypan avatar
drapel de
Ne pare rău, `pathToFile` a fost o greșeală de tipar. Ar trebui să fie `pathToPicture`. Voi actualiza postarea.
Joseph avatar
drapel cn
M-am gândit, mulțumesc pentru ajutor. Cred că s-ar putea să amestec între configurable_picture și configurablePicture și în atașamentele de formular, dar nu sunt sigur. Ultima întrebare despre codul dvs.; biblioteca și setările pe care le atașați la formular intră în buildForm, dar cum ar arăta submitForm? PathToPicture mea nu este comunicată corect între formular și fișierul JS
Jaypan avatar
drapel de
Nu înțeleg întrebarea. Biblioteca este atașată - ce legătură are asta cu gestionarea trimiterii?

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.