UPD Указанная константа не всегда помогает, потому что редирект помимо прочего заложен еще и в ряде компонентов. Например в bitrix:socialnetwork_group происходит вызов CSocNetLogComponent::redirectExtranetSite, который эту константу не учитывает.
Мне помогло в настройках модуля "Экстранет" - /bitrix/admin/settings.php?lang=ru&mid=extranet - поставить параметр "Код сайта экстранета" в значение "Нет", благо это оказалось применимо в моем случае.
Как я уже писал чуть выше, сам код на VBA не стирается, а вот с запуском этого макроса есть проблемы, приходится привязываться к специфическим событиям, либо биндить запуск макроса на сочетание клавиш.
Открываю файл таким образом: [CODE]// Create new PHPExcel object $template = $_SERVER['DOCUMENT_ROOT'] . '/price/PriceTemplate.xlsm'; $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load($template); [/CODE] Дальше добавляю строки, а затем сохраняю вот так: [CODE]$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save(__DIR__.'/Price.xlsm');[/CODE] Так что файлы *.xlsm поддерживаются, по крайней мере частично. Потому что в получившемся файле код макроса виден в режиме разработчика.
Библиотеку LibXL в гугле находил, она вроде как платная. Ну и не всякий хостер согласится устанавливать сторонние библиотеки.
Юрий Саприкин, может быть вам копнуть в сторону облегчения шаблона? 1,3 Мб это выглядит внушительно для шаблона. Сколько же он будет весить с данными?
По поводу макросов. Обнаружил, что при сохранении код на Visual Basic не пропадает, а вот элементы управления (в моем случае требовалась кнопка) стираются.
Я попытался привязаться к событию Workbook_Open(), чтобы средствами VBA инициализировать элементы управления, но PHPExcel подкинул проблему: при сохранении файла он генерирует еще один Workbook, обызвает его "Workbook1", и событие соответственно не срабатывает.
В итоге получилось привязаться в событию Worksheet_Activate(), которое срабатывает при переключении между листами прайса.
Как один из вариантов решения — можно попробовать указать хоткей для макроса, и запускать его комбинацией клавиш.
Задача: автоматически генерируемый прайс-лист в формате xls. Делается родным PHPExcel вообще без проблем. Если бы не нюанс. В итоговом файле должны быть встроенные макросы.
Функциональность макроса особого значения не имеет, но если коротко: в прайсе можно у товаров проставить требуемое количество, и должна быть кнопка, по нажатию которой выбранные позиции сохраняются в отдельном xls-файле, который можно отправить менеджеру.
Проблема в том, что тот самый родной и многократно проверенный в бою PHPExcel безжалостно режет макросы при сохранении.
Я делал таким образом: шаблон прайс-листа с простейшим макросом открывался PHPExcel-ем, далее туда добавлялись данные (товары и цены), а затем файл сохранялся тем же самым PHPExcel-ем под другим именем. В полученном файле макросы не отрабатывали.
Если вдруг кто-то делал подобную задачу, поделитесь идеями.
[B]Проблема одной строкой[/B]: заказчик хочет полностью переделать структуру разделов каталога на сайте, не внося при этом никаких изменений в своей 1С.
Я сейчас размышляю, как это можно сделать наиболее логично и эффективно. Если у кого-то есть дельные мысли и идеи, то я буду рад их здесь прочитать.
Пока что у меня две идеи.
1. Сделать отдельный инфоблок, в который вбить требуемую структуру разделов. У товаров завести свойство с привязкой к разделам этого инфоблока. В итоге работать через это свойство. Это значит что придется проставить привязки вручную, переделать все меню по разделам + заморочиться с ЧПУ и индексацией для поиска.
2. Настроить интеграцию с 1С таким образом, чтобы на сайт выгружались только товары, без разделов. А привязки к разделам делать опять же вручную на стороне сайта.
Надеюсь на конструктивную критику и предложения. Спасибо.
Используйте фильтрацию. В настройках компонента есть параметр FILTER_NAME. Укажите там название глобальной переменной с фильтром. Примерно так:
"FILTER_NAME" => "arrWeeklyMostPopularFilter"
Соответственно перед вызовом компонента сформируйте фильтр. Примерно так:
global $arrWeeklyMostPopularFilter; $arrWeeklyMostPopularFilter = array( '>=ACTIVE_FROM' => '...', // дата начала текущей недели '<=ACTIVE_TO' => '...' // дата конца текущей недели );
Про фильтр можно почитать в документации к методу [URL=https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php]CIBlockElement::GetList()[/URL]
Можно в файле PHPExcel/Autoloader.php закомментировать проверку на значение [COLOR=#555c69]mbstring.func_overload: [/COLOR][CODE]if (ini_get('mbstring.func_overload') & 2) { throw new PHPExcel_Exception('Multibyte function overloading in PHP must be disabled for string functions (2).'); }[/CODE]Костыль, конечно, но все работает. По крайней мере при выполнении базовых задач (импорт/экспорт в xls) я не замечал каких-то косяков.