Към съдържанието
НАУЧЕТЕ

Рецепти

Кратки отговори: бази данни, защитено качване, поща, Word, PDF и споменавания.

Кратки отговори на въпросите, които се появяват, когато редакторът влезе в истинско приложение.

Ревизии и коментари в база данни

Хранилищата по подразбиране са в паметта; StorePath ги пази във файлове. За база данни реализирайте двата интерфейса. Хранилището получава идентификатора на документа и връща обикновени записи:

public sealed class EfRevisionStore(AppDbContext db) : IRteRevisionStore
{
    public async Task<IReadOnlyList<RteRevision>> ListAsync(string documentId, CancellationToken cancellationToken = default) =>
        await db.Revisions.Where(x => x.DocumentId == documentId).OrderByDescending(x => x.CreatedAt).ToListAsync(cancellationToken);

    public async Task<RteRevision> SaveAsync(string documentId, string name, string html, string author, CancellationToken cancellationToken = default)
    {
        var revision = new RteRevision(Guid.NewGuid().ToString("N")[..12], documentId, name, html, author, DateTime.UtcNow);
        db.Revisions.Add(revision);
        await db.SaveChangesAsync(cancellationToken);
        return revision;
    }

    // GetAsync, RenameAsync и DeleteAsync са по същия начин
}

builder.Services.AddScoped<IRteRevisionStore, EfRevisionStore>();

Регистрирайте хранилището преди или след AddRte; AddRte не заменя това, което вече има. IRteCommentStore и IRteAuditLog се правят по същия начин.

Защита на качването

Свържете папката с файлове с MapRteMedia(...).RequireAuthorization() вместо с междинния слой за статични файлове, сложете страницата зад [Authorize] и дръжте Upload.MaxFileSize малък. Вижте Настройки.

HTML за писма

var html = await editor.GetHtmlAsync();
var mail = EmailHtml.Create(html);

EmailHtml вгражда стиловете и ползва таблици там, където пощенските програми ги изискват. Изпратете mail със свой компонент за поща.

Word файл със заглавна част и номера на страници

var options = new RteOptions { Docx = { HeaderText = "Договор", FooterText = "Поверително", PageNumbers = true, PageSize = "A4" } };

Менюто за износ и ExportDocxAsync ползват тези стойности.

PDF файлове от сървъра

Реализирайте IRtePdfExporter с изобразител, за който имате лиценз или който сами пускате (например браузър без прозорец или библиотека за PDF), и го регистрирайте. Менюто за износ тогава дава истински файл.

public sealed class MyPdfExporter : IRtePdfExporter
{
    public async Task<byte[]> ExportAsync(string html, PdfOptions? options = null, CancellationToken cancellationToken = default)
    {
        var page = StaticRender.Render(html);
        return await MyRenderer.ToPdfAsync(page, options?.PageSize == PdfPageSize.A4, cancellationToken);
    }
}

Известяване при споменаване

public sealed class MailMentionNotifier(IMailSender mail) : IRteMentionNotifier
{
    public Task NotifyAsync(RteMention mention, CancellationToken cancellationToken = default) =>
        mail.SendAsync(mention.PersonId, $"{mention.ByUserName} ви спомена", mention.Snippet, cancellationToken);
}

builder.Services.AddSingleton<IRteMentionNotifier, MailMentionNotifier>();

Човек се съобщава веднъж на страница, дори името да се вмъкне пак.

Смяна на бърз клавиш

var options = new RteOptions { Shortcuts = new() { ["strike"] = "Ctrl+Alt+S", ["underline"] = "" } };

Празен текст премахва комбинацията. Списъкът с всички комбинации е в диалога, който се отваря с Ctrl+/.

Показване на запазения HTML на страница

Покажете го с StaticRender.Render(html) и свържете _content/Rte/css/rte.css и стиловете на приставките, които ползвате (css/plugins/structure.css за съдържанието и бележките, css/plugins/table-tools.css за стиловете на таблици).

← ЛицензКой редактор да изберете →

Готови ли сте да пробвате RayCraft Write?

Започнете 14-дневния пробен период, без карта.

Започнете 14-дневен пробен период