Skip to content

wangta69/laravel-editor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

47 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš€ Laravel WYSIWYG Editor Hub

ํ˜„์žฌ ๋ฐฐํฌ ์ค‘์ธ ์ฃผ์š” ์›น ์—๋””ํ„ฐ๋“ค์„ ๋ผ๋ผ๋ฒจ ํ”„๋กœ์ ํŠธ์—์„œ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ตํ•ฉํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋กœ TinyMCE, Summernote, Naver Smart Editor ๋“ฑ ๋‹ค์–‘ํ•œ ์—๋””ํ„ฐ๋ฅผ ์„ค์ • ํ•˜๋‚˜๋กœ ์ž์œ ๋กญ๊ฒŒ ๊ต์ฒดํ•˜์„ธ์š”.


๐ŸŒŸ Real-world Usage

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธธ๋ผ(Gilra) (Online Fortune Service)์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ Q&A, 1:1 ์ƒ๋‹ด์†Œ, ๊ณต์ง€์‚ฌํ•ญ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‚ฌ์ฃผ ๋ช…๋ฐ˜ ์ด๋ฏธ์ง€ ์ž๋™ ์ฒจ๋ถ€ ๋ฐ ์ „๋ฌธ๊ฐ€ ๋‹ต๋ณ€ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ์•ˆ์ •์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


โœจ Key Features

  • Multi-Editor Support: 5์ข… ์ด์ƒ์˜ ์œ ๋ช… ์—๋””ํ„ฐ ์™„๋ฒฝ ์ง€์› (Summernote ์ถ”๊ฐ€)
  • Blade Component Ready: <x-editor-components /> ํƒœ๊ทธ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฝ์ž…
  • Smart Instance Management: ํ•œ ํŽ˜์ด์ง€ ๋‚ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—๋””ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ธ์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ด€๋ฆฌ
  • Defer-loading Compatible: jQuery defer ํ™˜๊ฒฝ์—์„œ๋„ ๋กœ๋”ฉ ์ˆœ์„œ ๊ผฌ์ž„ ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™
  • Image Upload System: ์ปค์Šคํ…€ ์ €์žฅ ๊ฒฝ๋กœ ์„ค์ •์„ ์ง€์›ํ•˜๋Š” ์ „์šฉ Trait ์ œ๊ณต (SmartEditor)
  • Cosmic Dark Theme: ๋‹คํฌ ๋ชจ๋“œ UI ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ CSS ์ปค์Šคํ…€ ์ง€์›

๐Ÿ“š Documentation

์ƒ์„ธํ•œ ์‚ฌ์šฉ๋ฒ•๊ณผ ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ๋Š” ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ›  Installation

1. Composer๋ฅผ ํ†ตํ•ด ์„ค์น˜

composer require wangta69/laravel-editor

2. ์—๋””ํ„ฐ ๋ฆฌ์†Œ์Šค ๋ฐ ์„ค์ •ํŒŒ์ผ ๋ฐœํ–‰

php artisan pondol:install-editor

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด config/pondol-editor.php ํŒŒ์ผ๊ณผ public/plugins/editor ํด๋”์— ํ•„์š”ํ•œ ์ •์  ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


โš™๏ธ Configuration

config/pondol-editor.php ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•  ์—๋””ํ„ฐ ํ…œํ”Œ๋ฆฟ๊ณผ ๋ผ์šฐํŒ… ์˜ต์…˜์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Supported Templates

Key Editor Name License ํŠน์ง•
summernote Summernote MIT ์ถ”์ฒœ. ๊ฐ€๋ณ๊ณ  ๋ผ์ด์„ ์Šค ๋ฌธ๊ตฌ ์—†๋Š” ์™„์ „ ๋ฌด๋ฃŒ ์—๋””ํ„ฐ
tinymce TinyMCE Community ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๊ณผ ์ „ ์„ธ๊ณ„์ ์ธ ์•ˆ์ •์„ฑ
smart-editor Naver Smart Editor Open Source ๊ตญ๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ๋„ค์ด๋ฒ„ ์Šคํƒ€์ผ
richtext RichText Editor Commercial ๋งค์šฐ ๊ฐ€๋ฒผ์šด ๊ณ ์„ฑ๋Šฅ ์—๋””ํ„ฐ
froala Froala Editor Commercial ์„ธ๋ จ๋œ ๋””์ž์ธ๊ณผ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™” ์—๋””ํ„ฐ

๐Ÿ“– Usage Examples

1. ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (Before & After)

์„ค์ •ํŒŒ์ผ์— ์ง€์ •๋œ ๊ธฐ๋ณธ ์—๋””ํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

Before:

<form>
  <textarea name="comment"></textarea>
  <button type="submit">Save</button>
