Ответить Новая тема Новый опрос 
 Класса "Mail" нет, но он работает.
Necrosss
Новичок
Сообщений: 3
Регистрация: 10-11-2018


10-11-2018 20:20
Здравствуйте, пытаюсь разобраться как устроен PrestaShop.
Я пишу скрипт, который взаимодействует с движком (но не модуль) и понадобилось узнать кое какие технические детали..

Итак, допустим есть класс "Tools".
В папке "classes/" есть файл Tools.php, но класс, который там записан называется "ToolsCore", а уже класс "Tools" который основан на нём ("class Tools extends ToolsCore") располагается по адресу "tools/profiling/Tools.php".
То есть мы имеем 2 файла Tools.php. Один - "ToolsCore", второй - "Tools" и так почти для всех таких же классов.
И всё было логично пока я не столкнулся с функцией "Mail::Send()". Я сразу нашел класс "MailCore" ("classes/Mail.php"), а класс "Mail" я так найти и не смог, в папке "tools/profiling/" его нет. То же самое касается класса "Context".

Ради интереса открыл файл "cache/class_index.html" Классы Mail и Context там числятся, но в каких файлах прописаны там не указано.

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

Кто хорошо знает движок, прошу подсказать в чём хитрость ?
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Алекс


Администратор
Сообщений: 4516
Откуда: Красноярск
Регистрация: 29-05-2009


10-11-2018 22:32
Цитата:( Necrosss @ 10-11-2018 21:20 Смотреть сообщение )
В папке "classes/" есть файл Tools.php, но класс, который там записан называется "ToolsCore", а уже класс "Tools" который основан на нём ("class Tools extends ToolsCore") располагается по адресу "tools/profiling/Tools.php".

В работе CMS PrestaShop "tools/profiling/" не используется!
Для включения профилирования кода необходимо в файле /config/defines.inc.php
Код:
define('_PS_DEBUG_PROFILING_', false);

заменить на:
Код:
define('_PS_DEBUG_PROFILING_', true);

Используется разработчиками CMS, не более.

Цитата:( Necrosss @ 10-11-2018 21:20 Смотреть сообщение )
И всё было логично пока я не столкнулся с функцией "Mail::Send()". Я сразу нашел класс "MailCore" ("classes/Mail.php"), а класс "Mail" я так найти и не смог, в папке "tools/profiling/" его нет. То же самое касается класса "Context".

Используйте:
Код:
Mail::Send(...)

Core используется для переопределений (override).
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Necrosss
Новичок
Сообщений: 3
Регистрация: 10-11-2018


10-11-2018 23:13
Цитата:( Алекс @ 10-11-2018 18:32 Смотреть сообщение )
Используйте:
Код:
Mail::Send(...)

Core используется для переопределений (override).


Я не могу использовать Mail. Я нашел класс MailCore, но не нашел класс Mail. В том-то и смысл.
Мне нужно понять где объявляется класс "Mail" и "Context". Я знаю что они точно где-то обявляются.
Либо возможно хистрость в том что где-то незаметно используется команда "class_alias('MailCore', 'Mail');", но это не точно.

Я не уточнил сразу, но скрипт котрый я пишу, работает с файлами движка, но вне движка. То есть я классы сам подключаю вручную.
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Алекс


Администратор
Сообщений: 4516
Откуда: Красноярск
Регистрация: 29-05-2009


10-11-2018 23:23
Цитата:( Necrosss @ 11-11-2018 00:13 Смотреть сообщение )
скрипт котрый я пишу, работает с файлами движка, но вне движка.

Код:
require __DIR__ .'/config/config.inc.php';
Mail::Send(Context::getContext()->language->id, 'test', 'hello', array(), 'me@me.me', 'Name');
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Necrosss
Новичок
Сообщений: 3
Регистрация: 10-11-2018


12-11-2018 18:05
Цитата:( Алекс @ 10-11-2018 19:23 Смотреть сообщение )
Цитата:( Necrosss @ 11-11-2018 00:13 Смотреть сообщение )
скрипт котрый я пишу, работает с файлами движка, но вне движка.
Код:
require __DIR__ .'/config/config.inc.php';
Mail::Send(Context::getContext()->language->id, 'test', 'hello', array(), 'me@me.me', 'Name');

Спасибо, это действительно близко к нужному решению.

Я как раз параллельно сам дошел до той же мысли что нужно просто отталкиваться от файла index.html и идти вглубь. Это было тяжело, но я справился.

Нужный код находился в файле "/classes/PrestaShopAutoload.php", конкретно в функции "load".
Я выложу сюда содержимое небольшого скрипта, который я написал на случай если вдруг кто-то столкнётся с такой же проблемой:

Код:
require(dirname(__FILE__).'/config/defines.inc.php');
require_once(_PS_CLASS_DIR_.'PrestaShopAutoload.php');

$classes = array(
'Core_Foundation_Database_EntityInterface',
'ObjectModel',
'Mail'
);

$PSAutoload = PrestaShopAutoload::getInstance();

foreach ($classes as $class)
{
$PSAutoload->load($class);
}


Это собственно всё.
Тему можно закрыть.
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ответить Новая тема Новый опрос