mirror of
https://github.com/YGGverse/YGGtracker.git
synced 2025-01-12 16:08:04 +00:00
draft submit form #14
This commit is contained in:
parent
ffa568275f
commit
731624d886
8
.env
8
.env
@ -51,3 +51,11 @@ APP_NAME=YGGtracker
|
||||
|
||||
APP_LOCALE=en
|
||||
APP_LOCALES=de|fr|en|uk
|
||||
|
||||
APP_PAGE_TITLE_LENGTH_MIN=10
|
||||
APP_PAGE_TITLE_LENGTH_MAX=255
|
||||
APP_PAGE_DESCRIPTION_LENGTH_MIN=0
|
||||
APP_PAGE_DESCRIPTION_LENGTH_MAX=10000
|
||||
APP_PAGE_TORRENT_QUANTITY_MIN=1
|
||||
APP_PAGE_TORRENT_QUANTITY_MAX=100
|
||||
APP_PAGE_TORRENT_SIZE_MAX=1024000
|
@ -8,6 +8,14 @@ parameters:
|
||||
app.name: '%env(APP_NAME)%'
|
||||
app.locale: '%env(APP_LOCALE)%'
|
||||
app.locales: '%env(APP_LOCALES)%'
|
||||
app.page.title.length.min: '%env(APP_PAGE_TITLE_LENGTH_MIN)%'
|
||||
app.page.title.length.max: '%env(APP_PAGE_TITLE_LENGTH_MAX)%'
|
||||
app.page.description.length.min: '%env(APP_PAGE_DESCRIPTION_LENGTH_MIN)%'
|
||||
app.page.description.length.max: '%env(APP_PAGE_DESCRIPTION_LENGTH_MAX)%'
|
||||
app.page.torrent.quantity.min: '%env(APP_PAGE_TORRENT_QUANTITY_MIN)%'
|
||||
app.page.torrent.quantity.max: '%env(APP_PAGE_TORRENT_QUANTITY_MAX)%'
|
||||
app.page.torrent.size.min: '%env(APP_PAGE_TORRENT_SIZE_MIN)%'
|
||||
app.page.torrent.size.max: '%env(APP_PAGE_TORRENT_SIZE_MAX)%'
|
||||
|
||||
services:
|
||||
# default configuration for services in *this* file
|
||||
|
@ -3,25 +3,196 @@
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
use App\Service\UserService;
|
||||
use App\Service\PageService;
|
||||
use App\Service\TimeService;
|
||||
|
||||
class PageController extends AbstractController
|
||||
{
|
||||
#[Route(
|
||||
'/{_locale}/page/submit',
|
||||
name: 'page_submit'
|
||||
)]
|
||||
public function submit(): Response
|
||||
public function submit(
|
||||
Request $request,
|
||||
TranslatorInterface $translator,
|
||||
UserService $userService,
|
||||
PageService $pageService,
|
||||
): Response
|
||||
{
|
||||
/*
|
||||
return $this->redirectToRoute('page', [
|
||||
'id' => $page->getId()
|
||||
]);
|
||||
*/
|
||||
return $this->render('default/page/submit.html.twig', [
|
||||
// Init user
|
||||
$user = $userService->init(
|
||||
$request->getClientIp()
|
||||
);
|
||||
|
||||
if (!$user->isStatus())
|
||||
{
|
||||
// @TODO
|
||||
throw new \Exception(
|
||||
$translator->trans('Access denied')
|
||||
);
|
||||
}
|
||||
|
||||
// Init form
|
||||
$form =
|
||||
[
|
||||
'locale' =>
|
||||
[
|
||||
'error' => [],
|
||||
'value' => $request->get('_locale'),
|
||||
'placeholder' => $translator->trans('Content language'),
|
||||
],
|
||||
'title' =>
|
||||
[
|
||||
'error' => [],
|
||||
'attribute' =>
|
||||
[
|
||||
'value' => $request->get('title'),
|
||||
'minlength' => $this->getParameter('app.page.title.length.min'),
|
||||
'maxlength' => $this->getParameter('app.page.title.length.max'),
|
||||
'placeholder' => sprintf(
|
||||
$translator->trans('Page title text (%s-%s chars)'),
|
||||
number_format($this->getParameter('app.page.title.length.min')),
|
||||
number_format($this->getParameter('app.page.title.length.max'))
|
||||
),
|
||||
]
|
||||
],
|
||||
'description' =>
|
||||
[
|
||||
'error' => [],
|
||||
'attribute' =>
|
||||
[
|
||||
'value' => $request->get('description'),
|
||||
'minlength' => $this->getParameter('app.page.description.length.min'),
|
||||
'maxlength' => $this->getParameter('app.page.description.length.max'),
|
||||
'placeholder' => sprintf(
|
||||
$translator->trans('Page description text (%s-%s chars)'),
|
||||
number_format($this->getParameter('app.page.description.length.min')),
|
||||
number_format($this->getParameter('app.page.description.length.max'))
|
||||
),
|
||||
]
|
||||
],
|
||||
'torrents' =>
|
||||
[
|
||||
'error' => [],
|
||||
'attribute' =>
|
||||
[
|
||||
'placeholder' => $translator->trans('Select torrent files'),
|
||||
]
|
||||
],
|
||||
'sensitive' =>
|
||||
[
|
||||
'error' => [],
|
||||
'attribute' =>
|
||||
[
|
||||
'value' => $request->get('sensitive'),
|
||||
'placeholder' => $translator->trans('Apply sensitive filters for this publication'),
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
// Process request
|
||||
if ($request->isMethod('post'))
|
||||
{
|
||||
// Init new
|
||||
$page = $pageService->new();
|
||||
|
||||
/// Locale
|
||||
if (!in_array($request->get('locale'), explode('|', $this->getParameter('app.locales'))))
|
||||
{
|
||||
$form['locale']['error'][] = $translator->trans('Requested locale not supported');
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// $request->get('locale')
|
||||
}
|
||||
|
||||
/// Title
|
||||
if (mb_strlen($request->get('title')) < $this->getParameter('app.page.title.length.min') ||
|
||||
mb_strlen($request->get('title')) > $this->getParameter('app.page.title.length.max'))
|
||||
{
|
||||
$form['title']['error'][] = sprintf(
|
||||
$translator->trans('Page title out of %s-%s chars'),
|
||||
number_format($this->getParameter('app.page.title.length.min')),
|
||||
number_format($this->getParameter('app.page.title.length.max'))
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// $request->get('title')
|
||||
}
|
||||
|
||||
/// Description
|
||||
if (mb_strlen($request->get('description')) < $this->getParameter('app.page.description.length.min') ||
|
||||
mb_strlen($request->get('description')) > $this->getParameter('app.page.description.length.max'))
|
||||
{
|
||||
$form['description']['error'][] = sprintf(
|
||||
$translator->trans('Page description out of %s-%s chars'),
|
||||
number_format($this->getParameter('app.page.description.length.min')),
|
||||
number_format($this->getParameter('app.page.description.length.max'))
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// $request->get('description')
|
||||
}
|
||||
|
||||
/// Torrents
|
||||
$total = 0;
|
||||
|
||||
if ($files = $request->files->get('torrents'))
|
||||
{
|
||||
foreach ($files as $file)
|
||||
{
|
||||
//// Quantity
|
||||
$total++;
|
||||
|
||||
//// File size
|
||||
if (filesize($file->getPathName()) > $this->getParameter('app.page.torrent.size.max'))
|
||||
{
|
||||
$form['torrents']['error'][] = $translator->trans('Torrent file out of size limit');
|
||||
}
|
||||
|
||||
//// Content
|
||||
$decoder = new \BitTorrent\Decoder();
|
||||
$decodedFile = $decoder->decodeFile(
|
||||
$file->getPathName()
|
||||
);
|
||||
|
||||
// var_dump($decodedFile['info']['name']);
|
||||
}
|
||||
}
|
||||
|
||||
if ($total < $this->getParameter('app.page.torrent.quantity.min') ||
|
||||
$total > $this->getParameter('app.page.torrent.quantity.max'))
|
||||
{
|
||||
$form['torrents']['error'][] = sprintf(
|
||||
$translator->trans('Torrents quantity out of %s-%s range'),
|
||||
number_format($this->getParameter('app.page.torrent.quantity.min')),
|
||||
number_format($this->getParameter('app.page.torrent.quantity.max'))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (empty($error))
|
||||
{
|
||||
// isset($request->get('sensitive'))
|
||||
// $pageService->save($page);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render('default/page/submit.html.twig', [
|
||||
'locales' => explode('|', $this->getParameter('app.locales')),
|
||||
'form' => $form,
|
||||
]);
|
||||
}
|
||||
}
|
37
src/Service/PageService.php
Normal file
37
src/Service/PageService.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Entity\Page;
|
||||
use App\Repository\PageRepository;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
|
||||
class PageService
|
||||
{
|
||||
private EntityManagerInterface $entityManager;
|
||||
private PageRepository $pageRepository;
|
||||
private ParameterBagInterface $parameterBagInterface;
|
||||
|
||||
public function __construct(
|
||||
EntityManagerInterface $entityManager,
|
||||
ParameterBagInterface $parameterBagInterface
|
||||
)
|
||||
{
|
||||
$this->entityManager = $entityManager;
|
||||
$this->pageRepository = $entityManager->getRepository(Page::class);
|
||||
$this->parameterBagInterface = $parameterBagInterface;
|
||||
}
|
||||
|
||||
public function new(): ?Page
|
||||
{
|
||||
return new Page();
|
||||
}
|
||||
|
||||
public function save(Page $page) : void
|
||||
{
|
||||
$this->entityManager->persist($page);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
}
|
@ -1,129 +1,115 @@
|
||||
{% extends 'default/layout.html.twig' %}
|
||||
{% block title %}{{'Submit'|trans }} - {{ name }}{% endblock %}
|
||||
|
||||
{% block main_content %}
|
||||
<div class="margin-b-24-px padding-b-16-px border-bottom-default">
|
||||
<div class="padding-24-px margin-y-8-px border-radius-3-px background-color-night">
|
||||
<div class="margin-b-24-px padding-b-16-px border-bottom-default">
|
||||
<h1>{{'Submit'|trans }}</h1>
|
||||
</div>
|
||||
<form name="submit" method="post" enctype="multipart/form-data" action="{{ path('page_submit') }}">
|
||||
<div class="margin-b-16-px">
|
||||
<label for="locale">
|
||||
{{'Content language'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.locale.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
<select class="width-100 margin-t-8-px" type="text" name="locale" id="locale">
|
||||
{% for locale in locales %}
|
||||
{% if locale == form.locale.value %}
|
||||
<option value="{{ locale }}" selected="selected">
|
||||
{{ locale|locale_name(locale)|u.title }}
|
||||
</option>
|
||||
{% else %}
|
||||
<option value="{{ locale }}">
|
||||
{{ locale|locale_name(locale)|u.title }}
|
||||
</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="margin-b-16-px">
|
||||
<label for="title">
|
||||
{{'Title'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.title.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for error in form.title.error %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
<input class="width-100 margin-t-8-px"
|
||||
type="text"
|
||||
name="title"
|
||||
id="title"
|
||||
{% if form.title.attribute.minlength %}required="required"{% endif %}
|
||||
value="{{ form.title.attribute.value }}"
|
||||
placeholder="{{ form.title.attribute.placeholder }}"
|
||||
minlength="{{ form.title.attribute.minlength }}"
|
||||
maxlength="{{ form.title.attribute.maxlength }}" />
|
||||
</div>
|
||||
<div class="margin-y-8-px">
|
||||
<label for="description">
|
||||
{{'Description'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.description.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for error in form.description.error %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
<textarea class="width-100 margin-t-8-px"
|
||||
name="description"
|
||||
id="description"
|
||||
{% if form.description.attribute.minlength %}required="required"{% endif %}
|
||||
value="{{ form.description.attribute.value }}"
|
||||
placeholder="{{ form.description.attribute.placeholder }}"
|
||||
minlength="{{ form.description.attribute.minlength }}"
|
||||
maxlength="{{ form.description.attribute.maxlength }}">{{ form.description.attribute.value }}</textarea>
|
||||
</div>
|
||||
<div class="margin-y-16-px">
|
||||
<label for="torrents">
|
||||
{{'Torrent files'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.torrents.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for error in form.torrents.error %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
<input class="width-100 margin-t-8-px" type="file" name="torrents[]" id="torrents" value="" accept=".torrent" multiple="multiple" />
|
||||
</div>
|
||||
<div class="margin-y-16-px">
|
||||
<input type="checkbox"
|
||||
name="sensitive"
|
||||
id="sensitive"
|
||||
value="true"
|
||||
{% if form.sensitive.attribute.value %}checked="checked"{% endif %} />
|
||||
<label for="sensitive">
|
||||
{{'Sensitive'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.sensitive.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<input class="button-green" type="submit" value="{{'Submit'|trans }}" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<form class="margin-t-8-px" name="submit" method="post" enctype="multipart/form-data" action="submit">
|
||||
<input type="hidden" name="pageId" value="<?php echo $form->pageId->attribute->value ?>" />
|
||||
<div class="margin-b-16">
|
||||
<label for="locale">
|
||||
{{'Content language'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.locale.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
<select class="width-100 margin-t-8" type="text" name="locale" id="locale">
|
||||
{% for locale in form.locale.options %}
|
||||
{% if locale.active %}
|
||||
<option value="{{ locale.code }}" selected="selected">
|
||||
{{ locale.value }}
|
||||
</option>
|
||||
{% else %}
|
||||
<option value="{{ locale.code }}">
|
||||
{{ locale.value }}
|
||||
</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="margin-b-16">
|
||||
<label for="title">
|
||||
{{'Title'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.title.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for errors in form.title.error %}
|
||||
{% for error in errors %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
<input class="width-100 margin-t-8-px"
|
||||
type="text"
|
||||
name="title"
|
||||
id="title"
|
||||
{% if form.title.attribute.required %}required="required"{% endif %}
|
||||
value="{{ form.title.attribute.value }}"
|
||||
placeholder="{{ form.title.attribute.placeholder }}"
|
||||
minlength="{{ form.title.attribute.minlength }}"
|
||||
maxlength="{{ form.title.attribute.maxlength }}" />
|
||||
</div>
|
||||
<div class="margin-y-8-px padding-t-4-px">
|
||||
<label for="description">
|
||||
{{'Description'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.description.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for errors in form.description.error %}
|
||||
{% for error in errors %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
<textarea class="width-100 margin-t-8-px"
|
||||
name="description"
|
||||
id="description"
|
||||
{% if form.description.attribute.required %}required="required"{% endif %}
|
||||
value="{{ form.description.attribute.value }}"
|
||||
placeholder="{{ form.description.attribute.placeholder }}"
|
||||
minlength="{{ form.description.attribute.minlength }}"
|
||||
maxlength="{{ form.description.attribute.maxlength }}">{{ form.description.attribute.value }}</textarea>
|
||||
</div>
|
||||
<div class="margin-y-8 padding-t-4">
|
||||
<label for="keywords">
|
||||
{{'Keywords'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09"
|
||||
title="<?php echo $form->keywords->attribute->placeholder ?>">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
{% for errors in form.keywords.error %}
|
||||
{% for error in errors %}
|
||||
<div class="text-color-red margin-y-8-px">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
<textarea class="width-100 margin-t-8-px"
|
||||
name="keywords"
|
||||
id="keywords"
|
||||
{% if form.keywords.attribute.required %}required="required"{% endif %}
|
||||
value="{{ form.keywords.attribute.value }}"
|
||||
placeholder="{{ form.keywords.attribute.placeholder }}"
|
||||
minlength="{{ form.keywords.attribute.minlength }}"
|
||||
maxlength="{{ form.keywords.attribute.maxlength }}">{{ form.keywords.attribute.value }}</textarea>
|
||||
</div>
|
||||
<div class="margin-y-16-px">
|
||||
<input type="checkbox"
|
||||
name="sensitive"
|
||||
id="sensitive"
|
||||
value="true"
|
||||
{% form.sensitive.attribute.value %}checked="checked"{% endif %} />
|
||||
<label for="sensitive">
|
||||
{{'Sensitive'|trans }}
|
||||
</label>
|
||||
<sub class="opacity-0 parent-hover-opacity-09" title="{{ form.sensitive.attribute.placeholder }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
||||
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
||||
</svg>
|
||||
</sub>
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<input class="button-green" type="submit" value="{{'Submit'|trans }}" />
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
Loading…
Reference in New Issue
Block a user