Jump to content

Override de AdminCMSController


Recommended Posts

Bonjour à tous,
 
j'ai un problème concernant l'override du fichier AdminCMSController.
 
Je cherche à ajouter un champs pour les pages CMS, un champs titre tout simplement, car dans prestashop, seul un champs meta_title est proposé.

 

Dans mes fichiers, le but est donc d'ajouter le champs "link_title".
 
Pour se faire, j'ai ajouté le fichier override/Classes/CMS.php comme suit :

class CMS extends CMSCore
{
	/** @var string Name */
	public $meta_title;
	public $meta_description;
	public $meta_keywords;
	public $content;
	public $link_rewrite;
	public $id_cms_category;
	public $position;
	public $active;
	public $link_title;
	
	/**
	 * @see ObjectModel::$definition
	 */
	public static $definition = array(
		'table' => 'cms',
		'primary' => 'id_cms',
		'multilang' => true,
		'fields' => array(
			'id_cms_category' => 	array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
			'position' => 			array('type' => self::TYPE_INT),
			'active' => 			array('type' => self::TYPE_BOOL),

			// Lang fields
			'meta_description' => 	array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
			'meta_keywords' => 		array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
			'meta_title' =>			array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128),
			'link_title' =>			array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 255),
			'link_rewrite' => 		array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128),
			'content' => 			array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString', 'size' => 3999999999999),
		),
	);
}

Puis j'ai créé le champs dans la table ps_cms_lang (un varchar de 255 caractères)

 

Enfin j'ai voulu overrider le fichier AdminCMSController.php. J'ai donc créer le fichier dans le répertoire override/controllers/admin/AdminCMSController.php

 

Voici le contenu de mon fichier :

class AdminCmsController extends AdminCmsControllerCore
{
	protected $category;

	public $id_cms_category;

	protected $position_identifier = 'id_cms';

	public function __construct()
	{
		$this->table = 'cms';
		$this->className = 'CMS';
		$this->lang = true;
		$this->addRowAction('edit');
		$this->addRowAction('delete');
		$this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'), 'confirm' => $this->l('Delete selected items?')));

		$this->fields_list = array(
			'id_cms' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
			'link_rewrite' => array('title' => $this->l('URL'), 'width' => 'auto'),
			'link_title' => array('title' => $this->l('Titre lien'), 'width' => 'auto'),
			'meta_title' => array('title' => $this->l('Title'), 'width' => '300', 'filter_key' => 'b!meta_title'),
			'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'),
			'active' => array('title' => $this->l('Displayed'), 'width' => 25, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false)
		);

		// The controller can't be call directly
		// In this case, AdminCmsContentController::getCurrentCMSCategory() is null
		if (!AdminCmsContentController::getCurrentCMSCategory())
		{
			$this->redirect_after = '?controller=AdminCmsContent&token='.Tools::getAdminTokenLite('AdminCmsContent');
			$this->redirect();
		}

		$this->_category = AdminCmsContentController::getCurrentCMSCategory();
		$this->_join = '
		LEFT JOIN `'._DB_PREFIX_.'cms_category` c ON (c.`id_cms_category` = a.`id_cms_category`)';
		$this->_select = 'a.position ';
		$this->_filter = 'AND c.id_cms_category = '.(int)$this->_category->id;

