+38(073) 413-59-71  info@binliz.org.ua

Стоит ли магазин на битрикс своих денег часть 2 (цены)

 22.09.2016
php, 1C-Bitrix

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

Сегодня мы создадим в элементе вкладку цены.

Для начала мы в админке выведем меню с магазином чтобы можно было выводить админские страницы, и на них производить какие-то действия.

В модуде создаем папку admin в ней файл menu.php

$module_name ="binliz.sale";
		use Biniz\Sale;

global $adminMenu;
	$aMenu[] = array(
			"parent_menu" => "global_menu_binliz_store",
			"sort" => 100,
			"text" => "Типы цен",
			"title" => "",
			"icon" => "binliz_menu_icon_orders",
			"page_icon" => "binliz_menu_icon_orders",
			"items_id" => "menu_sale_binliz_price_type",
			"url"=>"binliz_store_price_types.php"
			);

if (!empty($aMenu))
	return $aMenu;
else
	return $false;

Таким образом мы указали, что в левом меню создать в разделе global_menu_binliz_store меню типы цен но по сути у нас же нет такого глобального меню... Надо бы его создать. Потому полезем опять в события т.е. как и в прошлый раз создаем файл local/modules/binliz.sale/lib/events/globalmenu.php содержание:

	namespace Binliz\Sale\Events;

	class GlobalMenu extends Base{
			protected $eventlist = [
					['module'=>'main','event'=>'OnBuildGlobalMenu','method'=>'BinLizDoBuildGlobalMenu'],
			];
			public function BinLizDoBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu){
				$aGlobalMenu['global_menu_binliz_store'] = Array(
			            'menu_id' => 'binliz_store',
			            'text' => 'Магазин',
			            'title' => 'Магазин',
			            'sort' => 300,
			            'items_id' => 'global_menu_binliz_store',
			            'help_section' => 'binliz_store',
			            'items' => Array()
			        );
			}
	}

Ну вот добавим в наш events.php new \Binliz\Sale\Events\GlobalMenu; и чудо сверилось и собсвенно вот оно 

Ну что-же создаем табличку для типов цен, что нам там надо? А в принципе ничего индификатор цены, как-то ее обозвать, если следовать битриксу то сделать базовую цену но я думаю это лишнее и группы пользователей которым данная цена доступна значит таблиц у нас будет 2 первая описательная вторая связь с группами:

CREATE TABLE `b_binliz_sale_catalog_price_type` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `SORT` int(11) NOT NULL,
  `ACTIVE` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `b_binliz_sale_catalog_price_type`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `b_binliz_sale_catalog_price_type`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;

И вторая табличка:

