Задать вопрос
  • Как правильно написать RewriteRule?

    Вы слишком мудрите
    RewriteRule ^goods(/.+) /catalog/tovary$1 [L,R=301]
    Ответ написан
  • Есть что то проще чем php?

    Если без динамики, то Pug - отличный шаблонизатор
    Ответ написан
    Комментировать
  • Как выполнить поиск данных, если в базе данных указан шаблон?

    хранится он в виде W1K253???1???????, W1N253???1???????

    Насколько я вижу, эти шаблоны одинаковы, то есть:
    1. 6 фиксированных символов
    2. 3 произвольных символа
    3. 1 фиксированный символ
    4. 7 произвольных символов

    При этом произвольные символы обозначены знаком "?".
    Тогда можно сделать такой регуляркой:
    <?php
    $requestedVin = 'W1K25312311234567';
    $pattern = preg_replace('/^([A-Z\d]{6})[A-Z\d]{3}([A-Z\d])[A-Z\d]{7}$/', '$1???$2???????', $requestedVin);
    
    $query = "
            SELECT DISTINCT p.ID
            FROM {$wpdb->posts} p
            INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product'
              AND p.post_status = 'publish'
              AND pm.meta_key = 'vin'
              AND pm.meta_value = %s
            LIMIT 10 OFFSET %d
        ";
    
    $results = $wpdb->get_col($wpdb->prepare($query, $pattern, $offset));
    Ответ написан
    Комментировать
  • Как решить проблему сохранения данных?

    ichug, вообще не понимаю, почему Вы акцентируетесь на том, что существует коробочная версия. Такое ощущение, что Вы плохо представляете, как устроен Битрикс. Смотрите:
    1) есть облачный Битрикс24. Туда можно устанавливать "приложения", которые могут взаимодействовать со сторонними хостами через REST API
    2) есть коробочный "Битрикс: корпоративный портал". Туда ровно так же ставятся те же самые приложения.

    Если Вы рассматриваете ситуацию, когда коробочный корпортал стоит в закрытом контуре, изолирован от интернета, то в таких случаях Вам придётся договариваться с заказчиком об установке дополнительного сервера с Вашим ПО внутрь контура. Другого пути я не вижу. И тогда коробочный корпортал точно так же будет подключаться к этому доп.серверу.

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

    я правильно понял, что под каждую категорию у Вас отдельный инфоблок? Если это так, то одним файлом не обойтись.

    Если начальная задача была "Сделать новости с категориями", то для этого обычно:
    1) берут тип инфоблока с флагом "Использовать древовидный классификатор элементов по разделам". Если такого типа нет - заводят новый.
    2) создают один инфоблок
    3) в этом инфоблоки создают разделы ( категории ) и элементы ( сами новости )
    4) в публичной части создают отдельный каталог ( например, /news ) и в /news/index.php добавляют комплексный компонент bitrix:news

    Да и вообще, если у Вас есть и список новостей и просмотр новости детально, то нет смысла делать отдельные файлы с "bitrix:news.list" и "bitrix:news.detail". Нужно использовать bitrix:news
    Ответ написан
    2 комментария
  • Как настроить описание страницы?

    посмотрите в корне сайта файл .section.php
    Ответ написан
    Комментировать
  • Как сформировать список по вложенному массиву рекурсивной функцией?

    извращение с мухлежом:
    <?php
    function list_form(array $items):string
    {
         function inner(array $items):string {
            $result = '';
            foreach ($items as $key => $val) {
                if (is_array($val) ) {
                    $result .= "<li>$key =></li>";
    
                    if (!empty($val)) {
                        $result .= inner($val);
                    }
                } else {
                    $result .= "<li>$key => $val</li>";
                }
            }
            return $result;
        }
    
        return '<ul>'.inner($items).'</ul>';
    }
    echo list_form($arr);
    Ответ написан
    Комментировать
  • Что неправильного в моем коде?

    Как минимум, Вы не вникли в задачу. Я вот в футболе практически не разбираюсь - получив такое задание, я пошёл бы в гугл узнавать, как проводятся матчи в турнирах, когда команда играет на своём поле, а когда - нет. Даже по своим скудным знаниям могу кое-что предположить:
    1) Первый круг: команды надо разбить на пары случайным образом. Это shuffle() + array_chunk() . У Вас этого нет.
    1.1) Учесть ситуацию, когда команд - нечётное количество. Этого тоже нет.
    2) в парах какую-то команду назначить хозяином. Соответственно, в выводе в колонке "Хозяева" должно быть не повторение "Хозяева", "Хозяева", "Хозяева", а имена команд
    3) дальше надо смотреть, на каких условиях проводится второй круг, кто в него попадает, на своём поле играют или на чужом..

    Получается, из этого:
    загружать через форму файл json со списком команд, а потом сводить эти команды в турнируную таблицу с условиями (гость, хозяин), круг 1, круг 2 и еще 5-6 условий, которые влияют на список
    Вы выполнили только "загружать через форму файл json", причём зачем-то этот файл сохраняете на диск, а потом немедленно читаете обратно.

    Сергей Вам справедливо указал на "разделение обязанностей", то бишь первую букву в SOLID - Single Responsibility Principle. Даже если оставить на месте выверт с сохранением на диск, получается:
    1. Repository - хранилище данных
    2. метод контроллера, отвечающий за приём данных именно в виде сабмита формы и сохранение их Repository
    3. Генератор текущего круга
    4. View, который отвечает за генерацию html-разметки круга,
    5. метод контроллера, который может извлечь данные из Repository, скормить их генератору, получить результат и скормить его во View.


    И не факт, что методы из 2 и 5 пункта принадлежат одному классу.
    Ответ написан
    Комментировать
  • Для чего нужен wakeUp в Битрикс?

    если посмотреть код, то видно, что при wakeUp не выполняется никаких обращений к БД.
    Метод в файле bitrix/modules/main/lib/orm/objectify/entityobject.php
    смотрите разницу:
    fill*() - подгружает значение из БД
    set*() - задаёт значение свойства, но при несовпадении со старым значением переводит объект в состояние State::CHANGED
    wakeUp() -создаёт объект с указанными значениями свойств, не переводя объект в изменённое состояние, но только при условии, что в аргументе есть первичный ключ.
    Ответ написан
    Комментировать
  • Вставка изображений в png шаблон по параметрам Wordpress?

    Что-то вроде водяного знака, но только наоборот?

    Почему наоборот? Ровно так же, если я правильно Вас понял.
    Для водяного знака:
    1) берётся исходное изображение,
    2) берётся изображение с водяным знаком,
    3) второе накладывается поверх первого,
    4) результат сохраняется

    В вашем случае:
    0) пользователи отсылают форму с файлом фотографии и какими-то текстовыми полями (например, ФИО)
    1) берётся изображение-шаблон пустого бейджа,
    2) берётся изображение из присланной формы,
    3) второе накладывается поверх первого,
    4) также поверх пишется текст из текстовых полей,
    5) результат сохраняется.

    Это можно сделать средствами GD.
    Ответ написан
    Комментировать
  • Как настроить ошибку 404 не выводится ошибка в headers?

    Нет, достаточно допилить шаблон компонента каталога. Сейчас, полагаю, на неправильный URL открывается корень каталога? Если так, то достаточно в странице sections.php добавить свой код
    Ответ написан
  • Как почистить базу sql?

    С учётом:
    Честно, с SQL не работаю и не понимаю. Или только ждать тех.поддержку?

    ждать техподдержку - самое разумное решение. Любое вмешательство приведёт к тому, что ответственность за состояние системы полностью перейдёт на Вас. Может, там что-то уже повреждено, а Вы без понятия.
    Ответ написан
    Комментировать
  • Как убрать знак / в всех ссылках в тексте?

    <?php
    $content = preg_replace('#(href=['"][^'"]*)/(?='|")#', '$1', $content);

    Только с относительной ссылкой на главную ( href="/" ) будет проблема
    Ответ написан
    1 комментарий
  • Почему нет свойства в $arResult?

    потому что в аргументах CIBlockElement::GetList() надо указывать не 'PROPERTY_JOB_TITLE_VALUE' , а 'PROPERTY_JOB_TITLE'. А вот в результате будет 'PROPERTY_JOB_TITLE_VALUE' и ещё пачка мусора
    Ответ написан
  • Как получить название пользовательского поля Битрикс по его коду?

    Если есть id поля, то всё легко:
    <?php
    use Bitrix\Main\UserFieldTable;
    
    $id = 1;
    $res = UserFieldTable::getFieldData($id);
    print_r($res);

    Если только символьный код, то чуть сложнее:
    <?php
    use Bitrix\Main\UserFieldTable;
    $fieldName = 'UF_CRM_1728545307';
    $res = UserFieldTable::getList([
        'select' => array_merge(['*'], UserFieldTable::getLabelsSelect()),
        'filter' => [
            '=FIELD_NAME' => $fieldName,
        ],
        'limit' => 1,
        'runtime' => [
            UserFieldTable::getLabelsReference(null, 'ru'),
        ]
    ])->fetchRow();
    print_r($res);
    Ответ написан
    Комментировать
  • Как сделать так, чтобы поисковик отображал страницу поиска по сайту (ниже приведу примеры Дзена и Тиктока)?

    У меня такого не происходит:
    1. Зашёл на дзен.ру,
    2. вбил ту поисковую фразу,
    3. меня перекинуло на обычную поисковую выдачу Яндекса,
    4. где-то в выдаче была ссылка на одну страницу Дзена.

    Но вообще, как понимаю, это делается несложно:
    1. мониторите wordstat или как-то иначе собираете релевантные сайту поисковые запросы
    2. сопоставляете эти запросы со страницами сайта, сохраняете это сопоставление.
    3. при выводе страницы в форму поиска на сайте выводите сопоставленный поисковый запрос


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

    Судя по $arResult, показанный код где-то в template.php шаблона компонента для вывода баннера. Не надо так.
    вместо этого в шаблоне компонента делаете так:
    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    $this->SetViewTarget("banner-head");
    if (!empty($arResult['PICTURE'])){
        echo CFile::GetPath($arResult['PICTURE']);
    }

    (это весь код шаблона)
    а в header.php сайта пишете:
    <?$APPLICATION->IncludeComponent(/* вызов компонента для баннера */);?>
    <?php
    $picture = trim($APPLICATION->GetViewContent('banner-head'));
    if (!empty($picture)): 
    // и дальше как было
    <?php

    Должно получиться.

    Пихать $APPLICATION->ShowTitle() внутрь шаблона компонента вообще дурная идея. С хлебными крошками, вероятно, то же самое, потому что это особенный компонент, и шаблон у него особенный.
    Ответ написан
  • Как убрать отступы в коде?

    два варианта:
    1)_ просто всё прижать влево:
    <?php
    $chunk = '
      <url>
      <loc>'.$site.'/look/'.$sitemap['tag'].'</loc>
      <lastmod>'.date('Y-m-d').'T'.date('h:i:s+01:00').'</lastmod>
      <priority>0.8</priority>
      </url>
      ';
    $data[] = preg_replace('/^\s+</m', '<', trim($chunk));


    2) вытянуть всё в строку:
    <?php
    $data[] = preg_replace('/>\s+</ms', '><', trim($chunk));

    Эти регулярки только для данного случая! ( потому что никаких значимых пробелов в сайтмапе быть не должно)

    Несколько замечаний:
    1) показывать код скриншотом неэтично (я про готовый сайтмап). Здесь его можно было запихнуть в тег code (кнопка в панельке) с типом XML
    2) если не используете числовые индексы, то вместо mysql_fetch_array() берите mysql_fetch_assoc()
    3) mysql_* функции - древность, используйте хотя бы mysqli ( как объект, конечно же)
    Ответ написан
    Комментировать
  • Как передать значение из компонента в result_modifier шаблона, где компонент вызывается?

    не очень подробно описано, поэтому остаётся гадать. Я предполагаю 2 варианта:
    1) попроще: где-то вызов компонента С1, в шаблоне которого упомянутый result_modifier.php . Затем, ниже первого вызова, идёт вызов компонента С2, от которого нужны данные.
    Тогда просто перенесите вызов компонента С2 выше вызова С1 и оберните:
    <?php
    ob_start();
    $APPLICATION->IncludeComponent( "C2" ...);
    $APPLICATION->AddViewContent("view2",  ob_get_clean() );
    // там, где компонент был раньше, ставите:
    $APPLICATION->ShowViewContent("view2");

    Соответственно, в component_epilog.php компонента С2 засовываете нужные значения в $APPLICATION->SetPageProperty() или просто в $GLOBALS

    2) Посложнее: компонент С2 вызывается в template.php того же шаблона, которому принадлежит result_modifier.php. Тогда в result_modifier.php будет:
    <?php
    $arResult['PROPERTIES']['TABS'][] = array(
        'CODE' => 'FAQ',
        'TITLE' => 'Вопросы о товаре #COUNT#', // Отображаем количество вопросов
        'VALUE' => 'FAQ_FORM' // Временное значение
    );
    , а в template.php выше вывода вкладок:
    <?php
    $this->SetViewTarget("view2");
    $APPLICATION->IncludeComponent( "C2" ...);
    $this->EndViewTarget();
    // передача значения - аналогично первому варианту. Допустим, через $GLOBALS
    // где-то ниже при выводе заголовка таба
    $tab['TITLE'] = str_replace('#COUNT#', $GLOBALS['count'], $tab['TITLE']);
    // и ещё ниже, где был компонент:
    ?>
    <?$APPLICATION->ShowViewContent("view2")?>
    Ответ написан
    Комментировать