		parent::__construct();
	}

	public function renderForm()
	{
		if (!$this->loadObject(true))
			return;
		
		if (Validate::isLoadedObject($this->object))
			$this->display = 'edit';
		else
			$this->display = 'add';

		$this->toolbar_btn['save-and-preview'] = array(
			'href' => '#',
			'desc' => $this->l('Save and preview')
		);
		$this->toolbar_btn['save-and-stay'] = array(
			'short' => 'SaveAndStay',
			'href' => '#',
			'desc' => $this->l('Save and stay'),
		);
		$this->initToolbar();

		$categories = CMSCategory::getCategories($this->context->language->id, false);
		$html_categories = CMSCategory::recurseCMSCategory($categories, $categories[0][1], 1, $this->getFieldValue($this->object, 'id_cms_category'), 1);

		$this->fields_form = array(
			'tinymce' => true,
			'legend' => array(
				'title' => $this->l('CMS Page'),
				'image' => '../img/admin/tab-categories.gif'
			),
			'input' => array(
				// custom template
				array(
					'type' => 'select_category',
					'label' => $this->l('CMS Category'),
					'name' => 'id_cms_category',
					'options' => array(
						'html' => $html_categories,
					),
				),
				array(
					'type' => 'text',
					'label' => $this->l('Titre lien:'),
					'name' => 'link_title',
					'lang' => true,
					'required' => true,
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
					'size' => 255
				),
				array(
					'type' => 'text',
					'label' => $this->l('Meta title:'),
					'name' => 'meta_title',
					'id' => 'name', // for copy2friendlyUrl compatibility
					'lang' => true,
					'required' => true,
					'class' => 'copy2friendlyUrl',
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
					'size' => 50
				),
				array(
					'type' => 'text',
					'label' => $this->l('Meta description'),
					'name' => 'meta_description',
					'lang' => true,
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
					'size' => 70
				),
				array(
					'type' => 'tags',
					'label' => $this->l('Meta keywords'),
					'name' => 'meta_keywords',
					'lang' => true,
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
					'size' => 70,
					'desc' => $this->l('To add "tags" click in the field, write something, and then press "Enter."')
				),
				array(
					'type' => 'text',
					'label' => $this->l('Friendly URL'),
					'name' => 'link_rewrite',
					'required' => true,
					'lang' => true,
					'hint' => $this->l('Only letters and the minus (-) character are allowed')
				),
				array(
					'type' => 'textarea',
					'label' => $this->l('Page content'),
					'name' => 'content',
					'autoload_rte' => true,
					'lang' => true,
					'rows' => 5,
					'cols' => 40,
					'hint' => $this->l('Invalid characters:').' <>;=#{}'
				),
				array(
					'type' => 'radio',
					'label' => $this->l('Displayed:'),
					'name' => 'active',
					'required' => false,
					'class' => 't',
					'is_bool' => true,
					'values' => array(
						array(
							'id' => 'active_on',
							'value' => 1,
							'label' => $this->l('Enabled')
						),
						array(
							'id' => 'active_off',
							'value' => 0,
							'label' => $this->l('Disabled')
						)
					),
				),
			),
			'submit' => array(
				'title' => $this->l('Save'),
				'class' => 'button'
			)
		);

		if (Shop::isFeatureActive())
		{
			$this->fields_form['input'][] = array(
				'type' => 'shop',
				'label' => $this->l('Shop association:'),
				'name' => 'checkBoxShopAsso',
			);
		}

		$this->tpl_form_vars = array(
			'active' => $this->object->active,
			'PS_ALLOW_ACCENTED_CHARS_URL', (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL')
		);
		return AdminCmsController::renderForm();
	}
}

Mais cela ne fonctionne pas.

 

 

J'ai fait le test de modifier le fichier source controllers/admin/AdminCMSController.php

 

en ajoutant la déclaration suivante et cela fonctionne :

array(
					'type' => 'text',
					'label' => $this->l('Titre lien:'),
					'name' => 'link_title',
					'lang' => true,
					'required' => true,
					'hint' => $this->l('Invalid characters:').' <>;=#{}',
					'size' => 50
				),

Donc la modification fonctionne hormis le fait que le fichier n'est pas overrider.

 

Pouvez-vous m'aider pour savoir ce qui ne va pas dans mes modifications? Le but principal étant que l'override fonctionne, et que les fichiers source de prestashop ne soient pas modifiés.

 

Je vous précise que j'ai passé un bon moment sur google et le forum de prestashop sans trouver de solution.

 

Je suis sous prestashop 1.5.4.1.

 

 

Merci d'avance pour vos réponses.

 

 

 

Link to comment
Share on other sites

Merci seb776, je ne savais pas qu'il fallait supprimer ce fichier du cache.
 
Je l'ai fait et j'ai bien vu que la ligne 'AdminCmsController' => 'override/controllers/admin/AdminCmsController.php', est maintenant remplie.
 
Par contre lorsque je vais que je clique sur créer ou modifier une page CMS, le navigateur me dit "Echec du chargement".
 
Sur la page de gestion des CMS, j'ai les menus "modifier" et "supprimer" qui sont apparus en double.
 
Le fichier réécrit ne doit pas être correct.
 
Des idées de la provenance de ce genre de problème?

Link to comment
Share on other sites

  • 4 weeks later...

J'avais laissé ce script de côté, mais j'ai trouvé mon erreur.
 
Dans le fichier "AdminCMSController.php", il fallait à la fin faire directement appel à

return AdminController::renderForm();

Maintenant ça fonctionne comme je le souhaite, les fichiers sont overridés, et on peut ajouter un titre à une page cms.

 

Merci Seb776

  • Thanks 1
Link to comment
Share on other sites

  • 8 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...