Я новичок, совсем недавно начал изучать JavaScript, HTML, CSS и вот я web-администратор в офисе.

Все началось с обычного замечания на утренней планерке — генеральный директор сказал мне: «Видел? На сайте, сумма в рублях за доллар соответствует завтрашнему дню, а должна быть еще сегодняшняя!» Все товары, рекламные площадки, клиенты, заказы — все это завязано на валюте, которая обновляется на сутки раньше, чем должна.

И тут я понял что меня ждет очень сложная и почти не выполнимая задача. Ведь я совсем не секу в PHP и с Opencart только месяц как знаком. «Сделаю, конечно!», ответил я, не бить же в грязь лицом.

Как я с этим справился? 

Опишу ситуацию как я её видел:

У меня есть интернет магазин, на Opencart 3 версии. Товары на нем отображаются как в рублях, так и в долларах. Каким-то волшебным, магическим образом, интернет магазин берет котировки валют и отображает на экране + записывает и подстраивает цены всех товаров под актуальный курс валют. Как это происходит еще предстояло узнать.

На сайте ЦБ РФ https://www.cbr.ru/ курс на следующий день известен уже в 14.00 ежедневно. И в моем интернет магазине, почему-то валюта обновляется в промежутке с 14.00 до 16.00 — это все что было мне известно.

Неделя №1 поиск и знакомство

Первое что я сделал, зашел на сайт, кликнул правой кнопкой просмотреть код и узнал какой класс отвечает за вывод валюты на экран.

Меню после клика правой кнопкой на элемент сайта
Меню после клика правой кнопкой на элемент сайта

Далее начал шерстить по всем файлам, где только находил данный класс и пытался хоть что-нибудь понять. Файл за файлом я находил, открывал, искал, запоминал. Но кроме массива строк кода, не видел ничего. Ответов было 0.

Списки кода в котором сложно что то понять и разобраться с наскока
Списки кода в котором сложно что то понять и разобраться с наскока

Позже, я нашел нужную мне функцию, но что с ней делать — не представлял даже. Так как я единственный разработчик в компании, мне не с кем было посоветоваться. Почему бы не написать в ЦБ РФ? По-моему отличная идея! Пишу — получаю примерно такой ответ: «Не понятно почему у Вас обновляется валюта раньше чем нужно, попробуйте вычесть из настоящего времени часы, чтобы подгадать обновление валюты» (с) разработчик ЦБ РФ

Нормально? Скинул мне ссылку на туториалы на сайте, про то как настраиваются XML запросы http://www.cbr.ru/development/sxml/

Следующие несколько дней я тестил собственные разработки. Создал новую переменную и присвоил ей значение (данный момент минус 7 часов)

кусочек функции где мы обращаемся к ЦБ РФ за XML форматом валют
кусочек функции где мы обращаемся к ЦБ РФ за XML форматом валют

А скрипты ЦБ РФ говорят, что бы получить конкретные котировки от определенной даты, то пожалуйста, запрашивайте по дате.

Один из примеров на сайте ЦБ РФ
Один из примеров на сайте ЦБ РФ

Если скрипт http://www.cbr.ru/scripts/XML_daily.asp 

Файл XML от ЦБ РФ с котировками валют
Файл XML от ЦБ РФ с котировками валют

вызывает XML файл с валютами всего мира, то придерживаясь логики, я свою переменную добавляю в конец, вместо конкретной даты req=02/02/2000 и будет мне счастье. НО не тут то было. 

Все это не сработало и никак не хотело чинить вывод валюты.

Неделя №2 обращение за помощью

Решил написать на форум, спросить мнения экспертов из интернета. В силу своей неопытности, я криво описал задачу и получал неправильные ответы на неправильные вопросы.

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

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

 Функция для определения времени
Функция для определения времени

После необходимо было прописать новые условия в вызове в другом файле, что бы совместить все вместе

Функция проверки времени и вызова авто обновления
Функция проверки времени и вызова авто обновления

Добавляем функцию в условия проверки перед запуском

Применил

До 23.00 валюта не обновлялась и я думал что это победа, что вот-вот в 23.55.55 она обновится и я гордо расскажу о решении этой задачи!

Ничего не вышло

Утром пришлось откатывать все настройки назад. Потому что обновление не сработало вовсе. В этот момент я понял, что нужно начинать поиски заново.

Неделя №3 разгадка где-то рядом

Написал на хостинг администраторам. Что мне нужно запустить CRON задачу на файл. Но какой конкретно, я не знал. Поэтому пробовал всю неделю, просил хоста запустить на разные php файлы вызов.

