cergmin
@cergmin
Developer

Как удалять нужную строку?

У меня есть скрипт, который выводит по 7 уведомлений и даёт возможность их удалять. Эти уведомления берутся из файла:
notifications.scloud
Сообщение | Тип | Действие при нажатии на Да
<b>User</b> хочет отправить вам фалй <b>bg1.jpg</b> | File | alert('123');
Фалй <b>bg1.jpg</b> уже существует | Noti | No

И скрипт обработчика этого файла + скрипт AJAX:
index.php
echo '
        </div>
        <div class="main_notice">';
        
        $noti_arr = file("disk/users/".$_COOKIE["login"]."/notifications.scloud");
        $id = 0;
                foreach( $noti_arr as $noti ) 
                {
                  list($text, $type, $action) = explode(' | ', trim($noti));
                    $id = $id + 1;
                    if($type == 'File'){
                         echo '
                          <div class="block hidden">
                            <p>'.$text.'</p>
                            <div class="button">Принять</div><div class="close button">Отклонить</div>
                          </div>';   
                        }
                    elseif($type == 'Noti'){
                         echo '
                          <div class="block hidden">
                            <p>'.$text.'</p>
                            <div class="close button">Ок</div>
                          </div>';   
                        }
                }
        
        echo '</div>';
<script>
$('.$k.'.close'.$k.').click(function() {
          $.post( "/src/delete.php", $(this).serialize())
            .done(function( data ) {
          });
          evt.preventDefault();
        });
var messagesInViewCount = 7;

        $('.$k.'.block'.$k.').each(function(index, message) {

            if (index < messagesInViewCount) {
                $(message).removeClass('.$k.'hidden'.$k.');
            }
        });

        $(document).on('.$k.'click'.$k.', '.$k.'.block .close'.$k.', function() {

            $(this).closest('.$k.'.block'.$k.').addClass('.$k.'hidden closed'.$k.');
            $('.$k.'.block.hidden:not(.closed)'.$k.').eq(0).removeClass('.$k.'hidden'.$k.');
        });
</script>

И delete.php
<?
$lines = file("../disk/users/".$_COOKIE["login"]."/notifications.scloud");
unset($lines[0]);
file_put_contents("../disk/users/".$_COOKIE["login"]."/notifications.scloud", implode('', $lines));
?>

Если кто не понял, то при закрытии уведомления (как показано здесь) отправляется AJAX запрос и 1 строчка файла удаляется. Проблема в том, что если закрыть второе, третье и.т.д (по счёту с верху) уведомление, то удалится первая строчка. Как сделать, что-бы при закрытии 1-7 уведомления удалялась 1-7 строчка файла notifications.scloud.
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
amux
@amux
alp.ac
Передайте номер строки в post запросе,
$.post( "/src/delete.php", {delete_string: 3}) //Передаём номер строки '3'
.done(function( data ) {});

а в delete.php
$delete_string = $_POST['delete_string']; //Забираем номер строки из post
unset($lines[$delete_string]); //Удаляем
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@axeax
В первую очередь не храните уведомления в файле. Для этого есть базы данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы