Статьи

Размещение в стиле социальной сети с использованием PHP, MongoDB и jQuery — часть 2

В предыдущей части серии мы объяснили архитектуру базы данных, дизайн постпотока и поток приложения, необходимые для разработки нашего механизма постов, в котором пользователь сможет публиковать статус, подобный / в отличие от статусов других людей, и комментировать их. Эта часть серии расскажет вам о кодировании, необходимом для реализации этих функций. Мы будем использовать поток приложения и структуру базы данных, как обсуждалось в предыдущей статье. Не забудьте скачать код из репозитория github, если вы хотите следовать.

Вставить сообщение:

В нашем файле index.php мы добавили кнопку « Создать новую запись » . Нажатие на него вызовет функцию JavaScript new_post с идентификатором пользователя из сеанса в качестве параметра.

 <input type="button" value="Create New Post" id="btn_new_post" onClick="new_post('<?php echo $_SESSION['user_id']; ?>')" class="button_style"/> 

Обращаясь к коду в script.js , давайте разберем функцию new_post шаг за шагом:

Сначала мы получаем текст записи в переменной new_post_text и проверяем, является ли этот текст пустым, используя функцию trim JavaScript. Если текст пуст, мы показываем предупреждающее сообщение для ввода текста сообщения.

 function new_post(user_session_id) { var new_post_text = $('#post_textarea').val(); if(!$.trim(new_post_text)) { alert("Please enter some text in the post"); return; } 

Затем мы отправляем запрос AJAX POST с помощью функции jQuery $.POST :

 $.post('php_scripts/insert_new_post.php',{ user_id: user_session_id, post_text: new_post_text },function(output){ // code to be executed after success of AJAX call }); 

Формат функции $.POST в jQuery:

 jQuery.post(url,{parameter:value}, success(output){ //function body }); 

Первый параметр — это URL вызываемого файла. Второй параметр — это список параметров, которые нужно отправить на URL. Третий параметр — это функция обратного вызова, которая выполняется в случае успешного выполнения запроса AJAX. Переменная output содержит выходные данные, полученные из вызываемого файла.

Итак, в нашем случае мы вызываем insert_new_post.php , передавая в качестве параметров идентификатор пользователя и текст публикации. Мы вернемся к этой функции позже, чтобы написать код внутри функции обратного вызова.

Затем откройте файл insert_new_post.php в папке php_scripts . Это файл, в котором мы напишем код, который взаимодействует с базой данных. Прежде всего, мы создаем новый идентификатор записи, используя new MongoId () . Затем мы получаем идентификатор пользователя и публикуем текст, переданный из функции JS, используя $_POST . Как вы, возможно, знаете, MongoID — это комбинация времени и других параметров. Мы извлекаем время создания поста, используя post_id и функцию getTimestamp . Мы будем использовать эту метку времени как время создания нашего поста.

 $post_id = new MongoId(); $user_id = new MongoId($_POST['user_id']); $user_session_id = new MongoId($_SESSION['user_id']); $post_text = $_POST['post_text']; $timestamp=date('D, dM-Y', $post_id->getTimestamp()); 

Затем мы проверяем, совпадает ли идентификатор пользователя, полученный с помощью запроса AJAX, с идентификатором пользователя текущего сеанса. Это всего лишь небольшая проверка, чтобы подтвердить, что файл вызывается из правильного источника — мы не хотим, чтобы пользователь выполнял действия для кого-то еще. Затем мы создаем документ, содержащий все элементы post, и выполняем функцию вставки с тем же.

 if($user_id == $user_session_id) { $collection = $database->selectCollection('posts_collection'); $new_post_mongo = array ( '_id'=> $post_id, 'post_author_id' => $_SESSION['user_id'], 'post_text' => $post_text, 'total_likes' => 0, 'likes_user_ids' => array (), 'comments' => array (), 'total_comments' => 0, 'timestamp'=>$timestamp ); $collection->insert($new_post_mongo); } 

После того, как новый документ будет вставлен в базу данных, мы должны показать недавно вставленную запись на нашей странице указателя Для этого мы создадим и отправим HTML-контент отсюда, и этот вывод будет получен в качестве вывода функцией jQuery new_post которая вызвала эту страницу. Код для генерации этого HTML-кода аналогичен тому, что мы делали для отображения каждого поста в домашнем потоке в предыдущей статье. Итак, я пропускаю эту часть объяснения того же кода здесь снова. Вы можете ссылаться на код после вставки запроса в insert_new_post.php .

Возвращаясь к функции jQuery new_post , давайте new_post логику пост-успеха внутри обратного вызова. Здесь мы добавляем полученный результат к существующему пост-потоку, используя метод prepend а затем отображаем его с помощью анимации jQuery hide и slideDown . Наконец, мы очищаем весь существующий контент поста textarea.

 $.post(insert_new_post_filename,{ user_id: user_session_id, post_text: new_post_text},function(output){ $('#post_stream').prepend(output); var new_post_id=$("#post_stream div:first-child").attr("id"); $("#"+new_post_id).hide().slideDown(); $('#post_textarea').val(null); }); 

Это все. Мы закончили весь процесс вставки нового поста и отображения его на нашей странице указателя без обновления всей страницы. Давайте теперь быстро увидим похожий процесс симпатии / неприязни постов.

Нравится / Не нравится Сообщений:

Найдите диапазон для отображения метки Like / Unlike в index.php . Добавьте вызов функции onclick post_like_unlike с идентификатором текущего сеанса пользователя в качестве параметра.

 <span class="post_feedback_like_unlike" id="<?php echo $post_like_unlike_id;?>" onclick="post_like_unlike(this,'<?php echo $_SESSION['user_id']; ?>')"> <?php echo $like_or_unlike; ?> </span> 

В этой функции JS мы сначала проверим, нажал ли пользователь кнопку « Нравится» или «Не нравится» . Для этого мы берем HTML-текст ( Like / Unlike ) объявленного выше элемента span, используя свойство id post_id_like_unlike, полученное в качестве параметра. Здесь type будет содержать текст Like или Unlike .

 function post_like_unlike(post_id_like_unlike,user_session_id) { var type = ($('#'+(post_id_like_unlike.id)).html()); .. 

Мы также получаем идентификатор сообщения в качестве первой части после разделения идентификатора диапазона. Помните, что мы объявили span id в предыдущей статье следующим образом:

 $post_like_unlike_id=$post_id.'_like_unlike'; 

Причина объявления таких элементов должна быть понятна вам сейчас. Это позволяет нам использовать идентификатор записи в JS, как мы делаем сейчас:

 var post_id_of_like_unlike= ((post_id_like_unlike.id).split("_")) [0]; var post_id_like_count = post_id_of_like_unlike+'_like_count'; 

Если пользователь нажал на « post_like.php нравится», мы отправляем AJAX-вызов на post_like.php . post_unlike.php , мы называем post_unlike.php . В функции обратного вызова мы изменяем текст опции Like / Unlike на Unlike, если пользователь нажал на Like и наоборот. Также мы увеличиваем / уменьшаем количество лайков, используя post_id_like_count .

 if (type == 'Like') { $.post('php_scripts/post_like.php',{ post_id:post_id_of_like_unlike, user_id:user_session_id},function(output){ $('#'+(post_id_like_unlike.id)).html('Unlike'); $('#'+(post_id_like_count)).html(parseInt($('#'+(post_id_like_count)).html())+1); }); } else { $.post('php_scripts/post_unlike.php',{ post_id:post_id_of_like_unlike, user_id:user_session_id},function(output){ $('#'+(post_id_like_unlike.id)).html('Like'); $('#'+(post_id_like_count)).html(parseInt($('#'+(post_id_like_count)).html())-1); }); }; В if (type == 'Like') { $.post('php_scripts/post_like.php',{ post_id:post_id_of_like_unlike, user_id:user_session_id},function(output){ $('#'+(post_id_like_unlike.id)).html('Unlike'); $('#'+(post_id_like_count)).html(parseInt($('#'+(post_id_like_count)).html())+1); }); } else { $.post('php_scripts/post_unlike.php',{ post_id:post_id_of_like_unlike, user_id:user_session_id},function(output){ $('#'+(post_id_like_unlike.id)).html('Like'); $('#'+(post_id_like_count)).html(parseInt($('#'+(post_id_like_count)).html())-1); }); }; 

В post_like.php мы обновляем документ post, увеличивая total_likes на 1 и total_likes идентификатор текущего пользователя в массив likes_user_ids .

 $collection->update(array('_id' =>$post_id), array('$push' => array('likes_user_ids'=>$user_id), '$inc' => array('total_likes' => 1 )) ); 

Аналогично, в post_unlike.php мы обновляем документ post, total_likes на 1 и извлекая идентификатор пользователя из массива likes_user_ids .

 $collection->update(array('_id' => $post_id), array('$pull' => array('likes_user_ids'=>$user_id), '$inc' => array('total_likes' => -1 )) ); 

Вставка комментариев:

После того, как вы поймете, как работает пост-вставка и как / не нравится функциональность, вы сможете легко понять, как работает функция комментирования. После передачи текста комментария и идентификатора записи из index.php в JS, а затем в new_comment.php , мы обновим документ публикации, чтобы вставить новый комментарий и увеличить счетчик.

 $collection->update(array('_id' => $post_id), array('$push' => array('comments'=> array ( 'comment_id'=>$comment_id, 'comment_user_id' =>$user_id, 'comment_text' => $comment_text )), '$inc' => array('total_comments' => 1 )) ); 

Затем мы добавим этот новый комментарий к существующему списку комментариев к сообщению.

Наконец, мы реализовали все, что намеревались реализовать. На рисунке 1 показано, как выглядит наше окончательное рабочее приложение. (Обратите внимание, что на рисунке вы можете видеть трех пользователей. Для демонстрации я изменил этих пользователей из файла session_variables.php .)

Вывод:

В двух статьях этой серии мы научились проектировать схему базы данных, разбирались в структуре HTML, а затем реализовали весь механизм публикации. Тем не менее, обратите внимание, что в статье показан только один способ достижения этих функций, который может не совпадать с подходом, используемым такими социальными сетями. Кроме того, в таких приложениях есть множество других функций и проблем (безопасность, дизайн и т. Д.), Которые мы, возможно, здесь не обсуждали.

Кроме того, код не следует передовым методам — ​​это то, с чем читатель может поэкспериментировать. Реализуйте объектно-ориентированный код, используйте JavaScript-фреймворк, используйте PHP-фреймворк для всего бэкэнда — небо — это предел. Этот почтовый механизм — просто подсказка о том, как вы можете реализовать одну функцию в своей социальной сети.

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