CRON это планировщик заданий
CRON это планировщик заданий

Параллельно с тестированием настройки крона я стал активно изучать Opencart на просторах YouTube. Начал смотреть видео про MVC и как там все устроено в целом.

Например, теперь, мне понятно, что система ООП (объектно ориентированного программирования) в php для CMS системы Opencart строится по системе Model View Controller. Когда они обращаются друг к другу и взаимодействуют между собой.

Спасибо каналу «Opencart» там все доходчиво объясняется автором канала и показывается на примерах.

В самом конце 3 недели, примерно в пятницу, написал в комментариях на ютуб канале о своей проблеме с валютой и подумал, вдруг кто-то даст мне подходящий совет.

Комментарий — просьба о помощи
Комментарий — просьба о помощи

Оттуда я узнал, что на Opencart мы с помощью отключения ЧПУ (человеко подобного url) можем смотреть путь наших файлов в адресной строке.За счет этих знаний можем находить нужные нам файлы в проекте.

Код отвечающий за обновление
Код отвечающий за обновление

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

Обращение по этой схеме идет к папке Model и если там есть функция refresh() то она вызывается и отправляет ответ в папку Controller, которая в свою очередь уже приказывает папке View отобразить новые данные для пользователя.

MVC модель для CMS Opencart
MVC модель для CMS Opencart

Неделя №4 кто ищет тот всегда найдет

В понедельник утром, отчаявшись и окончательно запутавшись, я получаю видео ролик, на ютуб канале где писал просьбу о помощи. Это видео на 30 минут с пояснением как нужно подготовить файл и запустить его через CRON. Дабы выполнение скрипта авто обновления валюты работало строго как нужно мне.

Новые знания снова пришли ко мне в руки и я с удовольствием их впитал. Изучив все файлы, содержащие нужные мне 4 строчки кода, я понял, что обновление валюты запускается в 2-х случаях. Когда я или кто-то еще заходит на страницу админ панели в Opencart, некий dashboard. А второй момент, когда мы заходим в настройки в той же админ панели.

Как будто срабатывает кнопка обновить, при входе на данные страницы.

настройки -> локализация -> валюты
настройки -> локализация -> валюты

Так как все работает на взаимодействии MVC мне нужно было добавить новую функцию в файл по пути controller/common/home.php например

Как нужно было написать новую функцию что бы починить валюту
Как нужно было написать новую функцию что бы починить валюту
интерфейс CRON планировщика
интерфейс CRON планировщика

И в середине 4 недели, проверив работоспособность данной схемы, я наконец смог выдохнуть и с гордостью заявить, что вопрос решен! Валюта обновляется в 12 ночи, как мне необходимо и ошибки перестали сыпаться.

  1. Получается, валюта на сайт подтягивалась с сайта ЦБ РФ каждый раз, когда кто-то заходил в админ панель из менеджеров или я сам. Поэтому она и обновлялась с 14 до 16 часов вечера. 

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

  3. Мы же с помощью CRON смогли добиться вызова этой функции, будто кто-то нажимает за нас кнопку «обновить»

  4. Я закомментировал 2 вызова функции, чтобы не мешать работе скрипта, а галочку на авто обновление оставил включенной. Ведь по условиям скрипта, кнопка авто обновление — должна быть активна.

  5. Да, я все еще junior с маленьким опытом, но я на верном пути и пусть медленно, но верно двигаюсь вперед. Еще тысячи задач ждут меня впереди. И я очень этому рад!

Как итог

  • Учите базу и узнавайте как работает движок и его нюансы, как например Opencart;

  • Учитесь читать чужой код, даже если не разбираетесь в синтаксисе, обращайтесь к дополнительным источникам за знаниями (Youtube, habr, stackoverflow); 

  • Читайте про дополнительные помощники в вашей работе, CRON или что-либо еще;

  • Не бойтесь сложных задач, ведь только за счет них вы по настоящему растете

P.S.: Если у Вас похожая задача, но Вам сложно, пишите, помогу чем смогу.

