• Как сделать, чтобы news.detail понимал, что это за элемент?

    meowto16
    @meowto16
    Делаю штуки
    Привет, в CONDITION у тебя стоит регулярка, я так понимаю это ELEMENT_CODE, тогда дописываешь RULE для своего правила в urlrewrite
    <?php
    $arUrlRewrite=array (
      3 => 
      array (
        'CONDITION' => '#^/about/([0-9a-zA-Z_-]+)/.*#',
        'RULE' => 'ELEMENT_CODE=$1',
        'ID' => 'site:news',
        'PATH' => '/about/detail.php',
        'SORT' => 100,
      ),


    В вызове компонента пишешь так:
    <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    $APPLICATION->SetTitle("Title");?>
    <?$APPLICATION->IncludeComponent(
      "site:news.detail",
      "decision",
      Array(
        "ACTIVE_DATE_FORMAT" => "d.m.Y",
        "ADD_ELEMENT_CHAIN" => "N",
        "ADD_SECTIONS_CHAIN" => "Y",
        "AJAX_MODE" => "N",
        "AJAX_OPTION_ADDITIONAL" => "",
        "AJAX_OPTION_HISTORY" => "N",
        "AJAX_OPTION_JUMP" => "N",
        "AJAX_OPTION_STYLE" => "Y",
        "BROWSER_TITLE" => "-",
        "CACHE_GROUPS" => "Y",
        "CACHE_TIME" => "36000000",
        "CACHE_TYPE" => "A",
        "CHECK_DATES" => "Y",
        "DETAIL_URL" => "",
        "DISPLAY_BOTTOM_PAGER" => "Y",
        "DISPLAY_DATE" => "Y",
        "DISPLAY_NAME" => "Y",
        "DISPLAY_PICTURE" => "Y",
        "DISPLAY_PREVIEW_TEXT" => "Y",
        "DISPLAY_TOP_PAGER" => "N",
        "ELEMENT_CODE" => $_REQUEST["ELEMENT_CODE"], // данный параметр тебе передаст urlrewrite
        "ELEMENT_ID" => "",
        "FIELD_CODE" => array("",""),
        "IBLOCK_ID" => "13",
        "IBLOCK_TYPE" => "content",
        "IBLOCK_URL" => "",
        "INCLUDE_IBLOCK_INTO_CHAIN" => "Y",
        "MESSAGE_404" => "",
        "META_DESCRIPTION" => "-",
        "META_KEYWORDS" => "-",
        "PAGER_BASE_LINK_ENABLE" => "N",
        "PAGER_SHOW_ALL" => "N",
        "PAGER_TEMPLATE" => ".default",
        "PAGER_TITLE" => "Страница",
        "PROPERTY_CODE" => array("",""),
        "SET_BROWSER_TITLE" => "Y",
        "SET_CANONICAL_URL" => "N",
        "SET_LAST_MODIFIED" => "N",
        "SET_META_DESCRIPTION" => "Y",
        "SET_META_KEYWORDS" => "Y",
        "SET_STATUS_404" => "N",
        "SET_TITLE" => "Y",
        "SHOW_404" => "N",
        "STRICT_SECTION_CHECK" => "N",
        "USE_PERMISSIONS" => "N",
        "USE_SHARE" => "N"
      )
    );?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
    Ответ написан
    8 комментариев
  • Как бороться с DDOS атакой на сайт в виде частых POST запросов на главную страницу?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Перекиньте DNS на халявную версию CloudFlare. Потом можно будет обратно, если будет желание.
    Ответ написан
    5 комментариев
  • Пишет Class not found. Как правильно определить пространство имен?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Эээ... а что вы сделать то хотите ?

    Я вот о чем говорю: при использовании ООП в bitrix вы сталкиваетесь сразу с 2 большими стенами - применение ооп и битрикс. Прежде чем разбирать конкретный код хотелось бы немножко просветить вас в самой архитектуре битрикса.
    В терминологии Битрикса он использует концепцию MVC, но в рамках битрикса, а это означает что на любой странице где вы общаетесь с ним вы должны подключить пролог (хотя бы prolog_before) и эпилог (хотя бы epilog_after, ну в идеале). Именно "компонент" и является тем самым MVC (Вообще это скорее VC + row access, так как модели по сути нет). Есть класс CBitrixComponent (контроллер) и класс CBitrixComponentTemplate (который совместно с файлами шаблона и образует view).

    Вызов компонента происходит из глобальной переменной $APPLICATION путем метода IncludeComponent. До версии 14 (если мне не изменяет память) вообще не было такого понятия как class.php, где можно было отнаследоваться от CBitrixComponent и перекрыть какие-нибудь функции (шаблонизатор к примеру сменить), а после нового ядра d7 появилась возможность отнаследоваться от CBitrixComponent и в файле class.php разместить свой код (таким образом мы сохраняем и class.php с новыми функциями и component.php с логикой), а перекрывая метод executeComponent вы можете избавиться и от component.php.

    С точки зрения архитектуры (рекомендую изучить документацию, она очень обширна и познавательна) все компоненты должны лежать в так называемом пространстве имен, чем обычно служит ник-нейм или название компании (Естественно начинается не с цифры и содержит только латинские буквы), которые в свою очередь могут располагаться в /bitix/components/#пространство_имен#/#название_компонента#/

    Теперь построчно разберем Ваш вопрос:

    Вы положили свой класс сюда: /bitrix/templates/app/Pi/Test.php, что является неверным с точки зрения архитектуры, так как поместили класс отвечающий за контроллер в папку с шаблоном. Если вы не пишете свой модуль вы можете подключить его например в /local/php_interface/classes/ (пример надуманный, можете просто в /local/php_interface положить или сразу в init.php), однако для этого вы должны будете написать autoloader, так как у битрикса он работает только для модулей. Предположим вы в init.php напишете грубый require_once с файлом.

    Затем вы делаете следующее:

    Что является неверным, так как по сути вы обьявляете неймспейс для файла и это с точки зрения php выглядит вот так в конечном итоге:

    class app\Pi\test extends app\Pi\CBitrixComponent
    {
    // ...
    }

    А класса app\Pi\CBitrixComponent не существует. Так что вам нужно поправить пример хотя бы так:

    class test extends \CBitrixComponent

    Настоятельно рекомендую прочитать документацию или хотя бы посмотреть видео с академии битрикс. Сама система не подарок, а другой программист который увидит ваш код будет говорить что это битрикс виноват.
    Ответ написан
    Комментировать
  • Как в PhpStorm добавить строку в коде в закладки (что бы быстро переходить)?

    Mesuti
    @Mesuti
    Быстро установить закладку f11
    Перейти к закладке Shift+F11
    Дать имя закладке Ctrl+F11

    \\
    кому пригодилось - лайк)
    Ответ написан
    Комментировать
  • Как парсить большие объёмы Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Использовать консольные контроллеры вместо web и установить периодичность его работы.

    2. Использовать очереди. Кидаете задачу в очередь. Консольная команда проходит по всем очередям и выполняет задачу. Схоже с первым вариантом.

    3. Самый не актуальный, но действенный в вашей ситуации - использовать для запросов не объекты и Active Query, а «голые» SQL запросы которые выдают данные в массиве. AR потребляет не мало памяти на объекты. На какое то время вас это спасёт. Но лучше использовать консольные команды. Это больше подходит для подобный задач.

    4. Подготавливать денормализованные данные для быстрого запроса в отдельную таблицу СУБД или использовать быстрые NOSQL базы данных. И уже из них считывать ваши данные.
    Ответ написан
    1 комментарий
  • Как отключить передвижение соседних вершин?

    savvov
    @savvov
    дизайнер, мультипликатор
    включено пропорциональное редактирование (гор.клавиша О)
    5cc0361ee4fd3003620717.jpeg
    Ответ написан
    1 комментарий
  • Как запустить Task на определённое время?

    @basrach
    string serverName = null;
    	var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
    	Task.Run(() => serverName = Server.GetServerName(), cancellationTokenSource.Token);


    В таком случае вызов Server.GetServerName() будет происходить в фоне и не заблокирует основной поток. Теоретически через 30 секунд задача будет отменена. Но по факту задача будет висеть в режиме ожидание ответа по сети до тех пор, пока ответ не придет, и только после того как придет ответ будет выбран свободный поток из пула, который возьмет эту задачу для продолжения выполнения и возможно прервет её, но возможно что и не прервет.

    Если вам гарантированно нужно чтобы задача не выполнилась после истечения 30 секунд, то нужно переделать метод GetServerName() следующим образом:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    	
    	cancellationToken.ThrowIfCancellationRequested();
    }

    либо:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    
    	if (cancellationToken.IsCancellationRequested)
    	{
    		return;
    	}
    }

    ну и соответственно его вызов будет выглядеть в таком случае вот так:
    Server.GetServerName(cancellationTokenSource.Token)
    Ответ написан
    Комментировать
  • Как настроить постоянный language injection в строках в PhpStorm?

    @mmjurov
    Если у вас свежая версия шторма, то Language Injection идет "из коробки". Если же нет, то надо установить плагин IntelliLang
    Сами настройки языковых вставок тут - File | Settings | Editor | Language Injections
    В общем-то все это описано в официальном мануале JetBrains и как автор того самого "блога php разработчика" не думал, что могут возникнуть проблемы с активацией данного функционала.

    UPD. Бред написал .. вечером уже особо голова не варит.
    Конкретно в вашем примере должен помочь Alt + Enter. Он заинжектит всю строку целиком.
    Кстати, для того, что изображено на правом скрине я специально ничего не настраивал, как-то оно само так из коробки заработало :)

    Вот гифка
    bd9cec33c7be48608853fdae7b279a81.gif

    Правда в некоторых местах почему-то не работает. Банально могу перетащить данный кусок кода в верхнюю часть файла и уже не могу сделать вставку языка - недоступен выбор в панельке из Alt+Enter
    Ответ написан
    1 комментарий
  • Как получить данные из Highload-блока?

    @haramba
    Почему вопросы о про битрикс такие тупые?
    примерно так, запускать самому лень, уж извините :)
    $tableName = "b_hlbd_manufacturer";
        $hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getList(
            array("filter" => array(
                'TABLE_NAME' => $tableName
            ))
        )->fetch();
        if (isset($hlblock['ID']))
        {
            $entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
            $entity_data_class = $entity->getDataClass();
            $res = $entity_data_class::getList( array('filter'=>array()) );
             while ($item = $res->fetch()
             {
                    // .... la .. la .. la
             }
             // или так $arAllRows = $res->fetchAll();
        }
    Ответ написан
    1 комментарий
  • Как определить выбранную категорию в компоненте catalog.section.list?

    sabramovskikh
    @sabramovskikh
    Можно через $arParams['SECTION_ID]
    Вообще catalog.section.list это не меню. Т.к. в нем есть кеширование, то выделение активного раздела не получится сделать без его отключения. Лучше использовать menu.section
    Ответ написан
    1 комментарий
  • Как получить дочерний объект?

    kreo_OL
    @kreo_OL
    Медузко -_-
    Любые операции поиска сжирают ресурсы, поэтому - да, использовать их не очень хорошо.
    Однако для этого можно использовать кеширование.
    То есть вы один раз находите нужный объект, сохраняете ссылку на него в переменную и далее используете переменную.
    В вашем же случае, например если у вас есть 10 спавн точек, в которые вы рандомно будете спавнить, то можно эти точки поместить в один родительский объект контейнер, и в основной скрипт ручками поместить этот контейнер в переменную, а в самом скрипте в стартовом методе написать следующее:
    Transform[] spawnPoints = _containerSpawnPoint.GetComponentsInChildren<Transform>();

    В итоге вы получите трансформы всех дочерних объектов контейнера.
    Ответ написан
    4 комментария
  • Как получить дочерний объект?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Если вы делаете это одни раз на старте и запоминаете ссылку то нормально. Один только минус, если вдруг переименуете. Если же у вас будет овер9000 точек, то вешайте на каждый компонент, а в родителе соберёте все дочерние компоненты этого типа, и далее будете использовать этот массив.
    Ответ написан
    Комментировать
  • OpenServer/ConEmu как и где добавить путь к новой программе?

    @gimade Автор вопроса
    2 часа промучался! В общем OpenServer->Настройки->Сервер. Там выбираем Свой Path + userdata/config/path.txt куда и прописываем, что нам еще надо! Ура!
    Хух... Запарился!
    Ответ написан
    Комментировать
  • Где смотреть информацию о обновлениях?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Печаль в том что нигде. Мониторить посты разработчиков, иногда они пишут пояснительные записки к крупным апдейтам.

    + ставите git||hg комитите перед накатыванием обновлений и сразу после, и получаете дельту изменений, в которой можно покапаться.
    Ответ написан
    1 комментарий
  • Как разблокировать переход по ссылке?

    Griff19
    @Griff19
    программист, поэт, музыкант :)
    Это же нужно все для работы мобильной версии, когда на неё переключаешься - все ссылки работают (и нужны они в общем для открытия следующего уровня меню)...

    Мат. часть:
    В jQuery есть один интересный метод preventDefault(), который позволяет предотвратить возникновение "действия по умолчанию" для конкретного события. Например, если в разметке есть гиперссылка, но мы хотим использовать эту ссылку как кнопку button - т.е. без перехода по URL, заданному в атрибуте href, то используется как раз preventDefault(). После этого, всё, что необходимо сделать, - это добавить вызов preventDefault() в обработчик события клика мышью.

    от сюда: www.allineed.ru/ru/jquery-articles/api-feautures/8...

    У вас в скрипте main.js
    есть такие строчки где используется event.preventDefault()
    //open/close mega-navigation
    	$('.cd-dropdown-trigger').on('click', function(event){
    		event.preventDefault();
    		toggleNav();
    	});
    
    	//close meganavigation
    	$('.cd-dropdown .cd-close').on('click', function(event){
    		event.preventDefault();
    		toggleNav();
    	});
    
    	//on mobile - open submenu
    	$('.has-children').children('a').on('click', function(event){
    		//prevent default clicking on direct children of .cd-dropdown-content 
    		event.preventDefault();
    		var selected = $(this);
    		selected.next('ul').removeClass('is-hidden').end().parent('.has-children').parent('ul').addClass('move-out');
    	});


    Копайте в эту сторону...
    Ответ написан
    Комментировать
  • Как решить проблему с переадресацией http на https в битриксе?

    Удалите этот файл .htsecure в папке www

    В настройках nginx есть правило
    # Redirect to ssl if need
    		if (-f /home/bitrix/www/.htsecure) { rewrite ^(.*)$ https://$host$1 permanent; }
    Ответ написан
    1 комментарий
  • Что не так в настройке ЧПУ каталога товаров (catalog)?

    OlegMifle
    @OlegMifle
    php-программист
    То, что страница со слешем на конце и без по сути разные страницы -- это правильно. Можно настроить редирект в .htaccess.
    На счёт дублей товаров можно попробовать избавится, поставив параметр "DETAIL_STRICT_SECTION_CHECK => 'Y'" в настройках компонента catalog. Но, если у товары лежат в нескольких разделах, то это не поможет и придётся проверять существование товара "руками".
    Ответ написан
    Комментировать
  • Поможете написать регулярку для смены шаблона?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если вы про общий шаблон сайта - то есть специальное условие - параметр в url: i.share.pho.to/ca5736ec_o.png

    Если вы вы про шаблон компонента - то не советую так делать (редактирование через визуальный редактор приведет к потере).

    Тогда лучше делать через проверку

    ($_REQUEST['param']=='value'? 'template1' : 'template2')
    Ответ написан
    6 комментариев
  • Почему так происходит :)?

    Очищайте кэш страницы в разделе "удаление кэша".
    Ответ написан
    4 комментария