.


Договор лицензирования копии сайта с исходным кодом, лицензия PHP_IN_STYLE_C
Версия Договора 1.1.3 от 24.12.2020

  Смотреть лицензионный договор>>

  Предлагаем готовый, простой и хорошо работающий код на чистом функциональном PHP, c базой Mysql с нормальной лицензией, недорого для Ваших проектов.

  Функциональный С или Perl, которые были взяты за образец кода, разрабатывались умнейшими программистами в 70х годах и программы контроллеров делают и сегодня на функциональном С.

  Perl к сожалению сдал позиции, видимо потому, что были программисты которые писали вместо 10 строк одну и мало кто мог понять, что там написано, также не было встраивания переменных в код html, но это решалось простым скриптом, который выводил весь html как эхо и всталять можно было что угодно.

  Мы не усложняем код, а наоборот делаем понятней, чем даже на родительском сайте www.php.net, при этом везде добавляя проверки, логирование и вывод ошибок. Мы не хвалимся сложным кодом в простых задачах.

  При разработке не использовались фреймворки, если у кого есть желание сделать свой модуль по другому, пожалуйста, ничто этом не мешает, только модули должны общаться между собой как сказано на сайтах: Языка PHP Базы Mysql (Mariadb) Языка C - это даст совместимость.

  Если модуль имеет ошибку, то он не влияет на работу всего сайта, кроме модулей авторизации и связи с базой данных. Как быстрее работает сайт на модели MVC: Модель-Вид-Контроллер, где 2 канала связи, или когда 50 модулей работают отдельно и 50 каналов связи задействуются? Могут сказать, что это дублирование кода. Нет, общий код есть в модулях авторизации, доступа к базе данных и одном модуле общем для всех. Остальные модули могут быть похожи, но они разные. При этом они относительно автономны.

  Частоты процессоров сегодня увеличиваются медленно, при этом количество ядер увеличивается быстро, параллельная работа, это будущее. А в MVC так и останется 2 канала связи. Как там будет, непонятно, но уже сегодня для сайтов с СМС выделяют отдельные мощные хостинги.

  Модуль у нас состоит из 2 файлов логика и реализация, а также нескольких вспомогательных файлов. Всё очень наглядно и просто.

  Код написанный на чистом PHP без надстроек, требует больше времени на разработку, но всё работает быстрее и проще. Здесь требуется нормальное мышление программиста, не такое как в Wordpress, не нужно думать про то, как найти нужную функцию в Wordpress, что Wordpress ответит, просто нужно делать всё, что нужно на PHP, Mysql, все функции языка есть на php.net, php.su - там максимально просто и быстро работает.

  Я изучал С, Perl, PHP самостоятельно и тоже столкнулся с тем, что многие программисты пишут непонятный код, ленятся делать комментарии, сокращают название переменных, считают достоинством сделать из 3 строк кода одну, это хорошие программисты, а есть ещё те, кто вообще пишет ахинею. Потом проще написать код заново, чем разбираться в их коде. Поэтому и пришли на помощь Yii, Symphony, Zend, Laravel которые систематизируют код, но меняют синтаксис, также СМС вроде Wordpress, Joomla, которые вообще меняют код на свой манер и жёстко контролируют работу плагинов и тем, не дают вмешиваться в работу ядра и базы напрямую.

  Возможно, что если писать код на чистом PHP нормально, комментируя все нужные моменты, то необходимости в Фреймворках нету, а готовые шаблоны из фреймворков, если бы были на чистом PHP, без искажения синтаксиса PHP, это было бы лучше и удобнее. Работающий пример такого подхода можно посмотреть на Arduino или Raspberry PI, там скетчи написаны на С, Python без фреймворков, cкетчи содержат комментарии и все ими пользуются, меняют код, всё работает. Если загрузить Arduino IDE, там сразу доступна масса работающих примеров, а не отдельных функций, как на php.net или mysql.com.

  Но на php.net нет ни одного образца нормально работающего интернет-магазина, калькулятора, где бы всё было реализовано от заказа до оплаты. Почему-то разработчики размещают маленькие кусочки кода с их функциями и не дают полноценных решений, вот все и пишут, кто во что горазд. Было бы хорошо, если бы на php.net, было как в Arduino IDE - 50-100 работающих полноценных решений бесплатно или за маленькую цену, тогда зачем бы были фреймворки и СМС?

  Полноценное решение, - это когда маленькие кусочки кода с php.net собраны в работающий механизм, с проверками, авторизацией, логированием, базой данных, комментариями, выводом ошибок, понятными названиями переменных - всё вместе это у нас составило примерно 70 000 строк кода, это не куча образцов функций по 10 строчек с php.net - у нас именно такое решение.

  Простая парадигма работы сайта: Запрос от клиента - обработка скриптом (ответ) - запрос (несколько запросов) в базу данных - обработка скриптом (ответ) - это всё.

  Парадигма работы с контроллером: Запрос от клиента - обработка скриптом (ответ) - запрос (несколько запросов) в базу данных - (Контроллер STM32 или Аrduino работает сам по себе, получает информацию от датчиков, отправляет информацию приводам, опрашивает состояние базы данных в цикле - берёт из базы что нужно и даёт ответы через LAN, поэтому на момент запроса там актуальная информация о датчиках, моторах, приводах, всём оборудовании) - обработка скриптом (ответ) - это всё.

  Можно делать и с парадигмой MVC или другой, но здесь это не нужно.

  А если есть готовая функция или готовое решение, то просто берёте что нужно и вставляете. Здесь нет привязки к Фреймворку или СМС, здесь привязка к языку программирования и базе данных, при этом разные модули могут быть на разных языках сделаны.

  Не требуется работать с "Свободной" лицензией GNU, когда весь код, вся Ваша работа всегда будет не Ваша, а колхозная, где никто не знает, чья на самом деле корова на ферме, а корова в итоге - сирота.

  Низкий порог вхождения, достаточно понимать чистый PHP и Mysql.

  В коде везде есть комментарии, нет значимых переменных из 1-3 букв, все названы нормальными словами. Функции из языка PHP используются как сказано на php.net и названия этих функций не менются, поэтому вся справка из www.php.net тут подходит.

  Не используются сложные структуры, где можно упростить работу, сложное задание дробится до простейших частей и реализация этих частей простая и наглядная. Всего несколько раз использованы более сложные выборки из Mysql вроде LEFT JOIN.

  Готовая работающия база данных Mysql, ориентированная на интернет магазин, калькулятор, простые выборки, автоматизацию. Каждое понятие имеет свою таблицу или несколько. Напримет таблица компаний, таблица атрибутов, таблица товаров.

  Вывод осмысленных сообщений о ошибках, свои логи и многое другое.

  Не требуется тратить 1-2 года, как было затрачено на этот сайт, на создание своего похожего кода, что заставляет начинающих программистов идти более быстрым путём и использовать СМС.

  Стоимость лицензии сейчас самая низкая, по мере развития проекта планируется её увеличивать.

  Смотреть лицензионный договор>>


  Другая сторона сайта - контроллеры.

  Я начал делать сайты на продажу в 2004 году, поэтому могу сказать о положении дел тогда и сегодня.

  Старый мой сайт в архиве, сохранение не везде корректное и размер экрана при сохранении 1024х768, но история была интересная >>

  Тогда сайтов ни у кого почти небыло. Найти заказа было проще простого, открыл газету, где объявление без сайта, пару звонков и заказ есть, только успевай делать. Сайт минимальный стоил у меня 300 долларов, максимальный 10 000 долларов.

  Сегодня совсем другая ситуация. Сайты есть почти у всех. Wordpress раздают бесплатно. Wordpress сделан, что-бы делали темы, плагины и продавали эти темы и плагины тысячи раз. Соответственно это вносит коррективы в рынок. Кто хочет делать по другому, тот сталкивается с тысячами этих плагинов и тем по 10 долларов.

  Сегодня открылась новая ниша, для сайтов, - автоматизация, совместная работа сайтов и контроллеров STM32, Arduino.

  Компания ST выпустила в 2020 году ряд бесплатных продуктов для разработки автоматизации: STM32CubeMX, STM32CubeIDE - чьи аналоги, стоят более 10000 долларов за 1 лицензию, что сделало доступным разработку для этой платформы для каждого.

  Использование платформы Arduino, с своими обязательными доработками до промышленного уровня, - это самый дешёвый и работающий вариант автоматизации на сегодня, где при правильном подходе можно получить отличный результат.

  Сочетание компьютера (сервера) на Linux, Apache, сайта как Вёб-интерфейса для совместной работы с контроллером STM32, Arduino – это очень хороший вариант на сегодня для автоматики.

  Вендинговые киоски, роботы для дома - простой робот пылесос, сколько стоит, меньше 300 долларов, наверное не будет, а там запчастей на 20 долларов + корпус 5 долларов и программка. А если взять комбайн с управлением от сервера, то там вообще заоблачные цены. А на самом деле, там ничего сложного нет, логика работы этих роботов почти везде примитивная, примерно на уровне среднего сайта. Надо получить сигнал от датчика, посчитать и отправить моторчику, вот и всё.

  Сегодня уже есть платформы для умного дома, но код тех сайтов обычно не продаётся, это saas платформа, а мы продаём. Потому что сервер с кодом лучше поставить дома, если автоматизация идёт для дома или в вендинговом киоске, если автоматизация для киоска. Гонять показания датчика за тысячи километров, через кучу серверов и протоколов не надёжно и медленно, это ограничивает функциональность.

  Лучше поставить сервер за 10 метров от контроллеров и работать по сети или Wifi, а из интернета можно посмотреть что там на сервере.

  А если через интернет магазин не только заказать товар с картинки, а ещё и через глаза робота посмотреть на товар в натуре, потрогать, перевернуть, положить в корзину и оформить покупку? Задать при этом вопросы продавцу если нужно.
