Prestashop : Display simple page in Admincontroller (without ObjectModel) - module

I want to create a simple page in Prestashop back-office. I don't need any ObjectModel.
I've created a new admin Tab. My problem is in AdminController.
You can see the following code : the variables are not transmitted to the template file. I don't understand how to do it.
class AdminAzertyController extends AdminController
{
public function initContent()
{
parent::initContent();
// Le template smarty
$tpl_path = _PS_MODULE_DIR_ .'paniersdegout/views/templates/admin/view.tpl';
$tpl = $this->context->smarty->createTemplate($tpl_path, $this->context->smarty);
$content = $tpl->fetch();
$this->context->smarty->assign('content', $content);
// Le passage de variable
$this->context->smarty->assign('test', 'test');
}
}

To render custom tpl file in the custom controller, you can use smarty to assign content.
For example, if you have to render customtemplate.tpl file of custom module.
public function initContent() {
parent::initContent();
$content = $this->context->smarty->fetch(_PS_MODULE_DIR_ . 'custommodule/views/templates/admin/customtemplate.tpl');
$this->context->smarty->assign(
array(
'content' => $this->content . $content,
)
);
}

Related

Create a basic front-office Controller Prestashop 1.7

I am a beginner and I am learning how to create a front-office controller. I have written the following code but shows nothing when I load the page. I haven't given any reference to it in my module code yet. How should I proceed?
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class AbcMyPageModuleFrontController extends ModuleFrontController
{
public function initContent()
{
parent::initContent();
$this->setTemplate('module:abc/views/templates/front/myFirst.tpl');
}
}
Your path to your file seems wrong, here is a simple version for your eyes only :
<?php
// Edit name and class according to your files, keep camelcase for class name.
require_once _PS_MODULE_DIR_.'modulename/modulename.php';
class ModuleNameAjaxModuleFrontController extends ModuleFrontController
{
public function initContent()
{
$module = new ModuleName;
// Usefull vars derivated from getContext
$context = Context::getContext();
$cart = $context->cart;
$cookie = $context->cookie;
$customer = $context->customer;
$id_lang = $cookie->id_lang;
// Template path : modules/modulename/views/template/front/template.tpl
// Just put some vars in your template
$this->context->smarty->assign(array('myvar'=>'thevalue'));
$this->setTemplate('template.tpl');
}
}

How to load a template file from my admin controller in custom module in prestashop