Комментарии (16)


  1. raamid
    03.01.2023 19:46
    +11

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


    1. edogs
      03.01.2023 20:13
      +14

      Нужны как поучение.
      Ген.дир который спокойно ждет месяц исправления ошибки от которой "всё зависит"©.
      Отдел кадров, который решил взять единственным разработчиком джуна не по профилю.
      Разработчик который работает методом тыка вместо системного подхода.
      И так далее.
      Автору респект за отважное решение проблем, но в описанной ситуации буквально всё не так как должно быть.
      От души рекомендуем @serjJS найти контору где он будет одним из членов команды, и не старшим... Потому что желания и энтузиазма через край, но в такой ситуации и с таким подходом будет тратиться много времени даже на простейшие вещи, а неправильные (но сработавшие) практики будут закрепляться, а не исправляться.


  1. fekrado
    03.01.2023 22:13

    Прям себя узнаю , лет 10 назад ))


  1. FanatPHP
    03.01.2023 23:11
    +2

    В опенкарт свечку не держал, но сомневаюсь, что там MVC реализовано по той схеме, которая тут нарисована.
    Модель не должна сама с внешним миром коммуницировать. Для этого есть контроллер. поэтому стрелочка от модели должна вести обратно в контроллер, а из контроллера — во вью.


    А в целом, как я понял, проблем было две — понять, по какому принципу обновляется информация, и разобраться с кроном.


    Насчет ценности статьи для новичков я сомневаюсь. Для этого нужен особый талант. Надо вычитывать свое повествование как бы со стороны, и отмечать "провисания", когда что-то происходит без видимой связи с предыдущими событиями. К примеру, кроме пары невнятных картинок, статья никак не поясняет, а как, собственно, надо "подготовить файл", чтобы запустить его через CRON. Так что да — разве что как мотиватор.


    1. SerafimArts
      04.01.2023 15:16

      Модель не должна сама с внешним миром коммуницировать. Для этого есть контроллер. поэтому стрелочка от модели должна вести обратно в контроллер, а из контроллера — во вью.

      Из контроллера стрелочка только в модель должна вести. А изменения модели должны обновлять вью, связанный с этой моделью.


      Если же из контроллера стрелочка ведёт во вью, то это не MVC уже, а MVP (как например в Laravel или Symfony).


      1. FanatPHP
        05.01.2023 09:59

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


        1. SerafimArts
          05.01.2023 15:04

          Поэтому тот же Фабьен, если не путаю, предложил отказаться от аббревиатур в пользу определения "Request-Response Framework" для Симфони. Единственное что остаётся неизменным во всей этой чехорде из роутеров, миддлварей, эвентлистнеров, комманд басов и проч.


          Но на счёт теории… Ну вот MVVM из этого списка аббревиатур выделяется очень сильно.


          1. FanatPHP
            05.01.2023 15:08

            Ну в целом, если смотреть по картинкам, то MVP гораздо лучше иллюстрирует то, что мы используем в пыхе в силу особенностей его жизненного цикла. Хотя этот "презентер" явно притянут за уши. Никакой он не презентер, а самый обычный контроллер. Так что если говорить об аббревиатурах, то я бы оставил картинку от MVP, но назвал ее web-MVC :)


            1. SerafimArts
              05.01.2023 15:23

              В рамках терминологии GRASP презентер вполне может быть контроллером)


              1. FanatPHP
                05.01.2023 15:27

                Да может-то может, но ведь никто его так не называет.
                В той же Ларавле или Симфонии нету папки Presenters или классов AbstractPresenter :)


  1. diakin
    04.01.2023 00:26
    -1

    Если уж костылить, то надо было запоминать полученное значение валюты, но выводить его не сегодня, а завтра.
    И вообще, зачем брать актуальное значение по курсу ЦБ? Надо усреднять за несколько дней, если курс падает ( то есть цена продукта падает), наоборот, форсировать, если курс растет. То есть цена продукта должна расти резче, чем курс валюты и падать медленнее. Надо ж как-то страховаться! И контора таким образом заработает лишнюю пару баксов.


  1. s_f1
    04.01.2023 08:28

    Не знаю, что там автор гуглил 30 дней, но за 30 секунд находится это.


    1. FanatPHP
      04.01.2023 11:12

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


  1. papilaz
    04.01.2023 20:49

    Должно было так: день потратил как найти и оценить специалиста. Второй день: Заказал работу и оплатил три тысячи. Всё работает хорошо. Всё.


  1. UdarEC
    05.01.2023 02:28
    +1

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


  1. Ivan22
    05.01.2023 15:15
    -1

    И вроде должно стать все проще с опытом. Ан нет! Я вот имею 15 летний опыт в этом бизнесе, но вот прямо сейчас тоже потратил не меньше месяца на поиск (и еще потратится месяца 2 на имплементацию) нахождения нужного! курса валют в дебрях огромной корпорации