Как генерировать файлы с помощью пользовательского модуля и PHP?

#php #file #drupal #drupal-8 #drupal-modules

Вопрос:

У меня есть сайт с Drupal 8. Я создал пользовательский модуль. Вот его код :

https://github.com/S1BIOSE/generator_website

generator-website-page.html.twig :

 <div class="card mb-5 overflow-hidden shadow rounded bg-white">
  <div class="card-body">
   
    <form>

      <legend>Générateur de site web</legend>
      <div class="mb-3">
        <label for="TokenUrl" class="form-label">L'URL de votre site web</label>
        <input type="text" class="form-control is-invalid" id="TokenUrl" required>
        <div class="invalid-feedback">
          Ce champ est requis.
        </div>
        <small id="helpUrl" class="form-text">Entrez l'URL complète de votre site web.</small>
      </div>
      <div class="mb-3">
        <label for="TokenTitle" class="form-label">Nom de l'entreprise</label>
        <input type="text" class="form-control is-invalid" id="TokenTitle" required>
        <div class="invalid-feedback">
          Ce champ est requis.
        </div>
        <small id="helpTitle" class="form-text">Entrez le nom de votre entreprise.</small>
      </div>
      <div class="mb-3">
        <label for="TokenDescription" class="form-label">Présentation de l'entreprise</label>
        <textarea class="form-control is-invalid" id="TokenDescription" rows="5" required></textarea>
        <div class="invalid-feedback">
          Ce champ est requis.
        </div>
        <small id="helpDescription" class="form-text">Entrez une description de votre entreprise.</small>
      </div>

      <div class="mb-3">
        <label for="TokenFeed" class="form-label">Fil d'actualité</label>
        <input type="text" class="form-control" id="TokenFeed">
        <small id="helpFeed" class="form-text">Entrez l'url de votre Flux RSS sur la plateforme S1BIOSE.</small>
      </div>

      <button type="submit" class="btn btn-primary">Générer</button>
    </form>

  </div>
</div>
 

Что я должен поместить в свой модуль, чтобы сгенерировать 3 файла выше и заменить слова, начинающиеся с токена ?

В этом пользовательском модуле я создал форму с идентификаторами (я не уверен, что это правильный путь). Например, данные, введенные в поле TokenTitle, должны заменять TokenTitle везде, где они появляются в файлах.

Когда пользователь отправляет форму, он должен загрузить 3 файла с правильными данными (тот, который был введен в форму). По возможности в ZIP-архиве.

Нет необходимости хранить информацию, представленную в форме, в базе данных.

манифест.json

 {
  "orientation":"portrait",
  "short_name": "TokenTitle",
  "name": "TokenTitle",
  "display": "standalone",
  "background_color": "#000000",
  "theme_color": "#000000",
  "description": "TokenDescription",
  "lang": "fr",
  "icons": [{
        "src": "icon-144.png",
        "sizes": "144x144",
        "type": "image/png",
        "purpose": "any maskable"
      }, {
        "src": "icon-192.png",
        "sizes": "192x192",
        "type": "image/png",
        "purpose": "any maskable"
      }, {
        "src": "icon-512.png",
        "sizes": "512x512",
        "type": "image/png",
        "purpose": "any maskable"
      }],
  "start_url": "/?source=pwa",
  "scope": "/"
}
 

sitemap.xml

 <?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>TokenUrl/index.html</loc>
<lastmod>TokenDate</lastmod>
</url>
</urlset>
 

sw.js

 const staticCacheName = 'TokenTimestamp';
const filesToCache = [
  '/',
  '/index.html',
  '/CHANGELOG.md',
  '/bootstrap.min.css',
  '/style.css',
  '/bootstrap.bundle.min.js',
  '/popover.js',
  '/clipboard.min.js',
  '/btn-clipboard.js',
  '/pwa.js',
  '/feed.js',
  '/toasts.js',
  '/icon-32.png',
  '/icon-144.png',
  '/icon-192.png',
  '/icon-512.png',
  '/iphone5_splash.png',
  '/iphone6_splash.png',
  '/iphoneplus_splash.png',
  '/iphonex_splash.png',
  '/iphonexr_splash.png',
  '/iphonexsmax_splash.png',
  '/ipad_splash.png',
  '/ipadpro1_splash.png',
  '/ipadpro3_splash.png',
  '/ipadpro2_splash.png'
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(staticCacheName).then(cache => {
      return cache.addAll(filesToCache);
    })
  );
});

self.addEventListener('activate', event => {
  event.waitUntil(caches.keys().then(function(cacheNames) {
    return Promise.all(
      cacheNames.filter(function(staticCacheName) {
      }).map(function(staticCacheName) {
        return caches.delete(staticCacheName);
      })
    );
  }));
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(cachedResponse => {
      if (cachedResponse) {
        return cachedResponse;
      }
      return fetch(event.request);
    })
  );
});

self.addEventListener('message', event => {
  if (event.data.action === 'skipWaiting') {
    self.skipWaiting();
  }
});
 

Ответ №1:

Не используйте стандартный PHP для создания файла, так как тогда вам также нужно будет обрабатывать ведение домашнего хозяйства/ его удаление/ управление им. Drupal имеет двоичный файловый ответ для отправки файлов пользователям и интерфейс DrupalCoreФайлФайловая система для создания/ управления файлами. Если это временно, то просто установите его таким образом.

Комментарии:

1. Спасибо, да, я не хочу хранить данные и файлы после того, как пользователь (ananyme или зарегистрированный) загрузит ZIP-архив. Я новичок в пользовательских модулях drupal и не знаю, как использовать PHP. Что я должен добавить в свой текущий мод, пожалуйста ?

Ответ №2:

Привет, хорошо, есть вещи, которые вам нужно будет знать, как это сделать:

  1. Узнайте, как создавать файлы с помощью php: https://www.w3schools.com/php/php_file_create.asp
  2. узнайте, как работают маршрутизация и контроллеры Drupal: https://www.drupal.org/docs/drupal-apis/routing-system/introductory-drupal-8-routes-and-controllers-example
  3. узнайте, как Drupal обрабатывает формы https://www.drupal.org/docs/drupal-apis/form-api/introduction-to-form-api

как только вы узнаете об этих вещах, вы сможете использовать форму отправки php для создания ваших файлов, а затем, возможно, сгруппировать их для загрузки …или что вы с ними делаете.

Комментарии:

1. Это звучит сложно. Моя форма здесь (она создана с помощью начальной загрузки) s1biose.com/fr/generator-website Невозможно сопоставить идентификаторы полей формы со словами, начинающимися с «Токена» в файлах ? Если нет, не было бы проще создавать токены ?

2. Как говорит Таггартдж, вы должны использовать API формы Drupals для создания формы, так как это защитит вас от потенциальных атак XSS и CSRF (и по другим причинам).

3. @Pobtastic, даже если я не хочу сохранять формы в базе данных ?

4. Речь идет не о сохранении форм в базе данных, а о защите форм от использования злоумышленниками.