Я новичок, совсем недавно начал изучать 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 часов)
А скрипты ЦБ РФ говорят, что бы получить конкретные котировки от определенной даты, то пожалуйста, запрашивайте по дате.
Если скрипт http://www.cbr.ru/scripts/XML_daily.asp
вызывает XML файл с валютами всего мира, то придерживаясь логики, я свою переменную добавляю в конец, вместо конкретной даты req=02/02/2000 и будет мне счастье. НО не тут то было.
Все это не сработало и никак не хотело чинить вывод валюты.
Неделя №2 обращение за помощью
Решил написать на форум, спросить мнения экспертов из интернета. В силу своей неопытности, я криво описал задачу и получал неправильные ответы на неправильные вопросы.
Почему-то я думал, что мне необходимо запускать функцию в определенное время и это решение показалось верным, но я пока не понимал какую же функцию и как запускать.
Совершенно наивно, без опыта и понимания о чем идет речь. Выудил на форуме помощь в виде составления функции и привязки ко времени, которую необходимо было поместить в некий файл помощник
После необходимо было прописать новые условия в вызове в другом файле, что бы совместить все вместе
Добавляем функцию в условия проверки перед запуском
Применил
До 23.00 валюта не обновлялась и я думал что это победа, что вот-вот в 23.55.55 она обновится и я гордо расскажу о решении этой задачи!
Ничего не вышло
Утром пришлось откатывать все настройки назад. Потому что обновление не сработало вовсе. В этот момент я понял, что нужно начинать поиски заново.
Неделя №3 разгадка где-то рядом
Написал на хостинг администраторам. Что мне нужно запустить CRON задачу на файл. Но какой конкретно, я не знал. Поэтому пробовал всю неделю, просил хоста запустить на разные php файлы вызов.
Параллельно с тестированием настройки крона я стал активно изучать Opencart на просторах YouTube. Начал смотреть видео про MVC и как там все устроено в целом.
Например, теперь, мне понятно, что система ООП (объектно ориентированного программирования) в php для CMS системы Opencart строится по системе Model View Controller. Когда они обращаются друг к другу и взаимодействуют между собой.
Спасибо каналу «Opencart» там все доходчиво объясняется автором канала и показывается на примерах.
В самом конце 3 недели, примерно в пятницу, написал в комментариях на ютуб канале о своей проблеме с валютой и подумал, вдруг кто-то даст мне подходящий совет.
Оттуда я узнал, что на Opencart мы с помощью отключения ЧПУ (человеко подобного url) можем смотреть путь наших файлов в адресной строке.За счет этих знаний можем находить нужные нам файлы в проекте.
Новые знания, приобретенные с помощью ютуб канала и 3 недель мучений с валютой, помогли мне понять, что основную манипуляцию нужно проводить с данной проверкой.
Обращение по этой схеме идет к папке Model и если там есть функция refresh() то она вызывается и отправляет ответ в папку Controller, которая в свою очередь уже приказывает папке View отобразить новые данные для пользователя.
Неделя №4 кто ищет тот всегда найдет
В понедельник утром, отчаявшись и окончательно запутавшись, я получаю видео ролик, на ютуб канале где писал просьбу о помощи. Это видео на 30 минут с пояснением как нужно подготовить файл и запустить его через CRON. Дабы выполнение скрипта авто обновления валюты работало строго как нужно мне.
Новые знания снова пришли ко мне в руки и я с удовольствием их впитал. Изучив все файлы, содержащие нужные мне 4 строчки кода, я понял, что обновление валюты запускается в 2-х случаях. Когда я или кто-то еще заходит на страницу админ панели в Opencart, некий dashboard. А второй момент, когда мы заходим в настройки в той же админ панели.
Как будто срабатывает кнопка обновить, при входе на данные страницы.
Так как все работает на взаимодействии MVC мне нужно было добавить новую функцию в файл по пути controller/common/home.php например
И в середине 4 недели, проверив работоспособность данной схемы, я наконец смог выдохнуть и с гордостью заявить, что вопрос решен! Валюта обновляется в 12 ночи, как мне необходимо и ошибки перестали сыпаться.
Получается, валюта на сайт подтягивалась с сайта ЦБ РФ каждый раз, когда кто-то заходил в админ панель из менеджеров или я сам. Поэтому она и обновлялась с 14 до 16 часов вечера.
Пример с указанием отдельной переменной и привязке к времени не сработал, так как вызов функции происходит при заходе в админ панель и никак иначе.
Мы же с помощью CRON смогли добиться вызова этой функции, будто кто-то нажимает за нас кнопку «обновить»
Я закомментировал 2 вызова функции, чтобы не мешать работе скрипта, а галочку на авто обновление оставил включенной. Ведь по условиям скрипта, кнопка авто обновление — должна быть активна.
Да, я все еще junior с маленьким опытом, но я на верном пути и пусть медленно, но верно двигаюсь вперед. Еще тысячи задач ждут меня впереди. И я очень этому рад!
Как итог
Учите базу и узнавайте как работает движок и его нюансы, как например Opencart;
Учитесь читать чужой код, даже если не разбираетесь в синтаксисе, обращайтесь к дополнительным источникам за знаниями (Youtube, habr, stackoverflow);
Читайте про дополнительные помощники в вашей работе, CRON или что-либо еще;
Не бойтесь сложных задач, ведь только за счет них вы по настоящему растете
P.S.: Если у Вас похожая задача, но Вам сложно, пишите, помогу чем смогу.
Комментарии (16)
FanatPHP
03.01.2023 23:11+2В опенкарт свечку не держал, но сомневаюсь, что там MVC реализовано по той схеме, которая тут нарисована.
Модель не должна сама с внешним миром коммуницировать. Для этого есть контроллер. поэтому стрелочка от модели должна вести обратно в контроллер, а из контроллера — во вью.А в целом, как я понял, проблем было две — понять, по какому принципу обновляется информация, и разобраться с кроном.
Насчет ценности статьи для новичков я сомневаюсь. Для этого нужен особый талант. Надо вычитывать свое повествование как бы со стороны, и отмечать "провисания", когда что-то происходит без видимой связи с предыдущими событиями. К примеру, кроме пары невнятных картинок, статья никак не поясняет, а как, собственно, надо "подготовить файл", чтобы запустить его через CRON. Так что да — разве что как мотиватор.
SerafimArts
04.01.2023 15:16Модель не должна сама с внешним миром коммуницировать. Для этого есть контроллер. поэтому стрелочка от модели должна вести обратно в контроллер, а из контроллера — во вью.
Из контроллера стрелочка только в модель должна вести. А изменения модели должны обновлять вью, связанный с этой моделью.
Если же из контроллера стрелочка ведёт во вью, то это не MVC уже, а MVP (как например в Laravel или Symfony).
FanatPHP
05.01.2023 09:59Ну я всегда путаюсь в этих формальных оперделениях. Мне кажется, что они все больше теоретические. Например, ни в одном из них нету роутера.
SerafimArts
05.01.2023 15:04Поэтому тот же Фабьен, если не путаю, предложил отказаться от аббревиатур в пользу определения "Request-Response Framework" для Симфони. Единственное что остаётся неизменным во всей этой чехорде из роутеров, миддлварей, эвентлистнеров, комманд басов и проч.
Но на счёт теории… Ну вот MVVM из этого списка аббревиатур выделяется очень сильно.
FanatPHP
05.01.2023 15:08Ну в целом, если смотреть по картинкам, то MVP гораздо лучше иллюстрирует то, что мы используем в пыхе в силу особенностей его жизненного цикла. Хотя этот "презентер" явно притянут за уши. Никакой он не презентер, а самый обычный контроллер. Так что если говорить об аббревиатурах, то я бы оставил картинку от MVP, но назвал ее web-MVC :)
SerafimArts
05.01.2023 15:23В рамках терминологии GRASP презентер вполне может быть контроллером)
FanatPHP
05.01.2023 15:27Да может-то может, но ведь никто его так не называет.
В той же Ларавле или Симфонии нету папки Presenters или классов AbstractPresenter :)
diakin
04.01.2023 00:26-1Если уж костылить, то надо было запоминать полученное значение валюты, но выводить его не сегодня, а завтра.
И вообще, зачем брать актуальное значение по курсу ЦБ? Надо усреднять за несколько дней, если курс падает ( то есть цена продукта падает), наоборот, форсировать, если курс растет. То есть цена продукта должна расти резче, чем курс валюты и падать медленнее. Надо ж как-то страховаться! И контора таким образом заработает лишнюю пару баксов.
papilaz
04.01.2023 20:49Должно было так: день потратил как найти и оценить специалиста. Второй день: Заказал работу и оплатил три тысячи. Всё работает хорошо. Всё.
UdarEC
05.01.2023 02:28+1Читал как страшный ужастик на одном дыхании, желаю крепкого здоровья автору.
Ivan22
05.01.2023 15:15-1И вроде должно стать все проще с опытом. Ан нет! Я вот имею 15 летний опыт в этом бизнесе, но вот прямо сейчас тоже потратил не меньше месяца на поиск (и еще потратится месяца 2 на имплементацию) нахождения нужного! курса валют в дебрях огромной корпорации
raamid
На мой взгляд такие статьи нужны. Причем даже не столько как источник информации, а чтобы новички понимали, что они не одни в этом мире и где-то есть человек, который тоже ничего не понимает но пытается что-то с этим делать.
edogs
Нужны как поучение.
Ген.дир который спокойно ждет месяц исправления ошибки от которой "всё зависит"©.
Отдел кадров, который решил взять единственным разработчиком джуна не по профилю.
Разработчик который работает методом тыка вместо системного подхода.
И так далее.
Автору респект за отважное решение проблем, но в описанной ситуации буквально всё не так как должно быть.
От души рекомендуем @serjJS найти контору где он будет одним из членов команды, и не старшим... Потому что желания и энтузиазма через край, но в такой ситуации и с таким подходом будет тратиться много времени даже на простейшие вещи, а неправильные (но сработавшие) практики будут закрепляться, а не исправляться.