Модули

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #21 korshunov » 04.03.2020, 14:33

zyxer писал(а):На днях была на сайте проблема, пошел выключать по очереди модули, и сразу вычислил какой из них создаёт проблему. Как минимум проблемное место нашлось быстро, при том, этот модуль можно вообще в данный момент выключить и когда он будет исправлен уже обновить на сайте. Но сейчас работать с этим модулем нельзя, ломается (в очень специфических условиях) важный функционал. Такие действия в экстренных условиях может сделать даже админ магазина. Мне кажется это преимущество...

Надо бы различать точно разные моменты.

То, что Вы описали, в экстренных условиях работает хорошо. И это есть некоторое преимущество.

А вот выдвинутый Вами ранее тезис

OkayCMS писал(а):Когда делаешь модуль, не страшно что сайт сломаешь и нужно будет разбираться в чужом коде. Максимум что может не работать - это твой модуль.

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

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

А тот факт, что Вы, как ведущий разработчик, на исправление этого указанного ранее недостатка внимание обращать не спешите, а вместо того пытаетесь свернуть на общие разговоры и подмену конкретного вопроса - уже недостаток посерьезнее. А надо бы всего лишь немного поработать, чтоб сказка стала былью...

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #22 zyxer » 05.03.2020, 13:04

Под "Когда делаешь модуль" вероятнее всего имелось ввиду не разрабатывать модуль на проде, а разработка его таки на локалке, и когда он будет доставлен на прод (уже готовый) может выясниться что в нём есть баг (как пример я писал выше), тогда можно этот модуль выключить, обновить и снова включить.

Давайте попробую пояснить как модуль инициализируется.
При запуске системы все установленные модули выполняют свой метод Init::init(), он для того и сделан, чтобы выполняться при каждом запуске системы.
Если разработчик модуля считает что в методе init() есть что-то такое, что должно выполняться не в каждом случае, это можно обернуть в какое-то условие (разрабу виднее). Но здесь важно выдержать баланс между оптимизацией и чистым кодом.
Например можно в методе init() обернуть в условие вызов методов registerBackendController() или addBackendControllerPermission() чтобы они вызывались только когда мы в админке, но тогда возрастёт количество строк кода, что сделает модуль сложнее, а профита от этого будет 0. Т.к. мы сэкономили на добавлении одной строки в массив, но с другой стороны добавили еще один if, который перекроет то, что мы сэкономили (и это всего пару байт).

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

Также модули инициализируют сервисы (это хелперы, реквесты), которые регистрируются в DI контейнер, здесь тоже переживать не стоит, т.к. DI контейнер создает экземпляры классов сервисов лениво (только тогда, когда их кто-то запросил).

Entities как и контроллеры из системы или модулей всегда создаются лениво.

korshunov писал(а):А надо бы всего лишь немного поработать, чтоб сказка стала былью...
Если можете, поясните о чём вы здесь говорите. У вас есть предложение как сделать модуль более отделённым от системы?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #23 korshunov » 05.03.2020, 17:29

zyxer писал(а):...мы сэкономили на добавлении одной строки в массив, но с другой стороны добавили еще один if, который перекроет то, что мы сэкономили (и это всего пару байт).

Очень интересно, откуда Вы взяли "пару байт". У меня другие результаты.
На демосайте открываю главную и в коде вижу
memory peak usage: 11535488 bytes.
Отключаю в админке все 14 модулей и теперь получаю
memory peak usage: 10121480 bytes
Разница 1.4M. То есть инициализация каждого модуля в среднем добавляет 0.1M. А из 14 модулей какую-то реальную пользу на витрине могут приносить максимум 3, а большинство просто работает статистами. И каждый статист потребляет не пару, а 100 тысяч байт памяти просто так, потому что разработчик решил сэкономить на одном if. По-моему, имеем расточительность сверх всякой меры...

По поводу памяти уже возникали вопросы, видеть можно в теме
viewtopic.php?p=6765#p6765
Там с Вашей стороны прозвучало уверенное "появились небольшие накладные расходы", а когда я предоставил конкретные цифры, которые отмечают весьма большой рост серверных затрат, Вы просто никак не среагировали.

