18.09.2018, 20:36
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Nexus
|
Для обработчика ошибок или самого сервера.
|
Это не фатальная ошибка, чтобы заморачиваться таким образом. Такие мелочи нужно писать в лог и отдавать страницу без баннера. Да и трудно представить, чтобы директория имела свойство пропадать. )
Сообщение от Nexus
|
Так, пожалуй, проще для пользователя, который будет использовать этот код
|
Это не проще, это сложнее там, где совсем не нужно. Зачем клиент, если сервер извлекает номер из куки, а далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path).
Зачем усложнять
Последний раз редактировалось laimas, 18.09.2018 в 20:41.
|
|
18.09.2018, 20:52
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
Такие мелочи нужно писать в лог и отдавать страницу без баннера
|
Так информация о не перехваченном исключении будет записана в лог, а клиент получит status code отличный от 200, т.е. не отрисует баннер.
Сообщение от laimas
|
Да и трудно представить, чтобы директория имела свойство пропадать
|
Спору нет, однако совсем не трудно представить изначальное отсутствие директории.
Сообщение от laimas
|
далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path)
|
А перезаписать в куку? Посреди тела страницы её не запишешь.
|
|
18.09.2018, 21:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Nexus
|
однако совсем не трудно представить изначальное отсутствие директории
|
И что для этого нужно бросать исключение? Отлаживают скрипты прежде чем помещают на сервер. Это надуманная проблема, а если есть, то однажды заметив решается раз и навсегда.
Сообщение от Nexus
|
А перезаписать в куку? Посреди тела страницы её не запишешь.
|
И что этому мешает? Считали, изменили, установили, какие проблемы?
Не нужен тут JS вообще.
|
|
18.09.2018, 21:30
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
Отлаживают скрипты прежде чем помещают на сервер.
|
Это в идеале В большинстве случае copy-paste и новый коммент: "Не работает".
Сообщение от laimas
|
И что этому мешает?
|
В смысле? Куки передаются в заголовках страницы, не в контенте.
|
|
19.09.2018, 05:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Nexus
|
Куки передаются в заголовках страницы, не в контенте.
|
И что? Динамические страницы тем и отличаются от статических, что их содержание во многом определяется запросами клиента. А это означает, что серверный код, это "солянка" в чистом виде - много кода и представления. И если запрос к индексному файлу, то в итоге это это может быть сборкой множества различных файлов. При этом нет никаких проблем стартовать сессию, передать заголовки, включая и куки, как первичный ингредиент солянки, а все остальное потом.
Определили изначально переменную $banner равную null. Определились с куками, получили запрашиваемый баннер, присвоив его переменной $banner. А далее где-то уже в представление вывод ее. Будет null (не удалось получить банннер из-за ошибок, да и бог с ним, это не причина выбрасывать исключения), значит на странице его не будет, иначе нарисуется.
И как бы там не упрощалось у разработчика, стоит один раз увидеть что нет, один раз придется и проверить, и навсегда исправить. Такие ошибки исправляются на раз-два.
|
|
19.09.2018, 07:42
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
laimas, в этом случае код нужно будет разбить на 2 части и объяснить тс, что обновление кукисов должно происходить до передачи самой страницы.
|
|
19.09.2018, 08:27
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Nexus
|
в этом случае код нужно будет разбить на 2 части
|
Зачем? Вы же не пишите в своем JS, что нужно дождаться загрузки документа, обработав событие onload или же поместить JS после соответствующего html кода. Вы это как само собой подразумеваете и вас это нисколько не удивляется ибо это есть логика.
Так что вам мешает писать такую же логику для сервера, там ведь тоже самое только наоборот - все что прежде вывода нужно делать до вывода.
<?php
старт сессии, передача заголовков, работа с куками,
обработка ajax запросов с выходом, обработка перенаправлений на себя, и т.п., и т.д.
?>
<html>
вывод, и не возбраняется выполнять иной код
</htm>
Что тут сложного в понимании? В любом случае даже для средней по условиям отображения страницы не избежать различных подключений и прочего кода, так как можно написать все одной портянкой, но сопровождать такой код очень сложно.
|
|
19.09.2018, 09:05
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
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>
|
|
19.09.2018, 10:21
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
На какие части? Это все один файл, а каждая его часть, это его логический блок. Вы же раздолбали код действительно на на две части между сервером и клиентом, считая при этом, что это куда понятнее.
Да и написано у вас ...
<?
$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>
Это логика одного файла, а по уму ее разделяют на код и представление (шаблонизаторы).
|
|
19.09.2018, 10:37
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
На какие части? Это все один файл
|
Это печально, если все действительно будет в одном файле )
|
|
|
|