Korusol
8/29/2016 - 7:04 PM

Добавление seo-highload блока

Добавление seo-highload блока

//<?php

$highBlockTypeProduct = array(
    'artmix_hl_seo',
    'ArtmixHLSeo',
    array(
        'FIELDS' => array(
            'UF_KEY' => array('Y', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Уникальный ключ',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Уникальный ключ',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                ),
                'SHOW_FILTER' => 'S',
            )),
            'UF_NAME' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Название',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Название',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                ),
                'SHOW_FILTER' => 'S',
            )),
            'UF_H1' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'H1',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'H1',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                ),
                'SHOW_FILTER' => 'S',
            )),
            'UF_TITLE' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Title',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Title',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 2,
                ),
                'SHOW_FILTER' => 'S',
            )),
            'UF_DESCRIPTION' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Description',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Description',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 2,
                )
            )),
            'UF_KEYWORDS' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Keywords',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Keywords',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 2,
                )
            )),
            'UF_IMAGE_ALT' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Image alt',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Image alt',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 2,
                )
            )),
            'UF_IMAGE_TITLE' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Image title',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Image title',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 2,
                )
            )),
            'UF_TEXT_BOTTOM' => array('N', 'string', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Text bottom',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Text bottom',
                ),
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 10,
                )
            )),
            'UF_TEXT_BOTTOM_MULTI' => array('N', 'multi_string_block', array(
                'EDIT_FORM_LABEL' => array(
                    'ru' => 'Text bottom multi',
                ),
                'LIST_COLUMN_LABEL' => array(
                    'ru' => 'Text bottom multi',
                ),
                'MULTIPLE' => 'Y',
                'SETTINGS' => array(
                    'SIZE' => 60,
                    'ROWS' => 10,
                )
            )),
        ),
        'ALTER' => array(
            'ALTER TABLE #TABLE_NAME# MODIFY UF_KEY VARCHAR(100);',
        ),
        'INDEXES' => array(
            array('#TABLE_NAME#', 'ix_#TABLE_NAME#_key', array('UF_KEY'))
        )
    )
);

function oGetMessage($key, $fields)
{
    $messages = array(
        'ERROR_INCLUDE_HIGHLOADBLOCK_MODULE' => 'Ошибка подключения модуля «#MODULE#»',
        'HIGHLOADBLOCK_NAME_IS_INVALID' => 'Неверное имя для хайлоад блока',
        'HIGHLOADBLOCK_EXISTS' => 'Highload Block #NAME# уже существует',
        'HIGHLOADBLOCK_ADDED_INFO' => 'Highload Block #NAME# [#ID#] добавлен',
        'HIGHLOADBLOCK_ADDED_INFO_ERROR' => 'Ошибка добавления Highload блока #NAME#: #ERROR#',
        'HIGHLOADBLOCK_ADDED_INDEX_INFO' => 'Индекс #INDEX_NAME# к таблице #TABLE_NAME# успешно добавлен',
        'HIGHLOADBLOCK_ALTER_SUCCESS_INFO' => 'ALTER TABLE успешно выполнен: #ROW#',
        'HIGHLOADBLOCK_ADDED_INDEX_ERROR' => 'Ошибка добавление индекса #INDEX_NAME# к таблице #TABLE_NAME#: #ERROR#',

        'USER_TYPE_UPDATE' => 'Пользовательское свойство #FIELD_NAME# [#ENTITY_ID#] успешно обновлено',
        'USER_TYPE_UPDATE_ERROR' => 'Ошибка обновления пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#',
        'USER_TYPE_ADDED' => 'Пользовательское свойство #FIELD_NAME# [#ENTITY_ID#] успешно добавлено',
        'USER_TYPE_ADDED_ERROR' => 'Ошибка добавления пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#',
        'USER_TYPE_ENUMS_SET_ERROR' => 'Ошибка установки значений пользовательского свойства #FIELD_NAME# [#ENTITY_ID#]: #ERROR#',
    );

    return isset($messages[$key])
        ? str_replace(array_keys($fields), array_values($fields), $messages[$key])
        : '';
}

$info = array();