</form>

After (Component ๋ฐฉ์‹):

<form>
  <x-editor-components name="comment" id="comment-id" value="์ดˆ๊ธฐ ๋‚ด์šฉ" />
  <button type="submit">Save</button>
</form>

After (Blade Include ๋ฐฉ์‹):

<form>
  @include ('editor::default', ['name'=>'comment', 'id'=>'comment-id',
  'value'=>'', 'attr'=>['class'=>'']])
  <button type="submit">Save</button>
</form>

2. ํŠน์ • ํ…œํ”Œ๋ฆฟ ๊ฐ•์ œ ์ง€์ •

๊ธฐ๋ณธ ์„ค์ •๊ณผ ์ƒ๊ด€์—†์ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฅธ ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

TinyMCE ์ ์šฉ ์‹œ:

@include('editor::tinymce.editor', [ 'name' => 'comment', 'id' => 'comment-id',
'value' => $data->content, 'attr' => ['class' => 'form-control'] ])

๐Ÿš€ Advanced Usage

1. ํ•œ ํŽ˜์ด์ง€์— ์—ฌ๋Ÿฌ ์—๋””ํ„ฐ ์‚ฌ์šฉ (Multi-instance)

type ์†์„ฑ์„ ํ†ตํ•ด ์„ธ์…˜ ๊ธฐ๋ฐ˜์˜ ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

<!-- ์ฒซ ๋ฒˆ์งธ ์—๋””ํ„ฐ (์‹œ์ž‘: ๊ธฐ์กด ์„ธ์…˜ ์ดˆ๊ธฐํ™”) -->
<x-editor-components name="content1" id="editor1" type="start" />

<!-- ์ค‘๊ฐ„ ์—๋””ํ„ฐ๋“ค -->
<x-editor-components name="content2" id="editor2" />

<!-- ๋งˆ์ง€๋ง‰ ์—๋””ํ„ฐ (์ข…๋ฃŒ: ์„ธ์…˜ ์ •๋ฆฌ ๋ฐ ์ „์ฒด ๋กœ๋“œ) -->
<x-editor-components name="content3" id="editor3" type="end" />

2. ์Šคํฌ๋ฆฝํŠธ Defer ๋กœ๋”ฉ ๋Œ€์‘

๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” jQuery๊ฐ€ defer๋กœ ๋กœ๋“œ๋˜๋Š” ์ตœ์‹  ์›น ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋Š” window.load ์‹œ์ ์— ์‹คํ–‰๋˜์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ€์žฌ๋กœ ์ธํ•œ Uncaught ReferenceError๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ธ Image Upload (SmartEditor Trait)

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ฒฝ๋กœ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์œ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

use Pondol\Editor\Traits\SmartEditor;

class PostController extends Controller
{
    use SmartEditor;

    public function uploadImage(Request $request)
    {
        // _uploadStore ๋ฉ”์„œ๋“œ๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ €์žฅ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
        // ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ storage/app/public ํ•˜์œ„์˜ ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        $result = $this->_uploadStore($request, 'uploads/posts');

        if ($result['error']) {
            return response()->json(['success' => false, 'message' => 'Upload failed']);
        }
        return $result['url'];
    }
}

๐ŸŽจ Styling for Dark Mode

๊ธธ๋ผ(Gilra) ์„œ๋น„์Šค์™€ ๊ฐ™์€ ๋‹คํฌ ํ…Œ๋งˆ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์—๋””ํ„ฐ์˜ ๋ฐฐ๊ฒฝ ๋ฐ ํˆด๋ฐ” ์ƒ‰์ƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/* Summernote Dark Mode ์˜ˆ์‹œ */
.note-editor {
  background-color: #1b263b !important;
}
.note-toolbar {
  background-color: #2a3b57 !important;
}
.note-editable {
  color: #fff !important;
}

๐Ÿงช Tests & Verification

์„ค์น˜ ํ›„ ์•„๋ž˜ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜์—ฌ ๊ฐ ์—๋””ํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ์ฆ‰์‹œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ: https://your-domain.com/editor/richtext
  • ์Šค๋งˆํŠธ ์—๋””ํ„ฐ: https://your-domain.com/editor/smart-editor
  • TinyMCE: https://your-domain.com/editor/tinymce
  • Summernote: https://your-domain.com/editor/summernote

๐Ÿ–ผ Screenshots

laravel WYSIWYG editor sample ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋˜๊ณ  ์„ธ๋ จ๋œ ํŽธ์ง‘ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค Contribution & Support


Copyright ยฉ wangta69. Licensed under the MIT License.

About

WysiWig Editors for laravel. ex)froala, tinymce, richtext, smart editor..

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors