如何在 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。我必须能够做到其中之一:
使用独立文件并能够声明要翻译的文本,类似于此(不起作用):
include( '../../config/config.inc.php' );
echo json_encode(array('key' => l('Some text')));
使用模块控制器并强制原始输出,与此类似(也不起作用):
class myModuleListModuleFrontController extends ModuleFrontController
{
public function initContent()
{
parent::initContent();
$this->noHtml = true;
echo json_encode(array('key' => l('Some text')));
}
}
如果想翻译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;
除此之外,我想不出构建您的应用程序可能还需要什么。始终向您的控制器发送令牌以确保安全!
我会做的事情:
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。我必须能够做到其中之一:
使用独立文件并能够声明要翻译的文本,类似于此(不起作用):
include( '../../config/config.inc.php' ); echo json_encode(array('key' => l('Some text')));
使用模块控制器并强制原始输出,与此类似(也不起作用):
class myModuleListModuleFrontController extends ModuleFrontController { public function initContent() { parent::initContent(); $this->noHtml = true; echo json_encode(array('key' => l('Some text'))); } }
如果想翻译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;
除此之外,我想不出构建您的应用程序可能还需要什么。始终向您的控制器发送令牌以确保安全!