How to load a template file from my admin controller in custom module in prestashop 1.6
if (!defined('_PS_VERSION_')) exit;
class QueryAllTrxController extends ModuleAdminController
{
public $module;
public function __construct()
{
parent::__construct();
}
public function initContent()
{
parent::initContent();
$this->setTemplate('display.tpl');
//$this->setTemplate(_PS_THEME_DIR_.'mypage.tpl');
}
}
I had the same problem and it took forever to figure out.
I ended up spotting the solution in this video : https://www.youtube.com/watch?v=CdnJpLqqvcM
Any this is how I got it to work :
1 - Create the controller in ModuleName/controllers/AdminMyControllerNameController.php
class AdminMyControllerNameController extends ModuleAdminController
{
public function __construct()
{
$this->display = 'view';
$this->meta_title = $this->l('metatitle');
$this->toolbar_title = $this->l('tollbartitle');
parent::__construct();
}
public function initContent()
{
$this->show_toolbar = true;
$this->display = 'view';
$this->meta_title = $this->l('META TITLE');
parent::initContent();
$this->setTemplate('templatename.tpl');
}
public function initToolBarTitle()
{
$this->toolbar_title = $this->l('TOOLBAR TITLE??');
}
public function initToolBar()
{
return true;
}
}
2 - Create the template file in ModuleName/views/admin/my_controller_name/template.tpl
You have to create a directory in the views/admin folder using the name of your controller written in snake case.
Anyway I hope this will help.
WORKING CODE HERE
Background:
You want to add a custom admin page with a custom module controller. But you cannot customize template because you're stuck with this error message:
Fatal error: Uncaught --> Smarty: Unable to load template file '/var/www/html/admin-dev/themes/default/template/catalog/index.tpl' <-- thrown in /var/www/html/tools/smarty/sysplugins/smarty_internal_templatebase.php on line 129
Your current source code is:
class AdminYourModuleNameProductsController extends ModuleAdminController {
public function initContent() {
parent::initContent();
// enable these lines if you're stuck with damn stupid blank page with just 500 error
// ini_set('display_errors', '1');
// ini_set('display_startup_errors', '1');
// error_reporting(E_ALL);
$this->setTemplate('products/index.tpl');
}
}
And you don't know what to do because PrestaShop dev doc is the worst document in the history of ecommerce platform developer document and moreover its forum is full of chitchats and junks.
Solution
Place index.tpl at
{%PRESTA_ROOT%}/modules/{%YOUR MODULE DIR%}/views/templates/admin/{% snake case version of controller %}/products/index.tpl
For example, if your module name is yourmodulename and the controller name is AdminYourModuleNameProductsController (as in the example), the correct path is:
{%PRESTA_ROOT%}/modules/yourmodulename/views/templates/admin/your_module_name_products/products/index.tpl
If the error still persists:
Check this line:
{%PRESTA_ROOT%}/classes/controller/ModuleAdminController.php
public function createTemplate($tpl_name)
{
if (file_exists(_PS_THEME_DIR_.'modules/'.$this->module->name.'/views/templates/admin/'.$tpl_name) && $this->viewAccess()) {
// echo the following line and exit
return $this->context->smarty->createTemplate(_PS_THEME_DIR_.'modules/'.$this->module->name.'/views/templates/admin/'.$tpl_name, $this->context->smarty);
} elseif (file_exists($this->getTemplatePath().$this->override_folder.$tpl_name) && $this->viewAccess()) {
// echo the following line and exit
return $this->context->smarty->createTemplate($this->getTemplatePath().$this->override_folder.$tpl_name, $this->context->smarty);
}
// the error occurs because php get reach to the following line:
return parent::createTemplate($tpl_name);
}
Do as I commented and you can get the correct file path. Make sure the file exists in the path.
My PrestaShop version is 1.6.1.24
The code $this->setTemplate('display.tpl'); is loading a template file modules/your-custom-module/views/templates/admin/display.tpl or modules/your-custom-module/display.tpl.
The classname must be named that way: AdminQueryAllTrxController
you can put display.tpl in :
modules\module_name\views\templates\admin\classe_name(QueryAllTrx)
and use :$this->setTemplate('display.tpl'); in your AdminQueryAllTrxController
First of all add controller to your module:
modules\module_name\controllers\admin\SomeNameController.php
and extend it by ModuleAdminController, you need at least two methods for it to work properly __construct and initContent
put the following code to the later method:
$this->content .= $this->context->smarty->fetch($this->pathToTpl);
$this->context->smarty->assign(array(
'content' => $this->content,
));
You could replace $this->pathToTpl with any path which is pointed to your tpl file, I'm prefer to create the path dynamically. You can see a simple example here:
class SomeNameController extends ModuleAdminController{
var $pathToTpl;
public function __construct()
{
$this->bootstrap = true;
$this->context = Context::getContext();
$this->pathToTpl = _PS_MODULE_DIR_ .
$this->module->name . // put the name of module
'/views/templates/admin' .
'/' .
'templateName.tpl';
parent::__construct();
}
public function initContent()
{
parent::initContent();
$this->content .= $this->context->smarty->fetch($this->pathToTpl);
$this->context->smarty->assign(array(
'content' => $this->content,
));
}
}
finally you need to place templateName.tpl in the path you wanted to be:
modules\module_name\views\templates\admin\templateName.tpl

Set up link in SilverStripe navigation to automatically download a PDF file

I have some code I'm working on for a PDF download page type in SilverStripe that allows people to upload a PDF file to the backend. In turn, this PDF file is then read into the top navigation as a link that, when clicked, automatically downloads the PDF file.
I have most of the code set up:
<?php
class PDFTemplate extends Page {
public static $db = array(
);
public static $has_one = array(
'PDFFile' => 'File'
);
public static $has_many = array(
);
public function Link() {
return '/home/download?ID=' . $this->ID;
}
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab("Root.Main", new UploadField('PDFFile', "PDF File"), "Content");
return $fields;
}
}
class PDFTemplate_Controller extends Page_Controller {
public static $allowed_actions = array (
'download'
);
public function init() {
parent::init();
}
public function download() {
$id = $_GET['ID'];
$obj = DataObject::get_by_id('PDFTemplate', $id);
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;');
header('Pragma: no-cache');
return readfile("");
}
}
But the one thing I'm stuck on at the moment is how to get the url of the PDF file into the readfile() command. $obj right now is being set to get the id of the specific PDF file for the page....so do I need do use something like $obj.URL or $obj.Link in readfile()?
You're requesting a PDFTemplate object at the moment, not a File object so that's a problem - but you shouldn't need to pass an ID to this page to download it anyway because the Page already has that information.
If you don't need to hide the direct URL of the PDF in question, something like this might be a lot easier and offer better performance:
Delete the download() and Link() functions.
In the .ss template for your menu do: <a <% if $PDFFile %>href="$PDFFile.Link" target="_blank"<% else %>href="$Link"<% end_if %>>

Customize pagination links in CLinkPager

I am using CLinkPager and need to customize the pagination links url.
Need to add #test in the url of the pagination links.
You can implement custom class extends CLinkPager and override createPageUrl() mentod there:
class MyLinkPager extends CLInkPager(){
public $linkHash = '';
protected function createPageUrl($page)
{
$url = $this->getPages()->createPageUrl($this->getController(),$page);
if($this->linkHash)
$url = $url.'#'.$this->linkHash;
return $url;
}
}
Put file with this class in extension folder and dont forget add this folder in import in config (main.php):
'import'=>array(
'application.extensions.*',
...
)
And further, for example in CGrigView configuration, set this pager class:
this->widget(
'zii.widgets.grid.CGridView',
array(
'dataProvider' => $dataProvider,
'pager'=>array(
'class'=>'MyLinkPager',
'linkHash'=>'test'
),
...
)
)