zyxer писал(а):Если можете, поясните о чём вы здесь говорите. У вас есть предложение как сделать модуль более отделённым от системы?

Вы вопрос уже поднимали и я на него отвечал (28.01.2020, 12:09). В тот момент Вы никак на ответ не среагировали, а теперь, когда прошел месяц с лишним, задаете почти такой же вопрос заново. Несколько странный стиль...

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

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #24 zyxer » 11.03.2020, 08:14

korshunov писал(а):Очень интересно, откуда Вы взяли "пару байт". У меня другие результаты.
На демосайте открываю главную и в коде вижу
вы невнимательно прочитали моё сообщение, и проверили вообще не то... Я говорил что есть вещи, которые МОЖНО исключить, но это даст малую экономию.

korshunov писал(а):По поводу памяти уже возникали вопросы, видеть можно в теме
viewtopic.php?p=6765#p6765
Там с Вашей стороны прозвучало уверенное "появились небольшие накладные расходы", а когда я предоставил конкретные цифры, которые отмечают весьма большой рост серверных затрат, Вы просто никак не среагировали.

Да, вы поднимали вопросы памяти. Но у меня к вам встречный вопрос, вы только показываете что растёт количество потребляемой памяти, но можете сказать точную цифру, сколько памяти потреблять допустимо, а сколько уже считается плохо?)
korshunov писал(а):Вы вопрос уже поднимали и я на него отвечал (28.01.2020, 12:09). В тот момент Вы никак на ответ не среагировали, а теперь, когда прошел месяц с лишним, задаете почти такой же вопрос заново. Несколько странный стиль...

К сожалению не нашел того ответа, но смею предположить что если я задаю подобный вопрос повторно, значит вы тогда ответили в стиле "нужно подумать и сделать" вместо аргументированного предложения, впрочем как и сейчас вы "ответили" ))
korshunov писал(а):"но как их не инициализировать, если роутеру чтобы понять на каком роуте вести обработку текущего урла, нужно знать информацию обо всех активных роутах." - Эта трудность есть, но видимо, все это решаемо, стоит только захотеть...
Вот пример еще одного "ответа".

Вот вы кинули фразу "стоит только захотеть..." Давайте порассуждаем. Мы как разработчики хотим чтобы при заходе на роут url_1 работал контроллер Controller1, при заходе на url_2 работал контроллер Controller2. Так вот как мы можем "захотеть" не говорить системе что при заходе на url_2 нужно отправлять запрос на Controller2, но при этом ждать что это произойдет? Вы можете мне это пояснить? Или вы до сих пор не поняли суть роутера?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #25 korshunov » 11.03.2020, 09:38

zyxer писал(а):Вот вы кинули фразу "стоит только захотеть..." Давайте порассуждаем. Мы как разработчики хотим чтобы при заходе на роут url_1 работал контроллер Controller1, при заходе на url_2 работал контроллер Controller2. Так вот как мы можем "захотеть" не говорить системе что при заходе на url_2 нужно отправлять запрос на Controller2, но при этом ждать что это произойдет? Вы можете мне это пояснить? Или вы до сих пор не поняли суть роутера?

Вы можете вопрос задать ТОЧНО, а не абы как?

Текущий вопрос
zyxer писал(а):Так вот как мы можем "захотеть" не говорить системе...
выглядит особенно странно, особенно когда он он исходит не от бабушки у подъезда, а от специалиста-программиста.

На такой глуповатый вопрос можно дать лишь соответственный ответ - Как Вы можете "захотеть" или "не захотеть", я не знаю. Могу лишь фантазировать...

Могу предположить, что по существу вопрос у Вас подразумевается такой. Модуль 1 должен работать с контроллером Controller1 при заходе на адрес url_1. Сам адрес url_1 прописан внутри Модуля 1. Значит, чтобы его узнать, надо инициализировать Модуль 1. И выходит, надо всегда при обработке любого вызова сначала инициализировать все модули, чтобы получить все возможные URL по всем возможным модулям. Затем уже весь список полученных url сопоставлять с текущим адресом и определять модуль, конроллер и все прочее.

