Как создать слайдер с несколькими динамическими изображениями? [используя только PHP, MySQL и vanilla JS! ]


Я новичок в программировании на PHP и JS, и мне нужна помощь с моим проектом веб-сайта.
В другом вопросе у меня возникла проблема с системой размещения изображений, которая была решена:
SOS! Как отображать альбомы изображений в сообщениях? [используя только PHP и MYSQL]..

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

Слайдер изображений
Меня вдохновил полноэкранный слайдер изображений: https://codepen.io/bradtraversy/pen/boydaE
и слайдер-карусель: https://www.youtube.com/watch?v=KcdBOoK3Pfw
, которые являются ванильными, но статичными (без database).


Ниже вы можете увидеть мой файл php, где все собрано вместе.

display.php


<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");    

$result = mysqli_query($db, "SELECT * FROM posts");
while ($row = mysqli_fetch_array($result)) {
   echo "<div class=\"post_container\">";
     echo $row['post_title'];
     echo "<div class=\"image_container\">";
     SELECT img_file, img_title FROM images WHERE post_id = " .$rowx['id_post']);

     if(mysqli_num_rows($resultx) > 0) {
        if(mysqli_num_rows($resultx) == 1) {
           echo "<div class=\"post_image_displayer\">";
             while ($rowx = mysqli_fetch_array($resultx)) {
               echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
               echo $rowx['img_title'];
             }
           echo "</div>";
        }
        elseif(mysqli_num_rows($resultx) > 1) {
           echo "<div class=\"post_image_slider\">";
             include_once 'incl_image_slider.php';
           echo "</div>";
        }
     }
     echo "</div>";
   echo "</div>";
}
?>
</body>
</html>


Этот код отлично работает, если бы на этой странице был только 1 слайдер. Видите ли, я использовал include_once 'incl_image_slider.php'; . Если бы я использовал только include 'incl_image_slider.php'; , страница сошла бы с ума... (только слайдер изображения). Даже если все имеет класс и не имеет уникального идентификатора.

incl_image_slider.php


<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="includes/incl_carousel_slider_style.css">
</head>

<div class="carousel-container">
    <div class="carousel-slide">
        <?php
        $db = mysqli_connect("localhost", "root", "", "post_images");
        $result = mysqli_query($db, "SELECT * FROM posts");
        $row = mysqli_fetch_array($result);
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id =".$row['id_post']);

        $rowz = mysqli_fetch_all($resultx, MYSQLI_ASSOC);
            echo "<img src='folder_img_uploads/".$rowz[0]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[1]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[2]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[3]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[4]['img_file']."' >";
        ?>
    </div>
</div>
<button class="prevBtn">Prev</button>
<button class="nextBtn">Next</button>

<script src="incl_image_slider_app.js"></script>


Проблема в том, что я должен знать для каждого поста, сколько изображений внутри. Так что это нельзя использовать динамически с базой данных, у кого-нибудь есть идея, что изменить?

incl_image_slider_app.js

Частично это из: https://codepen.io/bradtraversy/pen/boydaE

let sliderImages = document.querySelectorAll(".carousel-slide"),
arrowLeft = document.querySelector(".prevBtn"),
arrowRight = document.querySelector(".nextBtn"),
current = 0;

// Clear all images
function reset()
{
  for (let i = 0; i < sliderImages.length; i++)
  {
    sliderImages[i].style.display = "none";
  }
 }
 // Init slider
 function startSlide()
 {
   reset();
   sliderImages[0].style.display = "block";
 }
 // Show prev
 function slideLeft()
 {
   reset();
   sliderImages[current - 1].style.display = "block";
   current--;
}
// Show next
function slideRight()
{
  reset();
  sliderImages[current + 1].style.display = "block";
  current++;
}
// Left arrow click
arrowLeft.addEventListener("click", function()
{
  if (current === 0)
  {
    current = sliderImages.length;
  }
slideLeft();
});

// Right arrow click
arrowRight.addEventListener("click", function()
{
  if (current === sliderImages.length - 1)
  {
    current = -1;
  }
slideRight();
});

startSlide();


На самом деле этот слайдер изображений не скользит, понятия не имею, почему? Но он показывает первое изображение поста. И это невозможно указать несколько раз для каждого сообщения в моем display.php

Я надеюсь, что есть кто-то, кто может мне помочь.
С наилучшими пожеланиями :)


