Статьи

Начните строить свой блог с Parse.js: добавьте новый блог

Конечный продукт
Что вы будете создавать

Вас когда-нибудь волновала идея создания веб-сайта, но вы становитесь несчастными, когда пытаетесь сделать его динамичным и запустить его на сервере?

С Parse.js каждый, кто понимает основы HTML, CSS и JavaScript, может создавать динамические веб-сайты и работающие веб-приложения. Этот учебник шаг за шагом проведет вас через процесс создания системы блогов с помощью Parse.js. И к концу этой серии вы сможете легко создать свой собственный сайт CMS.

За последние три сессии вы создали основу системы блогов. Вы создали класс Blog и класс User на Parse.com, вы отображаете блоги в интерфейсе и включили вход пользователя. Начиная с этого сеанса, мы собираемся создать различные функции этой панели администратора, начиная с «Добавить новый блог».

Прежде всего, давайте подготовим шаблон HTML для этой страницы, чтобы у нас было что поиграть. Опять же, вы можете использовать существующие элементы Bootstrap для ускорения процесса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<script type=»text/template» id=»add-tpl»>
  <h2>Adding a New Blog</h2>
 
  <form class=»form-add» role=»form»>
    <div class=»form-group»>
      <label for=»title»>Title</label>
      <input type=»text» name=»title» class=»form-control» id=»title» placeholder=»Enter Your Blog Title»>
    </div>
    <div class=»form-group»>
      <label for=»content»>Content</label>
      <textarea name=»content» class=»form-control» rows=»20″></textarea>
    </div>
    <button class=»btn btn-lg btn-primary btn-block» type=»submit»>Submit</button>
  </form>
</script>

Добавьте это в admin.html .

Обратите внимание, что мы делаем его шаблоном, хотя на данный момент нет динамического значения. Я делаю это потому что:

  1. Я хотел бы, чтобы мой HTML был очень структурированным, и все было в своем собственном шаблонном блоке.
  2. В будущих сессиях мы собираемся создать раскрывающийся список категорий, поэтому на этой странице может быть динамическое содержимое.
  3. Тот же шаблон страницы можно использовать повторно, когда мы создаем функцию «Редактировать», и нам определенно нужно EditBlogView существующий контент в EditBlogView .

Двигаясь дальше, зайдите в admin.js и создайте новый View: AddBlogView . Мы можем пока сохранить его минимальным, так как мы просто визуализируем шаблон:

1
2
3
4
5
6
var AddBlogView = Parse.View.extend({
    template: Handlebars.compile($(‘#add-tpl’).html()),
    render: function(){
        this.$el.html(this.template());
    }
});

Теперь, когда у нас есть AddBlogView , мы хотим связать его с панелью администратора. Идем дальше и добавляем кнопку в WelcomeView :

1
2
3
4
<script type=»text/template» id=»welcome-tpl»>
  <h2>Welcome, <%=username %>!</h2>
  <button class=»add-blog btn btn-lg btn-primary»>Add a New Blog</button>
</script>

И затем вам нужно привязать событие по нажатию этой кнопки. Обычно вы можете сделать что-то подобное в вашем admin.js :

1
2
3
$(‘.add-blog’).on(‘click’, function(){
    // function
});

Однако это не обязательно, если вы используете Parse.js. Вы можете просто добавить событие в объект View и связать функцию следующим образом:

01
02
03
04
05
06
07
08
09
10
WelcomeView = Parse.View.extend({
    template: Handlebars.compile($(‘#welcome-tpl’).html()),
    events: {
        ‘click .add-blog’: ‘add’
    },
    add: function(){
        alert(‘Clicked!’);
    },
    …
}),

Вы можете попробовать, прежде чем мы пойдем дальше:

Функция просмотра теста

И теперь мы можем изменить функцию для отображения нового экземпляра AddBlogView .

1
2
3
4
5
add: function(){
    var addBlogView = new AddBlogView();
    addBlogView.render();
    $(‘.main-container’).html(addBlogView.el);
}
Предоставленный addBlogView

Чувствует себя потрясающе.

Теперь все, что вам нужно, это привязать функцию к кнопке отправки на этой странице и записать блог в вашу базу данных на Parse.com .

Добавьте событие отправки в свой AddBlogView — оно не сильно отличается от события щелчка, которое мы только что добавили.

1
2
3
4
5
6
7
8
9
AddBlogView = Parse.View.extend({
    template: Handlebars.compile($(‘#add-tpl’).html()),
    events: {
        ‘submit .form-add’: ‘submit’
    },
    submit: function(e){
        // submit function goes here.
    }, …
});

Затем, поскольку мы пытаемся записать в таблицу блогов на Parse.com , нам нужно включить класс Blog:

1
var Blog = Parse.Object.extend(‘Blog’);

После этого давайте добавим функцию create() в класс Blog, чтобы мы могли вызывать ее из любого объекта представления. Он должен принять два параметра, title и content , и сохранить его в базе данных.

Parse.js сделал это очень просто. Как только новый экземпляр класса Blog создан, мы можем просто установить значения, которые мы хотим, чтобы он имел, и вызвать функцию save() чтобы сохранить его в базе данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
var Blog = Parse.Object.extend(‘Blog’, {
    create: function(title, content) {
        this.set({
            ‘title’: title,
            ‘content’: content,
            ‘author’: Parse.User.current()
        }).save(null, {
            success: function(blog) {
                alert(‘You added a new blog: ‘ + blog.get(‘title’));
            },
            error: function(blog, error) {
                console.log(blog);
                console.log(error);
            }
        });
    }
});

Или вы можете просто записать данные в функцию save() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
var Blog = Parse.Object.extend(‘Blog’, {
    create: function(title, content) {
        this.save({
            ‘title’: title,
            ‘content’: content,
            ‘author’: Parse.User.current()
        }, {
            success: function(blog) {
                alert(‘You added a new blog: ‘ + blog.get(‘title’));
            },
            error: function(blog, error) {
                console.log(blog);
                console.log(error);
            }
        });
    }
 
});

Оба будут работать.

Обратите внимание, что я также включаю author в базу данных с помощью Parse.User.current() . Это метод, который вы должны использовать для входа в систему текущего пользователя.

Теперь, в качестве последнего шага, чтобы заставить его работать, вам нужно вызвать blog.create() из только что созданного AddBlogView .

Давайте добавим его в функцию submit() :

01
02
03
04
05
06
07
08
09
10
submit: function(e){
    // Prevent Default Submit Event
    e.preventDefault();
    // Take the form and put it into a data object
    var data = $(e.target).serializeArray(),
    // Create a new instance of Blog
        blog = new Blog();
    // Call .create()
    blog.create(data[0].value, data[1].value);
}

Проведите пробный запуск. Похоже, это работает!

Отправить уведомление об успехе

И если вы проверите его на Parse.com , вы увидите, что он хранится в таблице блога.

Отправить базу данных успеха

Congrats! Вы пишете в базу данных.

Теперь давайте снова посмотрим на список блогов:

Проблема в списке блогов

Вы заметите, что вместо имени пользователя мы показываем идентификатор пользователя. И мы не показываем время создания блога. У нас есть значения createdAt и updatedAt в updatedAt , но они не очень читабельны для пользователя.

Если мы хотим это исправить, есть два основных подхода:

  • Когда мы читаем из базы данных, мы получаем имя пользователя по идентификатору и меняем формат времени публикации.
  • Когда мы пишем в базу данных, мы добавляем еще два поля для хранения имени пользователя и времени.

Если мы выберем первый подход, мы будем делать одно и то же снова и снова, и это использует время и ресурсы посетителя. Поэтому мы хотим сделать это во время записи в базу данных. Не беспокойтесь о таких вещах, как «что если пользователь изменил свое имя?» все же — мы всегда можем сделать групповое обновление, когда это произойдет.

Вы должны быть действительно знакомы с этим процессом сейчас. Давайте установим имя и тип этих двух полей следующим образом:

  • authorName (String)
  • time (Строка)

Затем вам нужно изменить функцию create() для записи этих значений:

1
2
3
4
5
6
7
this.save({
    ‘title’: title,
    ‘content’: content,
    ‘author’: Parse.User.current(),
    ‘authorName’: Parse.User.current().get(‘username’),
    ‘time’: new Date().toDateString()
},…);

Обратите внимание, что я просто использую здесь функцию .toDateString() ; Вы можете использовать другие функции даты, чтобы получить желаемый формат времени.

Наконец, давайте обновим #blogs-tpl в index.html чтобы получить новые значения:

01
02
03
04
05
06
07
08
09
10
11
<script id=»blogs-tpl» type=»text/x-handlebars-template»>
 
{{#each blog}}
<div class=»blog-post»>
  <h2 class=»blog-post-title»><a href=»#»>{{title}}</a></h2>
  <p class=»blog-post-meta»>At {{time}} by {{authorName}}</p>
  <div>{{{content}}}</div>
</div>
{{/each}}
 
</script>

Теперь вы можете удалить эти существующие сообщения и добавить еще несколько на новой странице «Добавление нового блога».

Удалить существующие сообщения

Теперь все поля должны работать.

Обновлен список блогов

Поскольку мы используем {{{content}}} в шаблоне, вы обнаружите, что уже можете поместить HTML-теги в свой контент <textarea> и он будет правильно отображаться во внешнем интерфейсе. Однако большинство людей, включая меня, не считают, что это самый естественный способ написать блог.

Я покажу вам, как очень быстро добавить простой редактор WYSIWYG, чтобы вы знали, что это легко выполнимо.

Сначала скачайте плагин .

Он уже обновлен, но для демонстрации и учебного курса, давайте просто используем старый.

/dist/bootstrap-wysihtml5-0.0.2.css файлы, скопируйте /dist/bootstrap-wysihtml5-0.0.2.css и поместите его в свою папку CSS. Аналогично, скопируйте /dist/bootstrap-wysihtml5-0.0.2.min.js и /lib/js/wysihtml5-0.3.0.min.js в свою папку JS.

Затем свяжите эти файлы в admin.html :

1
2
3
4
<link href=»css/bootstrap-wysihtml5-0.0.2.css» rel=»stylesheet»>
<script src=»js/wysihtml5-0.3.0.min.js»></script>
<script src=»js/bootstrap-wysihtml5-0.0.2.min.js»></script>

Чтобы включить wysihtml5, все, что вам нужно, это вызвать wysihtml5() для элемента <textarea> . Давайте просто добавим это к функции render() в AddBlogView :

1
2
3
render: function(){
    this.$el.html(this.template()).find(‘textarea’).wysihtml5();
}

Затем вместо получения простого текста из функции serializeArray() мы можем получить HTML- val() из val() . Давайте изменим вызов create() чтобы использовать это:

1
blog.create(data[0].value, $(‘textarea’).val());

Код здесь действительно прост; не стесняйтесь изменять его, чтобы быть более эффективным, если хотите. (Используйте имя класса в качестве селектора, сохраняйте $('textarea') в качестве переменной и т. Д.)

Теперь, если вы обновите и протестируете, это должно работать уже!

wysihtml5 в действии

Поскольку это не является предметом этого урока, я остановлюсь здесь. wysihtml5 этого, wysihtml5 предлагает множество вариантов, поэтому взгляните на эти два репозитория, если вам интересно:

В этом сеансе вы позволили пользователям добавлять новый блог. Вы подготовили пользовательский интерфейс и связали его с внутренней базой данных. Вы также добавили больше полей в класс Blog, чтобы он был более читабельным в списке. Наконец, вы также реализовали простой плагин WYSIWYG. Я думаю, что это много, и, надеюсь, вы тоже так чувствуете!

На следующем занятии мы заложим основу для более функциональной панели администратора. Вы изучите концепцию маршрутизатора и объедините index.html и admin.html в один. Более того, мы выведем список блогов в админ-панель, чтобы пользователь мог их редактировать и удалять. Будьте на связи.