function createHighLoadBlock($tableName, $highBlockName, array $hlData)
{
    global $info, $APPLICATION;

    foreach (array('highloadblock') as $moduleId) {
        if (!\Bitrix\Main\Loader::includeModule($moduleId)) {
            throw new \Bitrix\Main\SystemException(oGetMessage('ERROR_INCLUDE_HIGHLOADBLOCK_MODULE', array(
                '#MODULE#' => $moduleId
            )));
        }
    }

    $connection = \Bitrix\Main\Application::getConnection();

    $sqlHelper = $connection->getSqlHelper();

    $hlblock = Bitrix\Highloadblock\HighloadBlockTable::getList(array(
            'filter' => array(
                'TABLE_NAME' => $tableName,
            ))
    )->fetch();

    if (!$hlblock) {

        $highBlockName = preg_replace('/([^A-Za-z0-9]+)/', '', trim($highBlockName));

        if ($highBlockName == '') {
            throw new \Bitrix\Main\SystemException(oGetMessage('HIGHLOADBLOCK_NAME_IS_INVALID'));
        }

        $highBlockName = strtoupper(substr($highBlockName, 0, 1)) . substr($highBlockName, 1);

        $data = array(
            'NAME' => $highBlockName,
            'TABLE_NAME' => $tableName,
        );

        $result = Bitrix\Highloadblock\HighloadBlockTable::add($data);

        if ($result->isSuccess()) {
            $highBlockID = $result->getId();

            $info[] = oGetMessage('HIGHLOADBLOCK_ADDED_INFO', array(
                '#NAME#' => $highBlockName,
                '#ID#' => $highBlockID,
            ));

        } else {
            throw new \Bitrix\Main\SystemException(oGetMessage('HIGHLOADBLOCK_ADDED_INFO_ERROR', array(
                '#NAME#' => $highBlockName,
                '#ERROR#' => $result->getErrorMessages(),
            )));
        }

    } else {
        $highBlockID = $hlblock['ID'];
    }

    $oUserTypeEntity = new CUserTypeEntity();

    $sort = 500;

    foreach ($hlData['FIELDS'] as $fieldName => $fieldValue) {
        $aUserField = array(
            'ENTITY_ID' => 'HLBLOCK_' . $highBlockID,
            'FIELD_NAME' => $fieldName,
            'USER_TYPE_ID' => $fieldValue[1],
            'SORT' => $sort,
            'MULTIPLE' => 'N',
            'MANDATORY' => $fieldValue[0],
            'SHOW_FILTER' => 'N',
            'SHOW_IN_LIST' => 'Y',
            'EDIT_IN_LIST' => 'Y',
            'IS_SEARCHABLE' => 'N',
            'SETTINGS' => array(),
        );

        if (isset($fieldValue[2]) && is_array($fieldValue[2])) {
            $aUserField = array_merge($aUserField, $fieldValue[2]);
        }

        $resProperty = CUserTypeEntity::GetList(
            array(),
            array('ENTITY_ID' => $aUserField['ENTITY_ID'], 'FIELD_NAME' => $aUserField['FIELD_NAME'])
        );

        if ($aUserHasField = $resProperty->Fetch()) {
            $idUserTypeProp = $aUserHasField['ID'];
            if ($oUserTypeEntity->Update($idUserTypeProp, $aUserField)) {
                $info[] = oGetMessage('USER_TYPE_UPDATE', array(
                    '#FIELD_NAME#' => $aUserHasField['FIELD_NAME'],
                    '#ENTITY_ID#' => $aUserHasField['ENTITY_ID'],
                ));
            } else {
                if (($ex = $APPLICATION->GetException())) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('USER_TYPE_UPDATE_ERROR', array(
                        '#FIELD_NAME#' => $aUserHasField['FIELD_NAME'],
                        '#ENTITY_ID#' => $aUserHasField['ENTITY_ID'],
                        '#ERROR#' => $ex->GetString(),
                    )));
                }
            }
        } else {
            if ($idUserTypeProp = $oUserTypeEntity->Add($aUserField)) {
                $info[] = oGetMessage('USER_TYPE_ADDED', array(
                    '#FIELD_NAME#' => $aUserField['FIELD_NAME'],
                    '#ENTITY_ID#' => $aUserField['ENTITY_ID'],
                ));
            } else {
                if (($ex = $APPLICATION->GetException())) {
                    throw new \Bitrix\Main\SystemException(oGetMessage('USER_TYPE_ADDED_ERROR', array(
                        '#FIELD_NAME#' => $aUserField['FIELD_NAME'],
                        '#ENTITY_ID#' => $aUserField['ENTITY_ID'],
                        '#ERROR#' => $ex->GetString(),
                    )));
                }
            }
        }

        $sort += 100;
    }

    $hlEntity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity(
        \Bitrix\Highloadblock\HighloadBlockTable::getRowById($highBlockID)
    );

    if (isset($hlData['ALTER']) && is_array($hlData['ALTER'])) {

        foreach ($hlData['ALTER'] as $alterData) {

            if ($connection->query(
                str_replace(
                    '#TABLE_NAME#',
                    $sqlHelper->quote($hlEntity->getDBTableName()),
                    $alterData
                )
            )
            ) {
                $info[] = oGetMessage('HIGHLOADBLOCK_ALTER_SUCCESS_INFO', array(
                    '#ROW#' => str_replace(
                        '#TABLE_NAME#',
                        $sqlHelper->quote($hlEntity->getDBTableName()),
                        $alterData
                    )
                ));
            }

        }

    }

    if (isset($hlData['INDEXES']) && is_array($hlData['INDEXES'])) {

        foreach ($hlData['INDEXES'] as $indexData) {

            $iResult = $connection->createIndex(
                str_replace('#TABLE_NAME#', $hlEntity->getDBTableName(), $indexData[0]),
                str_replace('#TABLE_NAME#', $hlEntity->getDBTableName(), $indexData[1]),
                $indexData[2]
            );

            if ($iResult) {
                $info[] = oGetMessage('HIGHLOADBLOCK_ADDED_INDEX_INFO', array(
                    '#INDEX_NAME#' => str_replace('#TABLE_NAME#', $hlEntity->getDBTableName(), $indexData[1]),
                    '#TABLE_NAME#' => $hlEntity->getDBTableName(),
                ));
            } else {
                throw new \Bitrix\Main\SystemException(oGetMessage('HIGHLOADBLOCK_ADDED_INDEX_ERROR', array(
                    '#INDEX_NAME#' => str_replace('#TABLE_NAME#', $hlEntity->getDBTableName(), $indexData[1]),
                    '#TABLE_NAME#' => $hlEntity->getDBTableName(),
                    '#ERROR#' => '',
                )));
            }

        }

    }

    return $highBlockID;

}

global $DB;

$DB->StartTransaction();

try {

    $idNewHighLoadBlock = createHighLoadBlock($highBlockTypeProduct[0], $highBlockTypeProduct[1], $highBlockTypeProduct[2]);

    $DB->Commit();

    echo implode("<br>\n", $info);

} catch (\Bitrix\Main\SystemException $e) {

    $DB->Rollback();

    echo sprintf("%s<br>\n%s",
        $e->getMessage(),
        implode("<br>\n", $info)
    );

}