#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:
Привет, хорошо, есть вещи, которые вам нужно будет знать, как это сделать:
- Узнайте, как создавать файлы с помощью php: https://www.w3schools.com/php/php_file_create.asp
- узнайте, как работают маршрутизация и контроллеры Drupal: https://www.drupal.org/docs/drupal-apis/routing-system/introductory-drupal-8-routes-and-controllers-example
- узнайте, как 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. Речь идет не о сохранении форм в базе данных, а о защите форм от использования злоумышленниками.