Prestashop module installs but does not work as expected

I have a prestashop plugin that adds an extra tab to the product page:
<?php
// Disable direct addressing to the script:
if (!defined('_PS_VERSION_'))
exit;
//Create module class:
class producttab extends Module {
//Class constructor that contains its configuration:
public function __construct()
{
$this->name = "producttab"; //Module name
$this->tab = "front_office_features"; //Tab with the module in Prestashop back-office modules list
$this->version = "1.0"; // Module version
$this->author = "BelVG"; // Module author
parent::__construct();
$this->displayName = $this->l("Product Tab"); // Module title
$this->description = $this->l("Module creates a new tab on the frontend product page "); // Module description
}
//Module installation-method:
public function install()
{
return (parent::install()
AND $this->registerHook('productTab') //Register productTab hook that will display the tab button
AND $this->registerHook('productTabContent') //Register productTabContent hook that will display the tab content
);
}
//Module deinstallation-method:
public function uninstall()
{
return (parent::uninstall()
AND $this->unregisterHook('productTab')
AND $this->unregisterHook('productTabContent')); // Delete all hooks, registered by the module
}
//Method will be called while performing the "ProductTab" hook (tab buttons generation):
public function hookProductTab($params)
{
global $smarty;
//Call the template containing the HTML-code ?? our button
return $this->display(__FILE__ , 'tpl/productTab.tpl');
}
public function hookProductTabContent($params)
{
global $smarty;
//Transfer the new tab content into template via smatry
//( it is optional as far as the content can be assigned directly in the template)
$result = Db::getInstance()->executeS('SELECT * FROM ps_cms_lang WHERE id_cms =14');
$smarty->assign('content', $result);
// Call the template containing the HTML-code of our new tab content:
return $this->display(__FILE__ , 'tpl/productTabContent.tpl');
}
}
?>
The module works as expected. I'm trying to adapt the same code to add another tab. For some reason the new module installs but the tab does not appear. Is there something I'm missing?
<?php
// Disable direct addressing to the script:
if (!defined('_PS_VERSION_'))
exit;
//Create module class:
class jewellerytab extends Module {
//Class constructor that contains its configuration:
public function __construct()
{
$this->name = "jewellerytab"; //Module name
$this->tab = "front_office_features"; //Tab with the module in Prestashop back-office modules list
$this->version = "1.0"; // Module version
$this->author = "Mike Rifgin"; // Module author
parent::__construct();
$this->displayName = $this->l("jewellery Tab"); // Module title
$this->description = $this->l("Module creates a new tab on the frontend jewellery page "); // Module description
}
//Module installation-method:
public function install()
{
return (parent::install()
AND $this->registerHook('jewelleryTab') //Register jewelleryTab hook that will display the tab button
AND $this->registerHook('jewelleryTabContent') //Register jewelleryTabContent hook that will display the tab content
);
}
//Module deinstallation-method:
public function uninstall()
{
return (parent::uninstall()
AND $this->unregisterHook('jewelleryTab')
AND $this->unregisterHook('jewelleryTabContent')); // Delete all hooks, registered by the module
}
//Method will be called while performing the "jewelleryTab" hook (tab buttons generation):
public function hookjewelleryTab($params)
{
global $smarty;
//Call the template containing the HTML-code ?? our button
return $this->display(__FILE__ , 'tpl/jewelleryTab.tpl');
}
public function hookjewelleryTabContent($params)
{
global $smarty;
//Transfer the new tab content into template via smatry
//( it is optional as far as the content can be assigned directly in the template)
$result = Db::getInstance()->executeS('SELECT * FROM ps_cms_lang WHERE id_cms =14');
$smarty->assign('content', $result);
// Call the template containing the HTML-code of our new tab content:
return $this->display(__FILE__ , 'tpl/jewelleryTabContent.tpl');
}
}
?>
There are no such hooks as jewelleryTab and jewelleryTabContent, you need to work with productTab and productTabContent (which is part of Prestashop core) Here you can find list of hooks for prestahop 1.5 http://doc.prestashop.com/display/PS15/Hooks+in+PrestaShop+1.5 and some basic info on what hooks in prestashop are http://doc.prestashop.com/display/PS14/Understanding+and+using+hooks
You can also try to reach Denis, author of this extension from BelVG
And after this article Denis developed flexible extension to add extra product tabs
jewelleryTab and jewelleryTabContent are custom hook.
You need to add these hook to your .tpl template file:
{hook h='jewelleryTab'}
{hook h='jewelleryTabContent'}
We can only use predefined hooks.
You can use the same hooks as instead of jewelleryTab and jewelleryTabContent.
Hopefully the hooks can be reused.
public function install()
{
return (parent::install()
AND $this->registerHook('productTab') //Register productTab hook that will display the tab button
AND $this->registerHook('productTabContent') //Register productTabContent hook that will display the tab content
);
}