[COMPONENT][Posting][Tag] Add mechanism for adding extra fields to and handling the data from the Posting form. Add 'use canonical tag' field
This commit is contained in:
parent
314859b775
commit
2f5bde913c
|
@ -34,9 +34,6 @@ use App\Core\Router\Router;
|
||||||
use App\Core\Security;
|
use App\Core\Security;
|
||||||
use App\Entity\Activity;
|
use App\Entity\Activity;
|
||||||
use App\Entity\Actor;
|
use App\Entity\Actor;
|
||||||
use Component\Attachment\Entity\ActorToAttachment;
|
|
||||||
use Component\Attachment\Entity\Attachment;
|
|
||||||
use Component\Attachment\Entity\AttachmentToNote;
|
|
||||||
use App\Entity\Language;
|
use App\Entity\Language;
|
||||||
use App\Entity\Note;
|
use App\Entity\Note;
|
||||||
use App\Util\Common;
|
use App\Util\Common;
|
||||||
|
@ -46,6 +43,9 @@ use App\Util\Exception\RedirectException;
|
||||||
use App\Util\Exception\ServerException;
|
use App\Util\Exception\ServerException;
|
||||||
use App\Util\Form\FormFields;
|
use App\Util\Form\FormFields;
|
||||||
use App\Util\Formatting;
|
use App\Util\Formatting;
|
||||||
|
use Component\Attachment\Entity\ActorToAttachment;
|
||||||
|
use Component\Attachment\Entity\Attachment;
|
||||||
|
use Component\Attachment\Entity\AttachmentToNote;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
|
@ -113,6 +113,9 @@ class Posting extends Component
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Event::handle('PostingAddFormEntries', [$request, $actor, &$form_params]);
|
||||||
|
|
||||||
$form_params[] = ['post_note', SubmitType::class, ['label' => _m('Post')]];
|
$form_params[] = ['post_note', SubmitType::class, ['label' => _m('Post')]];
|
||||||
$form = Form::create($form_params);
|
$form = Form::create($form_params);
|
||||||
|
|
||||||
|
@ -122,7 +125,16 @@ class Posting extends Component
|
||||||
if ($form->isValid()) {
|
if ($form->isValid()) {
|
||||||
$data = $form->getData();
|
$data = $form->getData();
|
||||||
$content_type = $data['content_type'] ?? $available_content_types[array_key_first($available_content_types)];
|
$content_type = $data['content_type'] ?? $available_content_types[array_key_first($available_content_types)];
|
||||||
self::storeLocalNote($user->getActor(), $data['content'], $content_type, $data['language'], $data['attachments']);
|
$extra_args = [];
|
||||||
|
Event::handle('PostingHandleForm', [$request, $actor, $data, &$extra_args, $form_params, $form]);
|
||||||
|
self::storeLocalNote(
|
||||||
|
$user->getActor(),
|
||||||
|
$data['content'],
|
||||||
|
$content_type,
|
||||||
|
$data['language'],
|
||||||
|
$data['attachments'],
|
||||||
|
process_note_content_extra_args: $extra_args,
|
||||||
|
);
|
||||||
throw new RedirectException();
|
throw new RedirectException();
|
||||||
}
|
}
|
||||||
} catch (FormSizeFileException $sizeFileException) {
|
} catch (FormSizeFileException $sizeFileException) {
|
||||||
|
@ -142,8 +154,9 @@ class Posting extends Component
|
||||||
* $actor_id, possibly as a reply to note $reply_to and with flag
|
* $actor_id, possibly as a reply to note $reply_to and with flag
|
||||||
* $is_local. Sanitizes $content and $attachments
|
* $is_local. Sanitizes $content and $attachments
|
||||||
*
|
*
|
||||||
* @param array $attachments Array of UploadedFile to be stored as GSFiles associated to this note
|
* @param array $attachments Array of UploadedFile to be stored as GSFiles associated to this note
|
||||||
* @param array $processed_attachments Array of [Attachment, Attachment's name] to be associated to this $actor and Note
|
* @param array $processed_attachments Array of [Attachment, Attachment's name] to be associated to this $actor and Note
|
||||||
|
* @param array $process_note_content_extra_args Extra arguments for the event ProcessNoteContent
|
||||||
*
|
*
|
||||||
* @throws \App\Util\Exception\DuplicateFoundException
|
* @throws \App\Util\Exception\DuplicateFoundException
|
||||||
* @throws ClientException
|
* @throws ClientException
|
||||||
|
@ -151,8 +164,15 @@ class Posting extends Component
|
||||||
*
|
*
|
||||||
* @return \App\Core\Entity|mixed
|
* @return \App\Core\Entity|mixed
|
||||||
*/
|
*/
|
||||||
public static function storeLocalNote(Actor $actor, string $content, string $content_type, string $language, array $attachments = [], $processed_attachments = [])
|
public static function storeLocalNote(
|
||||||
{
|
Actor $actor,
|
||||||
|
string $content,
|
||||||
|
string $content_type,
|
||||||
|
string $language,
|
||||||
|
array $attachments = [],
|
||||||
|
array $processed_attachments = [],
|
||||||
|
array $process_note_content_extra_args = [],
|
||||||
|
) {
|
||||||
$rendered = null;
|
$rendered = null;
|
||||||
$mentions = [];
|
$mentions = [];
|
||||||
Event::handle('RenderNoteContent', [$content, $content_type, &$rendered, $actor, $language, &$mentions]);
|
Event::handle('RenderNoteContent', [$content, $content_type, &$rendered, $actor, $language, &$mentions]);
|
||||||
|
@ -181,7 +201,7 @@ class Posting extends Component
|
||||||
|
|
||||||
// Need file and note ids for the next step
|
// Need file and note ids for the next step
|
||||||
$note->setUrl(Router::url('note_view', ['id' => $note->getId()], Router::ABSOLUTE_URL));
|
$note->setUrl(Router::url('note_view', ['id' => $note->getId()], Router::ABSOLUTE_URL));
|
||||||
Event::handle('ProcessNoteContent', [$note, $content, $content_type]);
|
Event::handle('ProcessNoteContent', [$note, $content, $content_type, $process_note_content_extra_args]);
|
||||||
|
|
||||||
if ($processed_attachments !== []) {
|
if ($processed_attachments !== []) {
|
||||||
foreach ($processed_attachments as [$a, $fname]) {
|
foreach ($processed_attachments as [$a, $fname]) {
|
||||||
|
|
|
@ -26,8 +26,10 @@ namespace Component\Tag;
|
||||||
use App\Core\Cache;
|
use App\Core\Cache;
|
||||||
use App\Core\DB\DB;
|
use App\Core\DB\DB;
|
||||||
use App\Core\Event;
|
use App\Core\Event;
|
||||||
|
use function App\Core\I18n\_m;
|
||||||
use App\Core\Modules\Component;
|
use App\Core\Modules\Component;
|
||||||
use App\Core\Router\Router;
|
use App\Core\Router\Router;
|
||||||
|
use App\Entity\Actor;
|
||||||
use App\Entity\Language;
|
use App\Entity\Language;
|
||||||
use App\Entity\Note;
|
use App\Entity\Note;
|
||||||
use App\Entity\NoteTag;
|
use App\Entity\NoteTag;
|
||||||
|
@ -36,6 +38,8 @@ use App\Util\HTML;
|
||||||
use Doctrine\Common\Collections\ExpressionBuilder;
|
use Doctrine\Common\Collections\ExpressionBuilder;
|
||||||
use Doctrine\ORM\Query\Expr;
|
use Doctrine\ORM\Query\Expr;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component responsible for extracting tags from posted notes, as well as normalizing them
|
* Component responsible for extracting tags from posted notes, as well as normalizing them
|
||||||
|
@ -62,15 +66,20 @@ class Tag extends Component
|
||||||
/**
|
/**
|
||||||
* Process note by extracting any tags present
|
* Process note by extracting any tags present
|
||||||
*/
|
*/
|
||||||
public function onProcessNoteContent(Note $note, string $content): bool
|
public function onProcessNoteContent(Note $note, string $content, string $content_type, array $extra_args): bool
|
||||||
{
|
{
|
||||||
$matched_tags = [];
|
$matched_tags = [];
|
||||||
$processed_tags = false;
|
$processed_tags = false;
|
||||||
preg_match_all(self::TAG_REGEX, $content, $matched_tags, \PREG_SET_ORDER);
|
preg_match_all(self::TAG_REGEX, $content, $matched_tags, \PREG_SET_ORDER);
|
||||||
foreach ($matched_tags as $match) {
|
foreach ($matched_tags as $match) {
|
||||||
$tag = str_replace('#', '', self::ensureLength($match[2]));
|
$tag = self::ensureValid($match[2]);
|
||||||
$canonical_tag = self::canonicalTag($tag, Language::getFromId($note->getLanguageId())->getLocale());
|
$canonical_tag = self::canonicalTag($tag, Language::getFromId($note->getLanguageId())->getLocale());
|
||||||
DB::persist(NoteTag::create(['tag' => $tag, 'canonical' => $canonical_tag, 'note_id' => $note->getId()]));
|
DB::persist(NoteTag::create([
|
||||||
|
'tag' => $tag,
|
||||||
|
'canonical' => $canonical_tag,
|
||||||
|
'note_id' => $note->getId(),
|
||||||
|
'use_canonical' => $extra_args['tag_use_canonical'],
|
||||||
|
]));
|
||||||
Cache::pushList("tag-{$canonical_tag}", $note);
|
Cache::pushList("tag-{$canonical_tag}", $note);
|
||||||
$processed_tags = true;
|
$processed_tags = true;
|
||||||
}
|
}
|
||||||
|
@ -94,6 +103,11 @@ class Tag extends Component
|
||||||
return HTML::html(['a' => ['attrs' => ['href' => $url, 'title' => $tag, 'rel' => 'tag'], $tag]], options: ['indent' => false]);
|
return HTML::html(['a' => ['attrs' => ['href' => $url, 'title' => $tag, 'rel' => 'tag'], $tag]], options: ['indent' => false]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function ensureValid(string $tag)
|
||||||
|
{
|
||||||
|
return self::ensureLength(str_replace('#', '', $tag));
|
||||||
|
}
|
||||||
|
|
||||||
public static function ensureLength(string $tag): string
|
public static function ensureLength(string $tag): string
|
||||||
{
|
{
|
||||||
return mb_substr($tag, 0, self::MAX_TAG_LENGTH);
|
return mb_substr($tag, 0, self::MAX_TAG_LENGTH);
|
||||||
|
@ -147,4 +161,19 @@ class Tag extends Component
|
||||||
$actor_qb->join('App\Entity\ActorTag', 'actor_tag', Expr\Join::WITH, 'actor_tag.tagger = actor.id');
|
$actor_qb->join('App\Entity\ActorTag', 'actor_tag', Expr\Join::WITH, 'actor_tag.tagger = actor.id');
|
||||||
return Event::next;
|
return Event::next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onPostingAddFormEntries(Request $request, Actor $actor, array &$form_params)
|
||||||
|
{
|
||||||
|
$form_params[] = ['tag_use_canonical', CheckboxType::class, ['required' => false, 'data' => true, 'label' => _m('Make note tags canonical')]];
|
||||||
|
return Event::next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onPostingHandleForm(Request $request, Actor $actor, array $data, array &$extra_args)
|
||||||
|
{
|
||||||
|
if (!isset($data['tag_use_canonical'])) {
|
||||||
|
throw new ClientException;
|
||||||
|
}
|
||||||
|
$extra_args['tag_use_canonical'] = $data['tag_use_canonical'];
|
||||||
|
return Event::next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user