Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Простой ротатор данных (https://javascript.ru/forum/project/75261-prostojj-rotator-dannykh.html)

laimas 18.09.2018 20:36

Цитата:

Сообщение от Nexus
Для обработчика ошибок или самого сервера.

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

Цитата:

Сообщение от Nexus
Так, пожалуй, проще для пользователя, который будет использовать этот код

Это не проще, это сложнее там, где совсем не нужно. Зачем клиент, если сервер извлекает номер из куки, а далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path).

Зачем усложнять :)

Nexus 18.09.2018 20:52

Цитата:

Сообщение от laimas
Такие мелочи нужно писать в лог и отдавать страницу без баннера

Так информация о не перехваченном исключении будет записана в лог, а клиент получит status code отличный от 200, т.е. не отрисует баннер.
Цитата:

Сообщение от laimas
Да и трудно представить, чтобы директория имела свойство пропадать

Спору нет, однако совсем не трудно представить изначальное отсутствие директории.
Цитата:

Сообщение от laimas
далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path)

А перезаписать в куку? Посреди тела страницы её не запишешь.

laimas 18.09.2018 21:10

Цитата:

Сообщение от Nexus
однако совсем не трудно представить изначальное отсутствие директории

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

Цитата:

Сообщение от Nexus
А перезаписать в куку? Посреди тела страницы её не запишешь.

И что этому мешает? Считали, изменили, установили, какие проблемы?

Не нужен тут JS вообще.

Nexus 18.09.2018 21:30

Цитата:

Сообщение от laimas
Отлаживают скрипты прежде чем помещают на сервер.

Это в идеале :) В большинстве случае copy-paste и новый коммент: "Не работает".

Цитата:

Сообщение от laimas
И что этому мешает?

В смысле? Куки передаются в заголовках страницы, не в контенте.

laimas 19.09.2018 05:20

Цитата:

Сообщение от Nexus
Куки передаются в заголовках страницы, не в контенте.

И что? Динамические страницы тем и отличаются от статических, что их содержание во многом определяется запросами клиента. А это означает, что серверный код, это "солянка" в чистом виде - много кода и представления. И если запрос к индексному файлу, то в итоге это это может быть сборкой множества различных файлов. При этом нет никаких проблем стартовать сессию, передать заголовки, включая и куки, как первичный ингредиент солянки, а все остальное потом.

Определили изначально переменную $banner равную null. Определились с куками, получили запрашиваемый баннер, присвоив его переменной $banner. А далее где-то уже в представление вывод ее. Будет null (не удалось получить банннер из-за ошибок, да и бог с ним, это не причина выбрасывать исключения), значит на странице его не будет, иначе нарисуется.

И как бы там не упрощалось у разработчика, стоит один раз увидеть что нет, один раз придется и проверить, и навсегда исправить. Такие ошибки исправляются на раз-два.

Nexus 19.09.2018 07:42

laimas, в этом случае код нужно будет разбить на 2 части и объяснить тс, что обновление кукисов должно происходить до передачи самой страницы.

laimas 19.09.2018 08:27

Цитата:

Сообщение от Nexus
в этом случае код нужно будет разбить на 2 части

Зачем? Вы же не пишите в своем JS, что нужно дождаться загрузки документа, обработав событие onload или же поместить JS после соответствующего html кода. Вы это как само собой подразумеваете и вас это нисколько не удивляется ибо это есть логика. :)

Так что вам мешает писать такую же логику для сервера, там ведь тоже самое только наоборот - все что прежде вывода нужно делать до вывода.

<?php
старт сессии, передача заголовков, работа с куками,
обработка ajax запросов с выходом, обработка перенаправлений на себя, и т.п., и т.д.
?>
<html>
вывод, и не возбраняется выполнять иной код
</htm>

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

Nexus 19.09.2018 09:05

laimas, ну так у вас все равно будет разбитие на 2 части.
Первая: до вывода контента страницы;
Вторая: в представлении.


<?php

$directory=__DIR__.'/banners/';
$banner='';
if(is_dir($directory)){
    $visit=isset($_COOKIE['visit'])?(int)$_COOKIE['visit']:0;
    $banners=array_diff(scandir($directory),['.','..']);
    $response=$directory.$banners[$visit%count($banners)];
    $banner=file_get_contents($response);
    setcookie('visit',++$visit,time()+365*24*3600,'/');
};

?><html>
<?php echo $banner; ?>
</html>

laimas 19.09.2018 10:21

На какие части? Это все один файл, а каждая его часть, это его логический блок. Вы же раздолбали код действительно на на две части между сервером и клиентом, считая при этом, что это куда понятнее. :)

Да и написано у вас ...

<?
$visit = $_COOKIE['visit'] ?: 0;
$banner = glob($dir)[$visit];
setcookie('visit', ++$visit, не слишком ли до ... ? ), '/');
//и прочий код который обязательно всегда будет
?>
<html>
<head>
<?=$var?> и прочий вывод определенных значений
</head>
<body>
как и в нужном месте где-то
<div class="banner">
<?
if($banner) include '$banner';
?></div>
</html>


Это логика одного файла, а по уму ее разделяют на код и представление (шаблонизаторы).

Nexus 19.09.2018 10:37

Цитата:

Сообщение от laimas
На какие части? Это все один файл

Это печально, если все действительно будет в одном файле )


Часовой пояс GMT +3, время: 13:12.