А прополоть грядку на даче или полить сидя за компьютером в квартире и просто зайдя на сайт?
А кота с собакой накормить через сайт?
А рыбу поймать?
А грибов пособирать или ягоды, прямо из квартиры?
А присмотреть за детьми или больными в доме, с работы?
Такого ещё нету, пока нету.

  Но в Wordpress, Joomla и других СМС нет плагинов для таких роботов, там это не заложено в функциональность, а если и заложить, будет медленно работать, поэтому ниша свободна.

  Сайт www.stmsite.ru специально разработан для простой работы, в том числе и контроллерами. Можете сравнить код на С для Ардуино с кодом на сайта написанном на PHP - очень похоже.

  К тому-же на PHP разрешили вставлять функции написанные на С, а также добавились возможности постоянной работы PHP на сервере, всё это очень хорошо вместе должно работать. Будем постепенно всё это реализовывать в движке сайта.

  Кто будет работать с сайтом, те будут получать бесплатные копии лицензий и другие возможности - смотрите лицензионный договор.

 

Образец типового файла логики функционального PHP

Код


if(!empty($_POST["user_profile_change_delivery"])) {
    ob_start();
    get_header();
    get_menu_top();
    page_start();
    get_menu_left_top();
    get_menu_left_account();
    get_menu_left();
    menu_left_documents();
    article_start();
    get_data_from_user_profile_form_delivery();
    user_profile_form();
    get_footer();
    ob_end_flush();
} elseif(!empty($_POST["tariff_user_close"])) {



 

Образец типового файла реализации функционального PHP

Код




/*Отступ*/
function get_attribute_page_number($category_group_id_attribute)
{
    /*Вывод количества страниц с атрибутами*/
    /*Переменные (атрибута из констант по умолчанию)*/
    $debugging_mode = DEBUGGING_MODE_DEFAULT;
    $notice_mode = NOTICE_MODE_DEFAULT;
    $help_mode = HELP_MODE_DEFAULT;
    $language_desired_code = LANGUAGE_DEFAULT_CODE;
    $currency_desired_code = CURRENCY_DEFAULT_CODE;
    $country_desired_code = COUNTRY_DEFAULT_CODE;
    /*Используем готовое соединение с базой*/
    global $mysqli;
    /*Проверка запуска сессии, сессия должна быть запущена*/
    if (!session_id()) {
        $temp_time = time();
        $message_for_log = translation_text("Ошибка, сохраните номер", "ru", $language_desired_code, __FILE__, __LINE__, "13989") . ": " . $temp_time . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Не запущена сессия, требуется запуск сессии", "ru", $language_desired_code, __FILE__, __LINE__, "13990") . ". <br>".PHP_EOL;

        $message_for_log .= translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": ".__FUNCTION__."() <br>".PHP_EOL;
        $message_for_log .= translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Файл", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __FILE__ . " <br>".PHP_EOL;
                if(!write_message_in_log_error($message_for_log))
        {
            if ($notice_mode=="yes") {
            echo "Mistake with message, inform administrator, please<br>".PHP_EOL;

            echo "Function: ".__FUNCTION__."() <br>".PHP_EOL;
            echo "Line: " . __LINE__ . " <br>".PHP_EOL;
            }
        }
        message_top();
        echo $message_for_log;
        message_footer();
        return FALSE;
    }
    /*Получаем данные из сессии если они есть*/
    if (isset($_SESSION[LANGUAGE_DESIRED_CODE_FOR_USER])) {
        $language_desired_code = $_SESSION[LANGUAGE_DESIRED_CODE_FOR_USER];
    }
    if (isset($_SESSION[DEBUGGING_MODE_FOR_USER])) {
        $debugging_mode = $_SESSION[DEBUGGING_MODE_FOR_USER];
    }
    if (isset($_SESSION[NOTICE_MODE_FOR_USER])) {
        $notice_mode = $_SESSION[NOTICE_MODE_FOR_USER];
    }
    if (isset($_SESSION[HELP_MODE_FOR_USER])) {
        $help_mode = $_SESSION[HELP_MODE_FOR_USER];
    }
    if (isset($_SESSION[CURRENCY_DESIRED_CODE_FOR_USER])) {
        $currency_desired_code = $_SESSION[CURRENCY_DESIRED_CODE_FOR_USER];
    }
    if (isset($_SESSION[COUNTRY_DESIRED_CODE_FOR_USER])) {
        $country_desired_code = $_SESSION[COUNTRY_DESIRED_CODE_FOR_USER];
    }


/*Отступ*/
    /*Временно*/
    /*$debugging_mode="yes";*/
    if ($debugging_mode === "yes") {
        echo "<br>".translation_text("Работает функция", "ru", $language_desired_code, __FILE__, __LINE__, "13994") . ": ".__FUNCTION__."() <br>".PHP_EOL;
    }


/*Отступ*/
    /*Количество записей, которые будут выводиться на одной странице*/
    if (isset($_SESSION["attribute_number_item_on_page"])) {
        $attribute_number_item_on_page = $_SESSION["attribute_number_item_on_page"];
        $number_records_on_one_page = $attribute_number_item_on_page;
        if ($debugging_mode === "yes") {
            echo translation_text("Получена из сессии переменная", "ru", $language_desired_code, __FILE__, __LINE__, "14081") . ": <br>".PHP_EOL;
            echo "attribute_number_item_on_page: $attribute_number_item_on_page <br>".PHP_EOL;
        }
    } else {
        $number_records_on_one_page = NUMBER_RECORDS_ON_ONE_PAGE_DEFAULT ;
        if ($debugging_mode === "yes") {
            echo translation_text("Не получена из сессии переменная", "ru", $language_desired_code, __FILE__, __LINE__, "14082") . " attribute_number_item_on_page. <br>".PHP_EOL;
            echo translation_text("Установлена переменная по умолчанию", "ru", $language_desired_code, __FILE__, __LINE__, "14083") . ": <br>".PHP_EOL;
            echo "number_records_on_one_page: $number_records_on_one_page <br>".PHP_EOL;
        }
    }
    /*Удаляем лишние ссылки на страницы - дублируются при переходе страниц*/
    $current_url = $_SERVER["REQUEST_URI"];
    $pattern = "|&page_number=(\d)|si";
    $replacement = "";
    $current_url = preg_replace($pattern, $replacement, $current_url);
    /*Количество ссылок, которые будут выводиться перед и после текущей страницы*/
    $number_links_before_and_after =3;


/*Отступ*/
    if (isset($_GET["page_number"])) {
        /* оставляем только цифры*/
        $page_number = $_GET["page_number"];
        $page_number = preg_replace("/[^0-9]/u", "", $page_number);
        /* Проверка на длину ввода*/
        if (mb_strlen($page_number,"UTF-8")>9) {
            $temp_time = time();
        $message_for_log = translation_text("Ошибка, сохраните номер", "ru", $language_desired_code, __FILE__, __LINE__, "13989") . ": " . $temp_time . " <br>".PHP_EOL;
            $message_for_log .= translation_text("Переменная", "ru", $language_desired_code, __FILE__, __LINE__, "13998") . ": $page_number <br>".PHP_EOL;
            $message_for_log .= translation_text("Количество знаков слишком велико", "ru", $language_desired_code, __FILE__, __LINE__, "13999") . ". <br>".PHP_EOL;

            $message_for_log .= translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": " . __FUNCTION__. "() <br>".PHP_EOL;
            $message_for_log .= translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Файл", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __FILE__ . " <br>".PHP_EOL;
                    if(!write_message_in_log_error($message_for_log))
        {
            if ($notice_mode=="yes") {
            echo "Mistake with message, inform administrator, please<br>".PHP_EOL;

            echo "Function: ".__FUNCTION__."() <br>".PHP_EOL;
            echo "Line: " . __LINE__ . " <br>".PHP_EOL;
            }
        }
            if ($notice_mode=="yes") {
                message_top();
                echo $message_for_log;
                message_footer();
            }
            return FALSE;
        }
        if (mb_strlen($page_number,"UTF-8")<1) {
            $temp_time = time();
        $message_for_log = translation_text("Ошибка, сохраните номер", "ru", $language_desired_code, __FILE__, __LINE__, "13989") . ": " . $temp_time . " <br>".PHP_EOL;
            $message_for_log .= translation_text("После очистки переменной количество знаков слишком мало или введены не цифры", "ru", $language_desired_code, __FILE__, __LINE__, "14000") . ". <br>".PHP_EOL;

            $message_for_log .= translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": " . __FUNCTION__. "() <br>".PHP_EOL;
            $message_for_log .= translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Файл", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __FILE__ . " <br>".PHP_EOL;
                    if(!write_message_in_log_error($message_for_log))
        {
            if ($notice_mode=="yes") {
            echo "Mistake with message, inform administrator, please<br>".PHP_EOL;

            echo "Function: ".__FUNCTION__."() <br>".PHP_EOL;
            echo "Line: " . __LINE__ . " <br>".PHP_EOL;
            }
        }
            if ($notice_mode=="yes") {
                message_top();
                echo $message_for_log;
                message_footer();
            }
            return FALSE;
        }
    } else {
        $page_number = 1;
    }
    /*Если получен параметр $page_number = 0, то выводим меняем на 1*/
    if ($page_number<1){
        $page_number=1;
       }


/*Отступ*/
    /*get_attribute_page_number($category_group_id_attribute)*/
    /* Считаем все записи*/
    $query = "";
    if ($category_group_id_attribute < INT_VALUE_DEFAULT) {
        $query = "SELECT attribute_id FROM attributes WHERE category_group_id = "$category_group_id_attribute"";
    } else {
        $query = "SELECT attribute_id FROM attributes";
    }
    $result = $mysqli->query($query);
    if (!$result) {
        $temp_time = time();
        $message_for_log = translation_text("Ошибка, сохраните номер", "ru", $language_desired_code, __FILE__, __LINE__, "13989") . ": " . $temp_time . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Отклонён запрос в базу", "ru", $language_desired_code, __FILE__, __LINE__, "14001") . ": $query <br>".PHP_EOL;

        $message_for_log .= translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": " . __FUNCTION__. "() <br>".PHP_EOL;
        $message_for_log .= translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Файл", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __FILE__ . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Описание ошибки mysqli", "ru", $language_desired_code, __FILE__, __LINE__, "14002") . ": " . $mysqli->error . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Код ошибки mysqli", "ru", $language_desired_code, __FILE__, __LINE__, "14003") . ": " . $mysqli->errno . " <br>".PHP_EOL;
        $message_for_log .= translation_text("Код состояния SQLSTATE", "ru", $language_desired_code, __FILE__, __LINE__, "14004") . ": " . $mysqli->sqlstate . " <br>".PHP_EOL;
        $message_for_notice = translation_text("Ошибка, сохраните номер", "ru", $language_desired_code, __FILE__, __LINE__, "13989") . ": " . time() . " <br>".PHP_EOL;
        $message_for_notice .= translation_text("Отклонён запрос в базу, подробности смотрите в логах", "ru", $language_desired_code, __FILE__, __LINE__, "14005") . ". <br>".PHP_EOL;

        $message_for_notice .= translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": " . __FUNCTION__. "() <br>".PHP_EOL;
        $message_for_notice .= translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
                if(!write_message_in_log_error($message_for_log))
        {
            if ($notice_mode=="yes") {
            echo "Mistake with message, inform administrator, please<br>".PHP_EOL;

            echo "Function: ".__FUNCTION__."() <br>".PHP_EOL;
            echo "Line: " . __LINE__ . " <br>".PHP_EOL;
            }
        }
        if ($notice_mode=="yes") {
            message_top();
            echo $message_for_notice;
            message_footer();
        }
        if ($debugging_mode=="yes") {
            message_top();
            echo $message_for_log;
            message_footer();
        }
        return FALSE;
    } else {
        if ($debugging_mode=="yes") {
                        echo translation_text("Запрос в базу успешно выполнен", "ru", $language_desired_code, __FILE__, __LINE__, "14013") . ". <br>".PHP_EOL;

            echo translation_text("Функция", "ru", $language_desired_code, __FILE__, __LINE__, "13991") . ": " . __FUNCTION__ . "<br>".PHP_EOL;
            echo translation_text("Строка", "ru", $language_desired_code, __FILE__, __LINE__, "13992") . ": " . __LINE__ . " <br>".PHP_EOL;
        }
    }
    /*Количество записей*/
    $number_all_records = mysqli_num_rows($result);
/*Очищаем $result только для SELECT, SHOW, DESCRIBE or EXPLAIN*/
    mysqli_free_result($result);
    /*Считаем количество страниц, чтобы знать сколько ссылок выводить*/
    $page_numbers = $number_all_records/$number_records_on_one_page;
    /* Округляем полученное число страниц в большую сторону*/
    $page_numbers = ceil($page_numbers);
    /* Здесь мы увеличиваем число страниц на единицу чтобы начальное атрибут было*/
    /* равно единице, а не нулю. Что-бы атрибут page_number= совпадало с цифрой в ссылке, которую будут видеть посетители*/
    $page_numbers++;
    /* Если атрибут page_number= больше числа страниц, то выводим первую страницу*/
    if ($page_number>$page_numbers) {
        $page_number = 1;
        /* Текст с номером текущей страницы*/
        /*echo "<strong style="color: #010753">Страница № " . $page_number . "</strong><br><br>";*/
    }
    /* Переменная $get_records_start указывает с какой записи начинать выводить данные.*/
    /* Если переменная не определена, то будем выводим с начала, с нулевой записи*/
    if (!isset($get_records_start)) {
        $get_records_start=0;
    }
    echo "<!-- start get_attribute_page_number($category_group_id_attribute) -->".PHP_EOL;
    /* Чтобы у нас атрибут page_number= в адресе ссылки совпадало с номером*/
    /* страницы мы его увеличили на единицу при выводе ссылок, а*/
    /* при запросе в базу уменьшаем чтобы было правильно.*/
    $get_records_start=--$page_number*$number_records_on_one_page;
    if ($page_numbers < 3 ) {
        if ($number_all_records === 0) {
            echo translation_text("Страниц нет", "ru", $language_desired_code, __FILE__, __LINE__, "14084") . ". ".PHP_EOL;
        } else {
            echo translation_text("Страница", "ru", $language_desired_code, __FILE__, __LINE__, "14085") . ": ".PHP_EOL;
        }
    } else {
        echo translation_text("Страницы", "ru", $language_desired_code, __FILE__, __LINE__, "14086") . ": ".PHP_EOL;
    }
    /* Ссылки "назад" и "на первую страницу" начало*/
    if ($page_number>=1) {
        /* Атрибут page_number= для первой страницы всегда равно единице, поэтому так и пишем*/
        echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=1"><<</a> &nbsp; ".PHP_EOL;
        /* Так как мы количество страниц до этого уменьшили на единицу, то для того, чтобы попасть на предыдущую страницу,*/
        /* не нужно ничего вычислять*/
        echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".$page_number."">< </a> &nbsp; ".PHP_EOL;
    }
    /* Ссылки "назад" и "на первую страницу" конец*/
    /*Вывод номеров страниц начало*/
    /* Номер текущей страницы = $page_number+1*/
    $current_page = $page_number+1;
    /* Номер страницы с которой начинается вывод*/
    $start_page = $current_page-$number_links_before_and_after ;
    /* Номер страницы на которой заканчивается вывод*/
    $end_page = $current_page+$number_links_before_and_after ;
    /* Выводим ссылки на все страницы*/
    /* Начальное число $j в нашем случае должно равнятся единице, а не нулю*/
    for ($j = 1; $j<$page_numbers; $j++) {
        /* Выводим ссылки только в том случае, если их номер больше или равен*/
        /* начальному значению, и меньше или равен конечному значению*/
        if ($j>=$start_page && $j<=$end_page) {
            /* Ссылка на текущую страницу выделяется жирным  echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".$j.""><strong style="color: #002334">" . $j . "</strong></a> &nbsp; ";*/
            if ($j==($page_number+1)) {
                echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".$j."">".$j."</a> &nbsp; ".PHP_EOL;
            } else {
                echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".$j."">".$j."</a> &nbsp; ".PHP_EOL;
            }
        }
    }
    /*Вывод номеров страниц конец*/
    /* Ссылки "вперед" и "на последнюю страницу" начало*/
    if ($j>$page_number && ($page_number+2)<$j) {
        /* Чтобы попасть на следующую страницу нужно увеличить $page_numbers на 2*/
        echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".($page_number+2).""> ></a> &nbsp; ".PHP_EOL;
        /* Так как у нас $j = количество страниц + 1, то теперь уменьшаем его на единицу и получаем ссылку на последнюю страницу*/
        echo "<a class="sample-page-link-12px-600-display-inline-block" href="".$current_url."&page_number=".($j-1)."">>></a> &nbsp; ".PHP_EOL;
    }
    /* Ссылки "вперед" и "на последнюю страницу" конец*/
    echo "<!-- end get_attribute_page_number($category_group_id_attribute) -->".PHP_EOL;
/*Вносим результат в массив*/
    $array_page_number = array(
    "number_records_on_one_page" => "$number_records_on_one_page",
    "get_records_start" => $get_records_start);
    return $array_page_number;
}
/*end get_attribute_page_number($category_group_id_attribute)*/




 

