exec('google-chrome --headless --no-sandbox --disable-gpu --print-to-pdf=путь_куда_класть_пдф.pdf --no-margins путь_где_брать_хтмл.html --virtual-time-budget=50000 >куда_писать_лог.log 2>&1');
Я понимаю, что вы только-только открыли для себя ООП и теперь применяете где надо и где не надо.спасибо за комплимент, но я давно вышел из возраста когда от любой новой освоенной фичи впадаешь в щенячий восторг, да и за овер 15 лет в программировании кое-что для себя вывел, чем и делюсь тут.
В современных языках ООП вообще не стали делать - Rust, Go.не надо путать хрен с пальцем, то что в го нет объектов в явном виде не означает что он не объектно ориентированный. Там нет наследования, но вместо него есть имплементация. А для инкапсуляции используются структуры. Если вы не в курсе - ооп не реализация, а парадигма и метод структурирования, а не классы и объекты.
Это модульная система. Это не стандартный проект.не вижу противоречия, в любом проекте есть стандартные компоненты, тот же CRUD, работа с хранилищами, авторизация. логирование, маршрутизация и много еще чего, которое вы все равно будете делать, но в любом фреймворке это уже есть, готовое, покрытое тестами и обкатанное. Если вы ССЗБ - флаг в руки, пилите свое. Однако все же советую не упираться рогом в стену и прочитать про архитектуру современных приложений на пыхе, почитать хотя бы что умеют современные фреймворки. Уверен, 80% ваших задач либо можно покрыть компонентами искаропки, либо немного их допилив, ну или готовыми модулями для фреймворка с гитхаба.
...
let newWin = window.open(cur_url, '_blank');
newWin.close();
...
ой. в App тоже конструктору вас все немного смешалось. Либо конструктор принимает БД, либо отдельный метод, а то так у вас вообще 2 метода делают одно и то же.
header('Content-Type: text/html; charset=UTF-8');
header('Expires: Mon, 30 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
header('Content-transfer-encoding: binary');
header('Content-Disposition: attachment; filename='.$name);
header('Content-Type: application/zip');
readfile($filepath);
header('Content-Type: text/html; charset=UTF-8');
header('Expires: Mon, 30 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
header('Content-transfer-encoding: binary');
header('Content-Disposition: attachment; filename='.$name);
header('Content-Type: application/zip');
readfile($filepath);
Не единственный, можно ещё и вебсокеты прикрутить или лонгпуллы.это понятно(хотя крутить их ради одной такой задачи я бы не стал). И вопрос вроде не о отсылке аяксом, а о получении СОБЫТИЯ для остановки спинера.
<div id="cn"></div>
<button id="add">add</button>
<script>
$(function(){
$('#add').on('click',function(){
let mess = $('<div >new mess</div>');
$('#cn').append(mess);
setTimeout(function(){
fde(mess);
}, 3000);
});
})
function fde(obj){
obj.fadeOut();
}
</script>