То есть сейчас это функционирует так, как в старом анекдоте:

Отслужив срочную службу в армии, солдат вернулся в родную деревушку. Все, естественно, обступили его и давай вопросами засыпать: что там, где там, как там. Солдат и рассказывает:
- Армия - это дебилизм!
- Это почему же? - удивились жители деревни.
- Завтра узнаете.
В четыре часа утра в деревне раздался колокольный звон. Все сельчане сбежались. Стоят в исподнем, сонные, ругаются. Выходит солдат и говорит:
- Значит так: мы с батей идем за дровами, остальным - разойтись!

https://vse-shutochki.ru/anekdot/1862

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

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #26 zyxer » 11.03.2020, 09:48

Если вы хотите конструктивно обсуждать улучшение системы, вы можете предложить хотя-бы один способ и мы вместе сможем обсудить и решить, почему он не подходит для нас, или же наоборот, почему он хорош и использовать именно его.

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

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #27 korshunov » 11.03.2020, 10:14

zyxer писал(а):Если вы хотите конструктивно обсуждать улучшение системы, вы можете предложить хотя-бы один способ и мы вместе сможем обсудить и решить, почему он не подходит для нас, или же наоборот, почему он хорош и использовать именно его.

Я уже предложил:
korshunov писал(а):Если Вы хотите оптимизировать этот момент, то, видимо, надо осознать, что текущая схема подключения модулей не слишком хороша, а надо ее менять - как-то получать информацию про все (модуль,url,Controller) заранее и экономнее, не подключая все модули. Способы есть разные, и совсем не сложные...

Если заинтересованы, то так прямо и скажите - мол, интересут предложенная оптимизация, но непонятны такие-то деталии и требуются такие-то подробности - добавлю деталей...

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #28 zyxer » 11.03.2020, 10:19

предлагаю чтобы не распыляться на все стороны, говорить об одном. Как вы видите оптимизацию регистрации роутов? Давайте пока только за роуты поговорим.
Вопрос в том, как вы видите регистрацию роутов от модулей?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #29 korshunov » 11.03.2020, 10:48

"не распыляться" - отличная мысль.

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

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #30 zyxer » 11.03.2020, 12:29

Вот документация по роутам, в модуле файл Файл Init/routes.php содержит роуты для текущего модуля, которые полностью соответствуют системным роутам.
Система проходится по всем активным модулям, получает содержимое файла Init/routes.php из модуля (если он есть) и мержит с системными роутами. Описание роутов, это PHP массив.

Предложите здесь варианты оптимизации. Что именно вы видите здесь, что можно оптимизировать?
Я, к сожалению, не вижу вариантов кроме как собрать все роуты со всех модулей и проверить текущий урл на соответствие первому удовлетворяющему роуту. Есть идеи изменить это?
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #31 korshunov » 11.03.2020, 14:25

zyxer писал(а):Я, к сожалению, не вижу вариантов кроме как собрать все роуты со всех модулей и проверить текущий урл на соответствие первому удовлетворяющему роуту

Я тоже полагаю, что это единственный вариант.

Но, на мой взгляд, куда важнее вопрос, когда это собирать и что делать с собранным.
Насколько я понимаю, сейчас эти данные собираются при КАЖДОМ вызове КАЖДОГО url на сайте. Потом используются для определения нужного контроллера, и после обработки теряются.

А если подойти поэкономнее? Собирать все роуты полностью (и стандартные и модульные) не каждый раз при каждом формировании любой страницы, а только тогда, когда они меняются. Например, при редактировании таблицы модулей. И хранить результат в отдельном месте, чтобы каждый раз модули не инициализировать. Можно в файле (по аналогии с config/config.php), можно в базе в каком-то виде. И до распознавания текущего url вызывать нужное без сложной работы по инициализации модулей.

А может быть, автоматически к роутам всех модулей добавлять префикс module/, подобно текущим 'products/', 'catalog/'.

Думаю, что и другие способы тут можно легко придумать. Как я уже сказал, "было бы желание"...

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #32 zyxer » 11.03.2020, 15:31

