2017-01-05 6 views
2

Переопределить функциональность и конфликты папки?Переопределить функции и конфликты с папками?

У меня есть файл класса group.php в базовом коде prestashop. Я хочу добавить новое поле и внести некоторые функциональные изменения в этот файл group.php.

Я создал специальный модуль и сделал там эти изменения. Когда я устанавливаю этот модуль, мой унаследованный файл group.php отправляется в папку Base Override и остается там.

Теперь мой вопрос,

Как эта функциональность переопределение работает?

Как конфликты управляются prestashop?

Для примера: у меня есть 2 модуля, которые отдельно переопределяют один и тот же файл group.php. Если я устанавливаю эти 2 модуля одновременно, то group.php будет в папке переопределения базы?

+0

Привет Кирубанидхи, вам нужна дополнительная информация по этому вопросу? Если я правильно ответил на ваши вопросы, не возражаете ли вы принять мой ответ, чтобы закрыть эту тему? –

ответ

3

Вот addOverride() метод из класса Module:

/** 
* Add all methods in a module override to the override class 
* 
* @param string $classname 
* @return bool 
*/ 
public function addOverride($classname) 
{ 
    $path = Autoload::getInstance()->getClassPath($classname.'Core'); 

    // Check if there is already an override file, if not, we just need to copy the file 
    if (!($classpath = Autoload::getInstance()->getClassPath($classname))) 
    { 
     $override_src = $this->getLocalPath().'override'.DIRECTORY_SEPARATOR.$path; 
     $override_dest = _PS_ROOT_DIR_.DIRECTORY_SEPARATOR.'override'.DIRECTORY_SEPARATOR.$path; 
     if (!is_writable(dirname($override_dest))) 
      throw new Exception(sprintf(Tools::displayError('directory (%s) not writable'), dirname($override_dest))); 
     copy($override_src, $override_dest); 
     // Re-generate the class index 
     Autoload::getInstance()->generateIndex(); 
     return true; 
    } 

    // Check if override file is writable 
    $override_path = _PS_ROOT_DIR_.'/'.Autoload::getInstance()->getClassPath($classname); 
    if ((!file_exists($override_path) && !is_writable(dirname($override_path))) || (file_exists($override_path) && !is_writable($override_path))) 
     throw new Exception(sprintf(Tools::displayError('file (%s) not writable'), $override_path)); 

    // Make a reflection of the override class and the module override class 
    $override_file = file($override_path); 
    eval(preg_replace(array('#^\s*<\?php#', '#class\s+'.$classname.'\s+extends\s+([a-z0-9_]+)(\s+implements\s+([a-z0-9_]+))?#i'), array('', 'class '.$classname.'OverrideOriginal'), implode('', $override_file))); 
    $override_class = new ReflectionClass($classname.'OverrideOriginal'); 

    $module_file = file($this->getLocalPath().'override'.DIRECTORY_SEPARATOR.$path); 
    eval(preg_replace(array('#^\s*<\?php#', '#class\s+'.$classname.'(\s+extends\s+([a-z0-9_]+)(\s+implements\s+([a-z0-9_]+))?)?#i'), array('', 'class '.$classname.'Override'), implode('', $module_file))); 
    $module_class = new ReflectionClass($classname.'Override'); 

    // Check if none of the methods already exists in the override class 
    foreach ($module_class->getMethods() as $method) 
     if ($override_class->hasMethod($method->getName())) 
      throw new Exception(sprintf(Tools::displayError('The method %1$s in the class %2$s is already overriden.'), $method->getName(), $classname)); 

    // Check if none of the properties already exists in the override class 
    foreach ($module_class->getProperties() as $property) 
     if ($override_class->hasProperty($property->getName())) 
      throw new Exception(sprintf(Tools::displayError('The property %1$s in the class %2$s is already defined.'), $property->getName(), $classname)); 

    // Insert the methods from module override in override 
    $copy_from = array_slice($module_file, $module_class->getStartLine() + 1, $module_class->getEndLine() - $module_class->getStartLine() - 2); 
    array_splice($override_file, $override_class->getEndLine() - 1, 0, $copy_from); 
    $code = implode('', $override_file); 
    file_put_contents($override_path, $code); 

    return true; 
} 

Как указано в комментариях конфликтов ручка на метод и свойства масштабирования.

Если вы попытаетесь установить модуль, который переопределяет новый метод или новое свойство, все будет работать нормально, и оба файла будут объединены.

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

2

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

Пример этого комментария является:

/* 
* module: supercheckout 
* date: 2016-12-01 08:03:28 
* version: 1.0.1 
*/ 
public function overriddenFunction() 
{ 
    parent::mylogout(); 
    -- Custom Code Here -- 
} 

Вы можете проверить это в перегруженной файл на конце (/override/classes/group.php) в вашем случае.

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