Рубрики
PrestaShop

Добавление конфигурационной страницы для админки PrestaShop

Урок 5 — Заключительная часть цикла статей по созданию модуля для PrestaShop, опубликованная на блоге web-esse.ru. К этому времени у Вас уже должен быть создан модуль с шаблоном и персональным стилем, установлен в админ панели и готов к доработке. В сегодняшнем уроке вы научитесь передавать переменные в шаблон и работать со страницей конфигурации модуля.

Ссылка «Настроить» в списке модулей появится сразу как только вы добавите в бутстрап файл метод getContent(). Метод getContent() вызывается первыми при загрузке страницы настройки. Поэтому мы можем использовать его для получения, валидации и записи данных выводимой ниже формы.
Наш метод выглядит так:

	public function getContent()
	{
		$output = null;
	
		if (Tools::isSubmit('submit'.$this->name))
		{
			$simpl_var = strval(Tools::getValue('SIMPL_VAR'));
			if (!$simpl_var  || !Validate::isGenericName($simpl_var))
				$output .= $this->displayError( $this->l('Invalid Configuration value') );
			else
			{
				Configuration::updateValue('SIMPL_VAR', $simpl_var);
				$output .= $this->displayConfirmation($this->l('Settings updated'));
			}
		}
		return $output.$this->displayForm();
	}

Рассмотрим некоторые новые функции и методы PrestaShop.

Для обработки данных мы использовали статичные методы классов Tools, Configuration и Validate. С методами класса Configuration Вы уже знакомились на третьем уроке по разработке модуля для PrestaShop. А вот методы Tools и Validate для нас новые.
Использование последнего очевидно — валидация данных (isGenericName — любые символы, кроме ^[^<>=#{} ).

У Tools применение немного шире и как нибудь я посвящу ему отдельный пост:
-isSubmit() — проверяет была ли попытка отправки данных или это правая загрузка страницы с формой.
Соответственно если форма уже заполнена и отправлена, то мы начинаем работать с данными, иначе — пропускаем этот блок и сразу генерируем форму с помощью метода $this->displayForm()
-getValue() — получает значение переменной из POST или GET массива

За генерацию формы как уже сказано выше отвечает метод displayForm()

	public function displayForm()
	{
		// Get default Language
		$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
		 
		// Init Fields form array
		$fields_form[0]['form'] = array(
				'legend' => array(
						'title' => $this->l('Settings'),
						'image' => _PS_ADMIN_IMG_.'information.png'
				),
				'input' => array(
						array(
								'type' => 'text',
								'label' => $this->l('Configuration value'),
								'name' => 'SIMPL_VAR',
								'size' => 20,
								'required' => true,
								'desc' => $this->l('my note'),
						)
				),
				'submit' => array(
						'title' => $this->l('Save'),
						'class' => 'button'
				)
		);
		 
	}

С методом Configuration::get мы уже знакомы, а вот билдер формы будем использовать впервые. При подготовке генерации формы, мы должны для каждого элемента задать массив свойств (названия, размер, тип полей и т.п). Причём если на странице должно быть 2 не зависимые формы, то нужно использовать два отдельных билдера: $fields_form[0] и $fields_form[1].

Наша переменная $fields_form (допустимо использовать $this->fields_form[0][‘form’]) содержит многомерный массив свойств (legend, input, submit). Каждый из массивов в свою очередь содержит подробное описание объектов, которые должна содержать форма (‘title’, ‘type’, ‘name’….).

Как я уже писала этим действием мы только сообщаем какие поля хотели бы видеть в будущей форме, но для того чтоб форма сгенерировалась нужно прибегнуть к специальному классу HelperForm(). Кстати, понятие хелперов добавилось в PrestaShop только с версии 1.5, механизм очень интересный и имеет много тонкостей, поэтому заслуживает отдельной главы. Сейчас остановимся только на нужных нашему модулю моментах.

Создание нового объекта хелпера

$helper = new HelperForm();

Перед генерацией формы зададим значения для служебных переменных. Назначение многих из них очевидно из названия, моэтому расшифровки давать не буду.

		// Module, token and currentIndex
		$helper->module = $this;
		$helper->name_controller = $this->name;
		$helper->token = Tools::getAdminTokenLite('AdminModules');
		$helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;
		 
		// Language
		$helper->default_form_language = $default_lang;
		$helper->allow_employee_form_lang = $default_lang;

Все кнопки по работе со страницей удобно выводить в тулбар.

	 
		$helper->title = $this->displayName;
		$helper->show_toolbar = true;        // false -> remove toolbar
		$helper->toolbar_scroll = true;      // yes - > Toolbar is always visible on the top of the screen.
		$helper->submit_action = 'submit'.$this->name;
		$helper->toolbar_btn = array(
				'save' =>
				array(
						'desc' => $this->l('Save'),
						'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
						'&token='.Tools::getAdminTokenLite('AdminModules'),
				),
				'back' => array(
						'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
						'desc' => $this->l('Back to list')
				)
		);

Назначим значения для наших (пользовательских) данных

$helper->fields_value['SIMPL_VAR'] = Configuration::get('SIMPL_VAR');

После назначения всех переменных вызываем метод генерации формы

return $helper->generateForm($fields_form);
P.S. Это урок из цикла статей по разработке модуля для PrestaShop:
Урок 1 — Структура модуля PrestaShop
Урок 2 — Создание простого модуля PrestaShop
Урок 3 — Создание простого модуля PrestaShop — установка
Урок 4 — Создание шаблона для модуля PrestaShop.
Урок 5 — текущий
Для удобства все инструкции собраны в pdf документе — скачать инструкцию PrestaShop.

2 ответа к “Добавление конфигурационной страницы для админки PrestaShop”

Здравствуйте, спасибо за уроки. У меня есть вопрос:
Я сделал тему, и хочу теперь сделать модуль, который бы из админки мог менять global.css… Некий кастомайзер для людей, отказывающихся что-то менять в блокноте.

Ну допустим «Изменить основной цвет фона:» и даю возможность человеку вписать допустим #000000 (в идеале выбрать через colorpicker), нажать «сохранить» и global.css перезапишется. Аналогично менять и другие стили, вплоть до логотипа float:left / float:right и тому подобное.

Подскажите, есть ли илеи как это реализовать, или хотя бы если вы встречали такой модуль у кого-то, можете скинуть ссылку?

отдельного модуля для этих целей я не встречала, но фукнкционал реализован во многих платных шаблонах. Передать в css смарти преременны у вас не получится, это можно сделать только в tpl файл.

Обсуждение закрыто.