Вариант с кешированием роутов я проверял ранее (еще в процессе разработки тройки) и он не давал никакого результата. У меня получалась погрешность в измерениях больше чем разница с этим кешированием и без него. Напомню, проверял я через blackfire. Чуть более ощутимая польза была от Autoloader Optimization композера. Но там снова таки нюанс, когда его сделать, он прописывает полную карту классов PSR-4. И при добавлении нового класса нужно выполнять команду dump-autoload. Решение имеет право быть, но оно не универсально. Т.е. на конкретном проекте его можно применить, но добавлять его в коробку, нам показалось не лучшей идеей.

добавлять префикс module/ тоже не лучшая идея:
1. это не есть оптимизация (или я не понял суть этой оптимизации...)
2. невозможно из модуля создать тот же faq, потому как получится module/faq. Как минимум эстетически не красиво.

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

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #33 korshunov » 11.03.2020, 16:35

zyxer писал(а):Вариант с кешированием роутов я проверял ранее (еще в процессе разработки тройки) и он не давал никакого результата.

Совсем непонятно. Что проверял, как проверял, какие результаты? Надо или писать ВСЕ подробности своих проверок со всеми деталями, чтоб каждый мог повторить и проверить, или вообще не писать пустые слова.

Вот я написал выше (пост 20:29) точно, что и как проверял. И результат - при включении/отключении 14 модулей разница 1.4М памяти, то есть порядка 10%.

Если Вы про свое "я проверял ранее" напишете точно и подробно, то можно будет что-то сказать, а пока одни загадки. Как говорил Шерлок Холмс, бездоказательно, дорогой профессор...

zyxer M
zyxer M
Возраст: 28
Репутация: 48
Сообщения: 235
Зарегистрирован: 03.02.2016
С нами: 4 года 2 месяца
Откуда: Днепр

Сообщение #34 zyxer » 12.03.2020, 08:18

korshunov писал(а):Совсем непонятно. Что проверял, как проверял, какие результаты? Надо или писать ВСЕ подробности своих проверок со всеми деталями, чтоб каждый мог повторить и проверить, или вообще не писать пустые слова.

korshunov писал(а):Если Вы про свое "я проверял ранее" напишете точно и подробно, то можно будет что-то сказать, а пока одни загадки. Как говорил Шерлок Холмс, бездоказательно, дорогой профессор...

Вы серьёзно? ))) я не собираюсь никому ничего доказывать. Если вы считаете что я вас обманываю, право ваше. Я просто говорю что этот вариант мы рассматривали, и приняли решение что это не имеет никакого смысла.
Вы же можете реализовать это так как вы видите, и опубликовать, или прислать в виде pull реквеста.

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

zyxer писал(а):Да, вы поднимали вопросы памяти. Но у меня к вам встречный вопрос, вы только показываете что растёт количество потребляемой памяти, но можете сказать точную цифру, сколько памяти потреблять допустимо, а сколько уже считается плохо?)
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #35 korshunov » 12.03.2020, 11:15

zyxer писал(а):Вы серьёзно? ))) я не собираюсь никому ничего доказывать. Если вы считаете что я вас обманываю, право ваше. Я просто говорю что этот вариант мы рассматривали, и приняли решение что это не имеет никакого смысла.

Конечно, Вы не должны доказывать.
Насчет "обманываю" - предмет деликатный. Я не считаю, что Вы обманываете НАМЕРЕННО. Но Вы можете обманывать непреднамеренно, то есть можете обманываться сами, считая за истину то, что не является таковой. Потому и задаю вопрос о подробностях того, как Вы проверяли.
Ибо в соответствии с Вашим "я не собираюсь никому ничего доказывать" я с моей стороны не собираюсь верить на слово, а хочу проверить, что вполне естественно.

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

zyxer писал(а):Ответьте на точно заданный вопрос.