person Coding Noob    schedule 13.08.2018    source источник
comment
Вы делали проверку ошибок?   -  person Jay Blanchard    schedule 13.08.2018
comment
Я не получаю никаких ошибок, к сожалению, слайдер изображений просто не работает/не скользит. И я не могу реализовать слайдер несколько раз на одной странице, даже если нет уникальных идентификаторов. Знаю, тема немного сложная...   -  person Coding Noob    schedule 13.08.2018
comment
Вы также можете сделать это без javascript, используя css3   -  person Raymond Nijland    schedule 13.08.2018
comment
Сначала я попробовал слайдер css, вдохновленный youtube.com/watch?v=z74ExMz. -cWU, но кто-то сказал мне, что будет очень сложно использовать это для динамической системы постинга.   -  person Coding Noob    schedule 13.08.2018


Ответы (1)


Я думаю, вы хотите что-то вроде этого. Я использовал Flickity Slider (чистый JavaScript) вместо вашего JavaScript, потому что не смог заставить его работать (но опять же, я едва могу написать цикл foreach в JavaScript :(), надеюсь, это даст вам что-то для начала. :)

https://flickity.metafizzy.co/

<!DOCTYPE html>
<html>
<head>
<!-- CSS -->
<link rel="stylesheet" href="https://unpkg.com/flickity@2/dist/flickity.min.css">
<!-- JavaScript -->
<script src="https://unpkg.com/flickity@2/dist/flickity.pkgd.min.js"></script>
</head>
<body>

<?php
$db = mysqli_connect("localhost", "root", "", "post_images");      
$result = mysqli_query($db, "SELECT * FROM posts");
?>

<?php while ($row = mysqli_fetch_array($result)) : ?>

    <div class="post_container">$row['post_title'];

        <?php $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']); ?>

        <?php if (mysqli_num_rows($resultx) == 1) : ?>

        <div class="image_container">

            <div class="post_image_displayer">

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>'><?php echo $rowx['img_title']; ?>
                <?php endwhile; ?>

            </div>

        </div>

        <?php elseif(mysqli_num_rows($resultx) > 1) : ?>

            <div class="main-carousel" data-flickity='{ "cellAlign": "left", "contain": true }'>

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <div class="carousel-cell"><img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>' ></div>
                <?php endwhile; ?>

            </div>

        <?php endif; ?>

    </div>

<?php endwhile; ?>

</body>
</html>

Файлы CSS и JavaScript в заголовке включают плагин слайдера.

Затем первый SQL-запрос получает все сообщения, а цикл while обрабатывает каждое из них.

Для каждого поста второй SQL-запрос получает изображения для текущего поста.

Если есть только одно изображение, оно печатается внутри <div class="image_container">.

Если есть более одного изображения, они печатаются внутри <div class="main-carousel">, который сообщает плагину JavaScript вместе с data-flickity='{ "cellAlign": "left", "contain": true }', что ему нужно отобразить их в слайдере.

Каждое из отдельных изображений в слайдере напечатано внутри <div class="carousel-cell">, что также требуется плагину.

Это повторяется для всех изображений всех сообщений, вам не нужно использовать включаемый файл.

Обновление ползунка от sinisake из этот пост

<!DOCTYPE html>
<html>
<head>
<!-- CSS -->
<link rel="stylesheet" href="">
<!-- JavaScript -->
<script src=""></script>
</head>
<body>

<?php
$db = mysqli_connect("localhost", "root", "", "post_images");      
$result = mysqli_query($db, "SELECT * FROM posts");
?>

<?php while ($row = mysqli_fetch_array($result)) : ?>

    <div class="post_container">$row['post_title'];

        <?php $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']); ?>

        <?php if (mysqli_num_rows($resultx) == 1) : ?>

        <div class="image_container">

            <div class="post_image_displayer">

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>'><?php echo $rowx['img_title']; ?>
                <?php endwhile; ?>

            </div>

        </div>

        <?php elseif(mysqli_num_rows($resultx) > 1) : ?>

            <div class="slideshow-container">

                <?php $rowsx = mysqli_fetch_all($resultx, MYSQLI_ASSOC); ?>

                <?php foreach ($rowsx as $key => $rowx) : ?>

                  <div class="mySlides fade">
                    <div class="numbertext"><?php echo $key + 1; ?> / <?php echo count($rowsx); ?></div>
                    <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>' style="width:100%">
                    <div class="text">Caption Text</div>
                  </div>

                <?php endforeach; ?>

                  <a class="prev" >&#10094;</a>
                  <a class="next">&#10095;</a>
                <div style="text-align:center">

                <?php foreach ($rowsx as $rowx) : ?>
                  <span class="dot"></span>
                <?php endforeach; ?>

                </div>  

            </div>

        <?php endif; ?>

    </div>

<?php endwhile; ?>

</body>
</html>

Что я здесь изменил, так это то, что я сохранил весь результат второго SQL-запроса в массиве ($rowsx), потому что тогда я могу перебрать его дважды (с foreach вместо while).

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

person Marleen    schedule 13.08.2018