CREATE TABLE `b_binliz_sale_catalog_price_type_group` (
  `ID` int(11) NOT NULL,
  `PRICE_TYPE` int(11) NOT NULL,
  `GROUP_ID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `b_binliz_sale_catalog_price_type_group`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `b_binliz_sale_catalog_price_type_group`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;

И их классы:

salecatalogpricetype.php

namespace Binliz\Sale;

use Bitrix\Main,
	Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);


class SaleCatalogPriceTypeTable extends Main\Entity\DataManager
{
	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_binliz_sale_catalog_price_type';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return array(
			'ID' => array(
				'data_type' => 'integer',
				'primary' => true,
				'autocomplete' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_ENTITY_ID_FIELD'),
			),
			'NAME' => array(
				'data_type' => 'string',
				'required' => true,
				'validation' => array(__CLASS__, 'validateName'),
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_ENTITY_NAME_FIELD'),
			),
			'SORT' => array(
				'data_type' => 'integer',
				'required' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_ENTITY_SORT_FIELD'),
			),
			'ACTIVE' => array(
				'data_type' => 'integer',
				'required' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_ENTITY_ACTIVE_FIELD'),
			),
		);
	}
	/**
	 * Returns validators for NAME field.
	 *
	 * @return array
	 */
	public static function validateName()
	{
		return array(
			new Main\Entity\Validator\Length(null, 50),
		);
	}
}

salecatalogpricetypegroup.php

namespace Binliz\Sale;

use Bitrix\Main,
	Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class SaleCatalogPriceTypeGroupTable extends Main\Entity\DataManager
{
	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_binliz_sale_catalog_price_type_group';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return array(
			'ID' => array(
				'data_type' => 'integer',
				'primary' => true,
				'autocomplete' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_GROUP_ENTITY_ID_FIELD'),
			),
			'PRICE_TYPE' => array(
				'data_type' => 'integer',
				'required' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_GROUP_ENTITY_PRICE_TYPE_FIELD'),
			),
			'GROUP_ID' => array(
				'data_type' => 'integer',
				'required' => true,
				'title' => Loc::getMessage('SALE_CATALOG_PRICE_TYPE_GROUP_ENTITY_GROUP_ID_FIELD'),
			),
		);
	}
}

Красота таблички есть надо их задействовать, создаем в админке страницу. Для этого создаем 3 файла: первый в bitrix/admin/binliz_store_price_types.php и точно такой же local/modules/binliz.sale/install/admin/binliz_store_price_types.php содержание его:

require_once($_SERVER["DOCUMENT_ROOT"]."/local/modules/binliz.sale/admin/binliz_store_price_types.php");

И следующий файл: local/modules/binliz.sale/admin/binliz_store_price_types.php его содержание - обычный список:

define("ADMIN_MODULE_NAME", "binliz.sale");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
IncludeModuleLangFile(__FILE__);
IncludeModuleLangFile(__DIR__.'/menu.php');
if (!$USER->IsAdmin())
{
	$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
}
if (!CModule::IncludeModule(ADMIN_MODULE_NAME))
{
	$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
}
use Binliz\Main;
use Bitrix\Main\Application;

$APPLICATION->SetTitle(GetMessage("HEADER_TITLE"));

CAdminMessage::ShowMessage($strError);

$context = Application::getInstance()->getContext();
$request = $context->getRequest();
$flag = $request->isPost();
$sTableID = "tbl_binliz_sale_cataolg_price_type";
$oSort = new CAdminSorting($sTableID, "NAME", "asc");
$lAdmin = new CAdminList($sTableID, $oSort);

$arHeaders = array(
	array("id"=>"ID", "content"=>"ID", "sort"=>"ID", "default"=>true),
	array("id"=>"SORT", "content"=>GetMessage('HEAD_SORT'), "sort"=>"SORT","default"=>true),
	array("id"=>"NAME", "content"=>GetMessage('HEAD_NAME'), "sort"=>"NAME", "default"=>true),
	array("id"=>"ACTIVE", "content"=>GetMessage('HEAD_ACTIVE'), "sort"=>"ACTIVE","default"=>true)
);

$lAdmin->AddHeaders($arHeaders);

// menu
if ($_REQUEST["mode"] !== "list")
{
	$aMenu = array(
		array(
			"TEXT"	=> GetMessage('BUTTON_ADD'),
			"TITLE"	=> GetMessage('BUTTON_ADD'),
			"LINK"	=> "binliz_store_price_types_edit.php?lang=".LANGUAGE_ID,
			"ICON"	=> "btn_new",
		)
	);

	$context = new CAdminContextMenu($aMenu);
}



// select data
$rsData = Binliz\Sale\SaleCatalogPriceTypeTable::getList(array(
	"select" => $lAdmin->GetVisibleHeaderColumns(),
	"order" => array($by => strtoupper($order))
));

$rsData = new CAdminResult($rsData, $sTableID);
$rsData->NavStart();

// build list
$lAdmin->NavText($rsData->GetNavPrint(GetMessage("PAGES")));
while($arRes = $rsData->NavNext(true, "f_"))
{
	$row = $lAdmin->AddRow($f_ID, $arRes);

	$can_edit = true;

	$arActions = Array();

	$arActions[] = array(
		"ICON"=>"edit",
		"TEXT"=>GetMessage($can_edit ? "MAIN_ADMIN_MENU_EDIT" : "MAIN_ADMIN_MENU_VIEW"),
		"ACTION"=>$lAdmin->ActionRedirect("binliz_store_price_types_edit.php?ID=".$f_ID)
	);

	$arActions[] = array(
		"ICON"=>"delete",
		"TEXT" => GetMessage("MAIN_ADMIN_MENU_DELETE"),
		"ACTION" => "if(confirm('".GetMessageJS('ADMIN_DELETE_CONFIRM')."')) ".
			$lAdmin->ActionRedirect("binliz_store_price_types_edit.php?action=delete&ID=".$f_ID.'&'.bitrix_sessid_get())
	);

	$row->AddActions($arActions);
}


// view

if ($_REQUEST["mode"] == "list")
{
	require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php");
}
else
{
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");

	$context->Show();
}

$lAdmin->CheckListMode();

$lAdmin->DisplayList();


if ($_REQUEST["mode"] == "list")
	require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin_js.php");
else 
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");

Обновим наше меню:

$module_name ="binliz.sale";
		use Biniz\Sale;

global $adminMenu;
	$aMenu[] = array(
			"parent_menu" => "global_menu_binliz_store",
			"sort" => 100,
			"text" => "Типы цен",
			"title" => "",
			"icon" => "binliz_menu_icon_orders",
			"page_icon" => "binliz_menu_icon_orders",
			"items_id" => "menu_sale_binliz_price_type",
			"url"=>"binliz_store_price_types.php",
			"more_url" => array(
					"binliz_store_price_types_edit.php?lang=".LANGUAGE_ID,
			)
			);

if (!empty($aMenu))
	return $aMenu;
else
	return $false;

Добавим языковые переменные в соответсвующие файлы И вот что у нас уже вышло:

. И начнем создвать страницу создания редактирования типа цены в следующем посте так как этот уже очень длинный