Система лайков и просмотров статьи

В основном контроллере MainpageController напишем метод actionPost, который будет срабатывать по переходу на адрес статьи. Эти url прописаны в файле роутов config/routes.php

return array(
  '^$' => 'MainPage/index/$0',
  '^post\/([a-zA-Z\d_]{5,33})$' => 'MainPage/post/$1'
);


function actionPost($post){
  $post = $post[0];
  $this->m->query("update `posts` set `watch`=`watch`+1 where `href`=?", [$post], 1); // обновляем просмотры статьи
  $post = $this->m->query("select * from `posts` where `href`=?", [$post]); // выбираем сами данные статьи
  
  $title = $post[0]['title'];
  $description = 'Блог Creative*Web';
  $watch = $post[0]['watch'];
  $likes = $post[0]['likes'];
  
  // создаём сам блок где выведем лайки и просмотры
  $likeswatch = "<span class='watch' style='white-space: pre-wrap;'>$watch <img style='height: 0.8em; top: 2px; position: relative;' src='/template/img/watch.png' alt='' />   </span> <span class='likes'> <span id='likes'>$likes</span>  <img id='like' style='cursor: pointer; height: 1em; top: 4px; position: relative;' src='/template/img/likes2.png' alt='' /></span>";
  
  // Подключаем вид
  require ROOT."/template/views/main.php";

  return true;
}

В файле вида ловим данные из контроллера

if(isset($post))
  {
    echo $post[0]['title']."<br/><br/>".$post[0]['description']."<br/><br/>".$likeswatch;
  }
  
Осталось реализовать лайк и его отмену в файле script.js

$(function()
  {
    var post = location.pathname
      post = post.split("/")
      post = post.pop() 
    if(localStorage.getItem(post) == 1){
      $("#like").attr('src', '/template/img/likes.png')
    }
    
    
    $("#like").on('click touchstart', function(){
      let post = location.pathname,
          count = parseInt($("#likes").text())
        post = post.split("/") // разбиваем урл на массив
        post = post.pop() // получение последнего элемента этого массива, то есть её href в базе
      
      // для запоминания лайка будем использовать localstorage вместо кук
      if(localStorage.getItem(post) != 1){
        $.ajax({
          url: "/ajaxController.php",
          type: "POST",
          cache: false,
          data:
          {
            func: "setLike", post: post, punct: '+'
          },
          success: function(response)
          {
            if(response == 1){
              localStorage.setItem(post, '1')
              $("#like").attr('src', '/template/img/likes.png')
              $("#likes").text(count+1)
              console.log()
            }
          }
        })
        
      }else{
        $.ajax({
          url: "/ajaxController.php",
          type: "POST",
          cache: false,
          data:
          {
            func: "setLike", post: post, punct: '-'
          },
          success: function(response)
          {
            if(response == 1){
              localStorage.removeItem(post)
              $("#like").attr('src', '/template/img/likes2.png')
              $("#likes").text(count-1)
            }
          }
        })
      }
    })

})
Функция которая ловит аякс-запрос в ajaxController.php

  function setLike(){
    $post = $this->escapeStr($_POST['post'], 33);
    $punct = $this->escapeStr($_POST['punct'], 1);
    echo $this->query("update `posts` set `likes`=`likes` $punct 1 where `href`=?", [$post], 1);
  }
  
Вот и вся движуха. Желаю успехов на поприще. Харе Кришна!
likeswatch.rar

08.03.2023

174
A B i U S JS

PHP HTML CSS
Чат
    Для входа только имэйл или имя и апроль
    Можно сменить аватар
    Имэйл Ваше имя
    Пароль