Если спрашиваете про "можете сказать точную цифру, сколько памяти потреблять допустимо", то даю ответ - НЕ МОГУ сказать цифру. Чтобы дать такой ответ, надо провести серьезные исследования, что требует больших затрат времени и (или) денег.
Да и сам вопрос, как Вы должны бы понимать, несколько неопределенный - в разных ситуациях результаты будут разные. И возможные ответы на него будут субъективны. Даже если затратить весьма большие финансы и добиться ответов у разных экспертов, то они будут разные - примерно как одинаковые судебные дела у разных судей решатся по разному...

Вот для меня цифра 10% абсолютно бесполезного расхода памяти при установке из коробки является НЕ допустимой. А с добавлением новых модулей она может к тому же существенно вырасти.


А по главному обсуждаемому вопросу картина, в моем представлении, такова:
1. Сейчас работа с модулями построена как в приведенном выше армейском анекдоте.
2. Разработчики менять ничего не хотят, потому что ранее принято решение делать именно так.
3. Почему принято такое решение и почему оно хорошее, разработчики объяснить не желают (возможно, это тайна - военная или коммерческая или еще какая бюрократическая).
4. Мне трудно продолжать, если оппонент искусственно ограничивает рамки разговора подходом типа - вот мы так решили, поэтому ТАК НАДО.
5. Принятое решение базируется на

zyxer писал(а):Вариант с кешированием роутов я проверял ранее (еще в процессе разработки тройки)

Судя по этой фразе, проверялось еще до появления первой версии 3.0.0. А с тех пор сменилось довольно много версий и насколько это решение оказалось хорошим, добавочно вряд ли проверялось...

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 169
Сообщения: 1203
Зарегистрирован: 12.11.2015
С нами: 4 года 4 месяца
Сайт Skype

Сообщение #36 OkayCMS » 12.03.2020, 11:26

korshunov писал(а):
А по главному обсуждаемому вопросу картина, в моем представлении, такова:
1. Сейчас работа с модулями построена как в приведенном выше армейском анекдоте.
2. Разработчики менять ничего не хотят, потому что ранее принято решение делать именно так.
3. Почему принято такое решение и почему оно хорошее, разработчики объяснить не желают (возможно, это тайна - военная или коммерческая или еще какая бюрократическая).
4. Мне трудно продолжать, если оппонент искусственно ограничивает рамки разговора подходом типа - вот мы так решили, поэтому ТАК НАДО.

Ещё раз. Вы предложили идею, которую мы уже проверяли ранее. Мы вам сказали что идея не дает особого результата, что мы проверяли её реализацию и результаты, которые показывало её внедрение нас не устроило, именно поэтому мы её не реализовывали. Вы сейчас просите нас ДОКАЗАТЬ что мы проверяли и повторно выполнить работу по тестированию этой идеи.

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

korshunov
korshunov
Репутация: 86
Сообщения: 1159
Зарегистрирован: 03.12.2015
С нами: 4 года 4 месяца
Skype

Сообщение #37 korshunov » 12.03.2020, 12:13

OkayCMS писал(а):Ещё раз. Вы предложили идею, которую мы уже проверяли ранее. Мы вам сказали что идея не дает особого результата, что мы проверяли её реализацию и результаты, которые показывало её внедрение нас не устроило, именно поэтому мы её не реализовывали. Вы сейчас просите нас ДОКАЗАТЬ что мы проверяли и повторно выполнить работу по тестированию этой идеи.

Несколько неверно.
1. Я не просил "ДОКАЗАТЬ что мы проверяли".
2. Я не просил "повторно выполнить работу по тестированию".
3. Я просил всего лишь сообщить подробности Вашей проверки, ибо Вы не сообщали про Вашу проверку СОВСЕМ НИЧЕГО - ни на каком сайте, ни на какой CMS, ни проверяемые параметры.
4. Кстати говоря, если б Вы сообщили достаточно подробностей, возможно, я сам бы проверил еще раз. И поверьте, скрывать бы ничего не стал. Возможно, Вы бы узнали что-то интересное и полезное без лишних трудозатрат.

Еще раз подчеркиваю, от Вас ничего не требую. Все исключительно добровольно. Я полагал, что Вы сами должны быть заинтересованы в добавочных проверках. Но решать Вам.


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя