如何在 prestashop 模块中创建页面,使输出不包含在站点模板 html 中并使用翻译?

How to create a page in a prestashop module such that the output is not wrapped in the site's template html AND using translation?

我会做的事情:

1) 创建允许翻译的模块控制器。

我可以在控制器本身或模板中声明要翻译的文本:

/modules/mymodule/controllers/front/list.php

class myModuleListModuleFrontController extends ModuleFrontController
{
    public function initContent()
    {
        parent::initContent();
        $this->l('Some text to translater');
        $this->setTemplate('list.tpl');
    }
}

/modules/mymodule/views/templates/front/list.tpl

{l s='Some other text' mod='mymodule'}

2) 我知道创建一些未嵌入 html 的输出,例如一些 json 对象:

/modules/mymodule/json.php

include( '../../config/config.inc.php' ); 
echo json_encode(array('key' => 'Some text'));

我需要的:

我需要能够翻译一些文本并将输出发送到浏览器而不需要周围的 html。我必须能够做到其中之一:

如果想翻译FrontController中的文字,只能通过两种方式:

翻译模板中的文本

// Inside module front controller

$template = '.../template.tpl'
$this->context->smarty->fetch($template)

// Inside template.tpl

{l s='Translateable text' mod='mymodule'}

或者使用已经在主模块文件中翻译的字符串

 // Inside module front controller
 $this->module->l('My string');

 // But it has to already exist inside mymodule.php
 $this->l('My string'); // You don't have to use it, it just has to exist to get scanned by RegEx.

如果你想return返回模块前端控制器中的Ajax请求

 public function init() {

 parent::init(); // If you need to

 // Some code here

 if (Tools::getValue('ajax'))
 {
     header('Content-Type: text/html');
     die($this->context->smarty->fetch($template));

     // Or
     header('Content-Type: application/json');
     die(Tools::jsonEncode($response_array));
 }

还有一个函数叫做

FrontControllerCore::getLayout @ Line 1209

您可以使用它来覆盖整个页面模板,但是,它应该用于为产品和其他页面创建独特的显示(如全屏产品展示等)

如果您想自己输出文件而不向用户提供完整的文件路径:

 public function init() {

    parent::init(); // If you need to

    if (ob_get_level() && ob_get_length() > 0)
        ob_end_clean();

    // Set download headers
    header('Content-Transfer-Encoding: binary');
    header('Content-Type: '.$mime_type);
    header('Content-Length: '.filesize($file));
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    // Prevents max execution timeout, when reading large files
    set_time_limit(0);
    $fp = fopen($file, 'rb');
    while (!feof($fp))
        echo fgets($fp, 16384);

   exit;

除此之外,我想不出构建您的应用程序可能还需要什么。始终向您的控制器发送令牌以确保安全!