Образец части файла на С для ардуино, похоже на PHP?

Код



    void timersTick() {   // каждую секунду
  // получаем время
  realTime[0] = rtc.getHours();
  realTime[1] = rtc.getMinutes();
  realTime[2] = rtc.getSeconds();
  getDay();   // получить номер дня
  uptime += (float)0.0000115741;   // аптайм у нас в сутках! 1/(24*60*60)

  for (byte curChannel = 0; curChannel < 10; curChannel++) {
    activeChannel = loadChannel(curChannel);
    if (activeChannel.state                                                             // если канал активен (on/off)
        && (curChannel >= 7 || ((curChannel < 7 || !activeChannel.type) && activeChannel.relayType != 2) ) ) {   // и для всех кроме ОБЩИХ реле
      switch (activeChannel.mode) {
        case 0:   // ---------------------- если таймер ----------------------
          if (millis() - timerMillis[curChannel] >= activeChannel.period * 1000
              && channelStates[curChannel] != activeChannel.direction) {
            timerMillis[curChannel] = millis();
            channelStates[curChannel] = activeChannel.direction;
          }
          if (millis() - timerMillis[curChannel] >= activeChannel.work * 1000
              && channelStates[curChannel] == activeChannel.direction) {
            channelStates[curChannel] = !activeChannel.direction;
          }
          break;
        case 1:   // ---------------------- если таймер RTC ----------------------
          if (realTime[2] == 0 || realTime[2] == 1) {                               // проверка каждую минуту (в первые две секунды, на всякий случай)!
            if (activeChannel.impulsePrd < 6) {                              // если минутные периоды
              if (channelStates[curChannel] != activeChannel.direction) {    // если канал ВЫКЛЮЧЕН
                byte waterTime = 0;                                                 // начало проверки времени с 0 минуты
                for (byte j = 0; j < 60 / impulsePrds[activeChannel.impulsePrd]; j++) {
                  if (realTime[1] == waterTime) {
                    channelStates[curChannel] = activeChannel.direction;     // ВКЛЮЧАЕМ
                    timerMillis[curChannel] = millis();                             // взводим таймер
                  }
                  waterTime += impulsePrds[activeChannel.impulsePrd];
                }
              }
            } else if (activeChannel.impulsePrd < 13) {                        // если часовые периоды
              if (realTime[1] == 0 && (realTime[2] == 0 || realTime[2] == 1)) {       // проверка в первую минуту часа!
                if (channelStates[curChannel] != activeChannel.direction) {    // если ВЫКЛЮЧЕН
                  byte waterTime = activeChannel.startHour;                    // начало проверки времени со стартового часа
                  for (byte j = 0; j < 24 / impulsePrds[activeChannel.impulsePrd]; j++) {
                    if (waterTime < 24) {
                      if (realTime[0] == waterTime) {
                        channelStates[curChannel] = activeChannel.direction;   // ВКЛЮЧАЕМ
                        timerMillis[curChannel] = millis();                           // взводим таймер
                      }
                    } else {
                      if (realTime[0] == waterTime - 24) {
                        channelStates[curChannel] = activeChannel.direction;   // ВКЛЮЧАЕМ
                        timerMillis[curChannel] = millis();                           // взводим таймер
                      }
                    }
                    waterTime += impulsePrds[activeChannel.impulsePrd];
                  }
                }
              }
            } else {        // суточные периоды
              if (realTime[1] == 0 && (realTime[2] == 0 || realTime[2] == 1)) {       // проверка в первую минуту часа!
                if (channelStates[curChannel] != activeChannel.direction) {    // если ВЫКЛЮЧЕН
                  if (thisDay % impulsePrds[activeChannel.impulsePrd] == 0  // если попали в день
                      && realTime[0] == activeChannel.startHour) {             // и час
                    channelStates[curChannel] = activeChannel.direction;   // ВКЛЮЧАЕМ
                    timerMillis[curChannel] = millis();                           // взводим таймер
                  }
                }
              }
            }
          }

          if (channelStates[curChannel] == activeChannel.direction                     // если ВКЛЮЧЕН
              && millis() - timerMillis[curChannel] >= activeChannel.work * 1000) {    // И отработал время РАБОТА
            channelStates[curChannel] = !activeChannel.direction;                      // ВЫКЛЮЧАЕМ
          }
          break;
        case 2:   // ---------------------- если неделька ----------------------
          if (checkDay(curChannel)) channelStates[curChannel] = activeChannel.direction;     // включились до stop hour
          else channelStates[curChannel] = !activeChannel.direction;    // выключились до следующего start hour
          break;
        case 3:   // ---------------------- если датчик ----------------------
          if (millis() - timerMillis[curChannel] >= activeChannel.sensPeriod * 1000L) {
            timerMillis[curChannel] = millis();

            /*
              флаг и laststate на каждый канал, +20 байт
              если (laststate != checkHysteresis) {
                если (!флаг) {
                  сброс таймера
                  флаг = 1
                } иначе {
                  laststate = checkHysteresis
                  стейт меняем
                  флаг = 0
                }
              }
            */
            byte result = checkHysteresis(curChannel);
            if (result == 1) channelStates[curChannel] = activeChannel.direction;
            else if (result == 2) channelStates[curChannel] = !activeChannel.direction;
          }
          break;
        case 4:   // ---------------------- если ПИД ----------------------
          break;
        case 5:   // -------------------- если рассвет --------------------
#if (USE_DAWN == 1)
          if ((realTime[2] % 5) == 0 || startFlagDawn) {    // проверка на рассвет каждые 5 секунд
            checkDawn(curChannel);
          }
#endif
          break;
      }
      // если week глобальный, выключить канал в нерабочее время!
      if (activeChannel.global && !checkDay(curChannel)) channelStates[curChannel] = !activeChannel.direction;
    }
  }
  startFlagDawn = false;
  // --- применяем ---

  // реле
  boolean atLeastOneValve = false;                              // флаг "хотя бы одного" клапана

  for (byte relay = 0; relay < 9; relay++) {
    if ((relay == 7 && !SERVO1_RELAY) || (relay == 8 && !SERVO2_RELAY)) continue;
    channelsStruct thisCh = loadChannel(relay);
    if (thisCh.state && thisCh.mode < 4) {
      if (thisCh.relayType == 1                                   // если реле - КЛАПАН
          && channelStates[relay] == thisCh.direction)            // и он ВКЛЮЧЕН
        atLeastOneValve = true;                                   // запоминаем, что нужно включить общий канал
      digitalWrite(relayPins[relay], channelStates[relay]);       // включаем/выключаем все реле типов РЕЛЕ и КЛАПАН
    }
  }

  for (byte relay = 0; relay < 9; relay++) {
    if ((relay == 7 && !SERVO1_RELAY) || (relay == 8 && !SERVO2_RELAY)) continue;
    channelsStruct thisCh = loadChannel(relay);
    if (thisCh.state && thisCh.relayType == 2 && thisCh.mode < 4) {  // только для ОБЩИХ каналов реле, кроме ПИД и рассвета
      if (atLeastOneValve) channelStates[relay] = thisCh.direction;  // включить общий
      else channelStates[relay] = !thisCh.direction;                 // выключить общий
      digitalWrite(relayPins[relay], channelStates[relay]);          // применить
    }
  }

#if (PID_AUTOTUNE == 1)
  tunePID();
  if (tunerSettings.channel > 0) {
    if (tunerSettings.manual) {
      pwmVal[tunerSettings.channel - 1] = tunerSettings.steady;
    } else {
      if (tunerSettings.tuner) pwmVal[tunerSettings.channel - 1] = tuner.value;
    }
  }
#endif



Смотреть лицензионный договор>>