• Как настроить прямой доступ к php файлу в .htaccess?

    @dodo512
    При Basic Auth вначале сервер отвечает клиенту статусом 401.
    Браузер отображает страницу с запросом логина/пароля.

    Как вместо 401 получается 404 от Wordpress?
    Если в настройках Apache с помощью ErrorDocument для 401 указан какой-то путь, то происходит внутреннее перенаправление на этот адрес и весь список правил mod_rewrite выполняется заново.
    Если файл не найден запрос отправляется в index.php и Wordpress меняет статуc на 404.

    Можно в файле /.htaccess или /custom/.htaccess указать для 401 какой-нибудь существующий файл.
    Тогда запрос не будет попадать в Wordpress.
    ErrorDocument 401 /file.html
    Если указать не путь к файлу, а какой-то текст.
    ErrorDocument 401 " Some text "
    То не будет выполнения правил mod_rewrite и запрос не попадёт в Wordpress.
    Ну ещё вариант специальное значение default восстановит значение по умолчанию.
    ErrorDocument 401 default

    Другой вариант добавить в файл /.htaccess исключение для запросов со статусом 401 и пустить их в обход правил Wordpress.
    RewriteCond %{ENV:REDIRECT_STATUS} =401
    RewriteRule ^ - [L]

    Ставить выше правил правил Wordpress.
    Ответ написан
    1 комментарий
  • Как настроить прямой доступ к php файлу в .htaccess?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Внутри /custom создай пустой файл .htaccessи впиши в него RewriteEngine Off

    .htaccess — это дополнительный конфигурационный файл Apache, который позволяет настраивать работу веб-сервера для каждой отдельной директории, не влияя на глобальные настройки Apache.
    Ответ написан
  • Как удалить дубли строк в MySQL в таблице, связанной с другими?

    Stalker_RED
    @Stalker_RED
    Для начала четко определите что именно вы считаете дублями. Если другие таблицы ссылаются только на более ранний из дублей, или более поздний, например, то все довольно просто. Если могут ссылаться на оба одновременно, то у вас три варианта:
    1. склеить - обновить связи так, чтобы ссылались только на один из дублей, тогда второй можно удалить.
    2. удалить связи потеряв целостность базы
    3. выставить "on delete cascade" чтобы связанные данные из другой таблицы удалялись автоматически.
    Ответ написан
    Комментировать
  • Как удалить дубли строк в MySQL в таблице, связанной с другими?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зависит от того, что надо делать со связанными данными.
    Если их можно удалить, то достаточно сменить свойства связи на ON DELETE CASCADE.
    Если их надо перепривязать к остающимся строкам основной таблицы, то только писать свой скрипт, который будет искать дубли, выполнять перепривязку к основной записи и только после этого удалять дубли.
    Ответ написан
    1 комментарий
  • Почему не получается подружить Elasticsearch и Laravel Scout?

    dima9595
    @dima9595
    Junior PHP
    Согласно документации не нужно указывать какие-либо сервис-провайдеры в файле app.php.
    Ответ написан
    Комментировать
  • Как нагрузить сервер LAMP?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Jmeter например
    Ответ написан
    Комментировать
  • Как импортировать большой JSON (18гб) в MySQL?

    @Flying
    Вам не нужно загружать файл в память, для этого существует потоковая обработка:

    <?php
    $fp = fopen('big-file.json', 'r');
    if (!is_resource($fp)) {
        throw new \RuntimeException('Failed to open file for reading');
    }
    while (!feof($fp)) {
        $line = fgets($fp, 32768);  // Укажите лимит на одну запись
        if (empty($line)) {
            // Пропускаем пустые строки
            continue;
        }
        $data = json_decode($line, true, 512, JSON_THROW_ON_ERROR);
        // ... записываем в базу
    }
    fclose($fp);
    Ответ написан
    4 комментария
  • Как импортировать большой JSON (18гб) в MySQL?

    Target1
    @Target1
    Одно из первых решений что пришло использовать SplFileObject .
    Открыть как файл и пачками по 500/1000 записываит в бд

    $file = './file.json';
    $spl = new SplFileObject($file);
    $spl->seek(177777);
    echo $spl->current()
    Ответ написан
    Комментировать
  • Как перевести ajax-запрос после 30 секунд из success в error?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Читайте доки
    https://api.jquery.com/jquery.ajax/

    Там описан параметр timeout
    Ответ написан
    Комментировать
  • Как в Laravel в контроллере вытащить записи по тегу из PIVOT таблицы?

    @jazzus
    Таблица taggables используется для полиморфной связи, чтобы добавлять теги к любым моделям. В данный модуль не вникал. Но судя по первой строчке из описания нужно добавить трейт HasTags в модель Post. В трейте уже будут все отношения с методами без прописывания связей и т.д.

    Получить все посты с тегами можно так
    Post::withAnyTags(['first tag', 'second tag'])->get();

    хотя название метода плохое и может путать т.к. with в Laravel имеет другую функцию чем whereHas. Лучше было бы hasAnyTags

    пс перед добавлением модулей не будет лишним почитать зачем нужен фреймворк, отношения и почему уже можно не использовать join.
    Ответ написан
    1 комментарий
  • Как в Битрикс получить все подразделы инфоблока, включая вложенные?

    alexyarik
    @alexyarik
    Битрикс разработчик
    Чем пример из документации не подошёл?
    https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
    <?
    $rsParentSection = CIBlockSection::GetByID(1);
    if ($arParentSection = $rsParentSection->GetNext())
    {
       $arFilter = array('IBLOCK_ID' => 2,'>LEFT_MARGIN' => $arParentSection['LEFT_MARGIN'],'<RIGHT_MARGIN' => $arParentSection['RIGHT_MARGIN'],'>DEPTH_LEVEL' => $arParentSection['DEPTH_LEVEL']); // выберет потомков без учета активности
       $rsSect = CIBlockSection::GetList(array('left_margin' => 'asc'),$arFilter);
       while ($arSect = $rsSect->GetNext())
       {
           $arTest[] = $arSect;// получаем подразделы
       }
    }
    ?>
    Ответ написан
    1 комментарий
  • Как в PhpStorm убрать name:?

    Enguipro
    @Enguipro
    PHP developer
    5f3faa440d404870911135.png
    Вот так их тоже можно убрать (по клику ПКМ). Это подсказка с именем параметра функции, для которого вы передаете значение.
    Ответ написан
  • Почему в Битриксе не выводятся результаты фильтрации через умный фильтр?

    @PetrPo
    Код файла section.php комплексного компонента bitrix:catalog автора вопроса:
    spoiler

    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    $this->setFrameMode(true);
    ?>
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.section.list",
      "",
      Array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
        "SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
        "DISPLAY_PANEL" => "N",
        "CACHE_TYPE" => $arParams["CACHE_TYPE"],
        "CACHE_TIME" => $arParams["CACHE_TIME"],
        "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
    
        "SECTION_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["section"],
      ),
      $component
    );?>
    
    
          <?
                    if (CModule::IncludeModule("iblock")) {
                        $arFilter = array(
                            "ACTIVE" => "Y",
                            "GLOBAL_ACTIVE" => "Y",
                            "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                        );
                        if (strlen($arResult["VARIABLES"]["SECTION_CODE"]) > 0) {
                            $arFilter["=CODE"] = $arResult["VARIABLES"]["SECTION_CODE"];
                        } elseif ($arResult["VARIABLES"]["SECTION_ID"] > 0) {
                            $arFilter["ID"] = $arResult["VARIABLES"]["SECTION_ID"];
                        }
                        $obCache = new CPHPCache;
                        if ($obCache->InitCache(36000, serialize($arFilter), "/iblock/catalog")) {
                            $arCurSection = $obCache->GetVars();
                        } else {
                            $arCurSection = array();
                            $dbRes = CIBlockSection::GetList(array(), $arFilter, false, array("ID"));
                            $dbRes = new CIBlockResult($dbRes);
                            if (defined("BX_COMP_MANAGED_CACHE")) {
                                global $CACHE_MANAGER;
                                $CACHE_MANAGER->StartTagCache("/iblock/catalog");
    
                                if ($arCurSection = $dbRes->GetNext()) {
                                    $CACHE_MANAGER->RegisterTag("iblock_id_" . $arParams["IBLOCK_ID"]);
                                }
                                $CACHE_MANAGER->EndTagCache();
                            } else {
                                if (!$arCurSection = $dbRes->GetNext())
                                    $arCurSection = array();
                            }
                            $obCache->EndDataCache($arCurSection);
                        }
                        ?>
                            <? $APPLICATION->IncludeComponent(
                                "bitrix:catalog.smart.filter",
                                ".default",
                                Array(
                                    "PRICE_CODE" => $arParams["PRICE_CODE"],
                                    "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
                                    "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                                    "SECTION_ID" => $arCurSection['ID'],
                                    "FILTER_NAME" => 'searchFilter',
                                    "CACHE_TYPE" => $arParams["CACHE_TYPE"],
                                    "CACHE_TIME" => $arParams["CACHE_TIME"],
                                    "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
                                    "SAVE_IN_SESSION" => "N",
                                    "XML_EXPORT" => "Y",
                                    "SECTION_TITLE" => "NAME",
                                    "SECTION_DESCRIPTION" => "DESCRIPTION",
                                    'HIDE_NOT_AVAILABLE' => $arParams["HIDE_NOT_AVAILABLE"],
                                    "TEMPLATE_THEME" => 'wood'
                                ),
                                $component,
                                array('HIDE_ICONS' => 'Y')
                            ); ?>
                        <? 
                    } ?>
    
    
    
    
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.section",
      "",
      Array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "ELEMENT_SORT_FIELD" => $arParams["ELEMENT_SORT_FIELD"],
        "ELEMENT_SORT_ORDER" => $arParams["ELEMENT_SORT_ORDER"],
     		"PROPERTY_CODE" => $arParams["LIST_PROPERTY_CODE"],
        "META_KEYWORDS" => $arParams["LIST_META_KEYWORDS"],
        "META_DESCRIPTION" => $arParams["LIST_META_DESCRIPTION"],
        "BROWSER_TITLE" => $arParams["LIST_BROWSER_TITLE"],
        "INCLUDE_SUBSECTIONS" => $arParams["INCLUDE_SUBSECTIONS"],
        "BASKET_URL" => $arParams["BASKET_URL"],
        "ACTION_VARIABLE" => $arParams["ACTION_VARIABLE"],
        "PRODUCT_ID_VARIABLE" => $arParams["PRODUCT_ID_VARIABLE"],
        "SECTION_ID_VARIABLE" => $arParams["SECTION_ID_VARIABLE"],
        "FILTER_NAME" => $arParams["FILTER_NAME"],
        "DISPLAY_PANEL" => $arParams["DISPLAY_PANEL"],
        "CACHE_TYPE" => $arParams["CACHE_TYPE"],
        "CACHE_TIME" => $arParams["CACHE_TIME"],
        "CACHE_FILTER" => $arParams["CACHE_FILTER"],
        "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
        "SET_TITLE" => $arParams["SET_TITLE"],
        "SET_STATUS_404" => $arParams["SET_STATUS_404"],
        "DISPLAY_COMPARE" => $arParams["USE_COMPARE"],
        "PAGE_ELEMENT_COUNT" => $arParams["PAGE_ELEMENT_COUNT"],
        "LINE_ELEMENT_COUNT" => $arParams["LINE_ELEMENT_COUNT"],
        "PRICE_CODE" => $arParams["PRICE_CODE"],
        "USE_PRICE_COUNT" => $arParams["USE_PRICE_COUNT"],
        "SHOW_PRICE_COUNT" => $arParams["SHOW_PRICE_COUNT"],
    
        "PRICE_VAT_INCLUDE" => $arParams["PRICE_VAT_INCLUDE"],
    
        "DISPLAY_TOP_PAGER" => $arParams["DISPLAY_TOP_PAGER"],
        "DISPLAY_BOTTOM_PAGER" => $arParams["DISPLAY_BOTTOM_PAGER"],
        "PAGER_TITLE" => $arParams["PAGER_TITLE"],
        "PAGER_SHOW_ALWAYS" => $arParams["PAGER_SHOW_ALWAYS"],
        "PAGER_TEMPLATE" => $arParams["PAGER_TEMPLATE"],
        "PAGER_DESC_NUMBERING" => $arParams["PAGER_DESC_NUMBERING"],
        "PAGER_DESC_NUMBERING_CACHE_TIME" => $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"],
        "PAGER_SHOW_ALL" => $arParams["PAGER_SHOW_ALL"],
    
        "OFFERS_CART_PROPERTIES" => $arParams["OFFERS_CART_PROPERTIES"],
        "OFFERS_FIELD_CODE" => $arParams["LIST_OFFERS_FIELD_CODE"],
        "OFFERS_PROPERTY_CODE" => $arParams["LIST_OFFERS_PROPERTY_CODE"],
        "OFFERS_SORT_FIELD" => $arParams["OFFERS_SORT_FIELD"],
        "OFFERS_SORT_ORDER" => $arParams["OFFERS_SORT_ORDER"],
        "OFFERS_LIMIT" => $arParams["LIST_OFFERS_LIMIT"],
    
        "SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],
        "SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
        "SECTION_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["section"],
        "DETAIL_URL" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["element"],
      ),
      $component
    );
    ?>


    Параметр FILTER_NAME у компонента bitrix:catalog.smart.filter равен searchFilter, а у компонента bitrix:catalog.section берется с параметров комплексного компонента $arParams["FILTER_NAME"] и он не равен searchFilter, потому и не работает
    Ответ написан
    Комментировать
  • Как провериться на админа в шаблоне Django?

    @antonksa
    Давайте по порядку.

    1. Шаблонизатор джанго. Принимает на вход html (на самом деле не тольк, а любой текстовый файл) и коробку с новогодними подарками (нет) переменными, так называемый контекст. При обработке шаблона шаблонизатор заменяет специальный синтаксис {{ имя_переменной }} которые он ищет в контекстте (контекст это обычный словарь ключ-значение).

    2. User. Юзер это встроенная в джанго модель юзера. Ее можно заменить своей, но 90% используется эта. Middleware авторизации получает объект запроса, перед тем как он будет передан на обработку во View. В 90% случаев опять же используется встроенная миддлварь из модуля django.contrib.auth. Миддлварь ковыряется в куках, находит session_key и ищет в базе данных (в 90% случаев, ну вы понели) какому юзеру соответствует эта сессия. После этого добавляется/модифицируется property экземпляра HttpRequest. Этому аттрибуту присваивается выковырянный из БД экземпляр User или, если юзер не авторизован, AnonymousUser.

    3. View вызывает функцию render которая принимает шаблон и контекст. для сбора контекста у класса View есть метод get_context который собирает контекст в кучу. Даже если вы просто написали самый банальный
    class MyFuckingView(TemplateView):
        template_name = 'some/module/template.html'

    то при обработке get запроса будет вызван get_context из родительского класса TemplateView.

    4. По умолчанию джанга пропихивает в контекст request и еще некоторые вещи ( экземпляр view, который был использован и в зависимости от использованного CBV (class based view) там может быть queryset, object и другие штуки. Еще раз, это встроенный функционал, поэтому если вы модифицируете контекст, то вам всегда нужно вызывать метод родителя, чтобы это не потерялось:
    class MyFuckingView(TemplateView):
        template_name = 'some/module/template.html'
    
        def get_context(self):
            ctx = super().get_context()
            ctx['model_name'] = 'Sasha Grey'
            ctx['category'] = 'Milf anal'
            return ctx


    5. Наконец резюмируя, в вашем случае в контексте должен быть request. is_admin там могло появиться только принудительно. Модифицируйте шаблон:
    {% if request.user.is_admin %}
        <a href="#" class="edit-button">Edit</a>
    {% endif %}

    и все должно заработать. И перечитайте то что я писал выше - туториал по джанго можно осилить за день-два, это очень с одной стороны простой и с другой продуманный и вымученный за 13 лет существования всем сообществом фреймворк.
    Ответ написан
  • Как составить регулярное выражение для удаления конца строки?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    ([a-zA-Z]{2,2}\d{5,5})-.*

    https://regex101.com/r/GO1dm1/2
    Ответ написан
    Комментировать
  • Как передать в шаблон данные, полученные через Mongoose?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    var selectedUser = User.findOne({'_id': '5991bf82b9a87a624407907e'}, (err, user) => {
        console.log('result', err, user);
        someFunction(user);
    });
    
    function someFunction (user) {
        res.render("userpage.hbs", {
            username: user.username
        });
    }
    Ответ написан
    2 комментария