「public $php_self = 'mypage'」以外はすべて正常に機能しています。
ファイルをオーバーライド ディレクトリに置くと (良い方法です)、識別子 "mypage" は SEO メニューに表示されません。ただし、コントローラ ファイルをメイン ディレクトリに配置すると、機能します。
classes/Meta.php はオーバーライド ディレクトリをスキャンせず、ルート ディレクトリのみをスキャンします (Meta.php の 56 行目で確認できます)。
このコードでクラス Meta.php をオーバーライドすると、PrestaShop はオーバーライド ディレクトリをスキャンしてページを追加できます。
class Meta extends MetaCore
{
public static function getPages($exclude_filled = false, $add_page = false)
{
$selected_pages = parent::getPages($exclude_filled, $add_page);
if (!$files = Tools::scandir(_PS_CORE_DIR_.DIRECTORY_SEPARATOR.'override'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'front'.DIRECTORY_SEPARATOR, 'php', '', true))
die(Tools::displayError('Cannot scan override directory'));
$exlude_pages = array(
'category', 'changecurrency', 'cms', 'footer', 'header',
'pagination', 'product', 'product-sort', 'statistics'
);
foreach ($files as $file)
{
if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages))
{
$class_name = str_replace('.php', '', $file);
$reflection = class_exists($class_name) ? new ReflectionClass(str_replace('.php', '', $file)) : false;
$properties = $reflection ? $reflection->getDefaultProperties() : array();
if (isset($properties['php_self']))
$selected_pages[$properties['php_self']] = $properties['php_self'];
elseif (preg_match('/^[a-z0-9_.-]*\.php$/i', $file))
$selected_pages[strtolower(str_replace('Controller.php', '', $file))] = strtolower(str_replace('Controller.php', '', $file));
elseif (preg_match('/^([a-z0-9_.-]*\/)?[a-z0-9_.-]*\.php$/i', $file))
$selected_pages[strtolower(sprintf(Tools::displayError('%2$s (in %1$s)'), dirname($file), str_replace('Controller.php', '', basename($file))))] = strtolower(str_replace('Controller.php', '', basename($file)));
}
}
return $selected_pages;
}
}