Задать вопрос
  • Как убрать "прыгание надписи" у чекбокса?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Вот это нужно убрать

    6336b19e80d03422816215.png
    Ответ написан
    Комментировать
  • Как узнать значение слова через API?

    @Mr_Epic
    Web программист
    Яндекс словарь например:
    https://tech.yandex.ru/dictionary/
    Ответ написан
    Комментировать
  • Зачем нужен этот файл в корне сайта varvara.php?

    @ne_bag_a_ficha
    Это поисковик по файлам проекта
    Вставляешь его в корень сайта, переходишь на страницу и пользуешься
    Удобная штука
    https://github.com/SemenSidorov/varvara
    Ответ написан
    Комментировать
  • Кастомные поля в документах Bitrix CRM?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    Возьмите за основу любой имеющийся провайдер (в недрах компонента documentgenerator, которые наследуются от DataProvider) и смотрите каким образом они поля объявляют.

    P.S. В функции генерить класс это конечно великолепно :)
    Ответ написан
    1 комментарий
  • Как сделать редирект на https в Битрикс?

    tamerline
    @tamerline
    всеядный инженер
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    Ответ написан
    6 комментариев
  • Как в коробочной версии bitrix24 получить комментарий к лиду?

    Для того, чтобы найти комментарий:
    \Bitrix\Main\Loader::includeModule('crm');
    
    $rs = Bitrix\Crm\Timeline\Entity\TimelineTable::getList(array(
      'order' => array("ID" => "DESC"), 
      'filter' => array('=TYPE_ID' => 7),
    'select'=>array("ID", "BINDINGS")
    ));
    while($ar = $rs->Fetch()) 
    {
       echo '<pre>';
       print_r($ar);
       echo '</pre>';
    }

    Array
    (
       [ID] => 1537
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_OWNER_ID] => 1537
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_ENTITY_TYPE_ID] => 1
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_ENTITY_ID] => 134
       [CRM_TIMELINE_ENTITY_TIMELINE_BINDINGS_IS_FIXED] => 
    )

    ENTITY_TYPE_ID берётся из CCrmOwnerType, например, \CCrmOwnerType::Lead
    ENTITY_ID - собственно ID лида/сделки/где-там-ещё можно комментарии оставлять
    OWNER_ID - это ID который нам нужен для следующего запроса

    $rs = Bitrix\Crm\Timeline\Entity\TimelineTable::getList(array(
       'order' => array("ID" => "DESC"), 
       'filter' => array('=TYPE_ID' => 7)
    ));
    while($ar = $rs->Fetch()) 
    {
       echo '<pre>';
       print_r($ar);
       echo '</pre>';
    }

    Array
    (
        [ID] => 263472
        [TYPE_ID] => 7
        [TYPE_CATEGORY_ID] => 0
        [CREATED] => Bitrix\Main\Type\DateTime Object
            (
                [value:protected] => DateTime Object
                    (
                        [date] => 2019-03-18 15:26:16.000000
                        [timezone_type] => 3
                        [timezone] => Europe/Moscow
                    )
    
            )
    
        [AUTHOR_ID] => 14
        [ASSOCIATED_ENTITY_ID] => 0
        [ASSOCIATED_ENTITY_TYPE_ID] => 0
        [COMMENT] => повторное обращение
        [SETTINGS] => Array
            (
                [HAS_FILES] => N
            )
    
    )
    Ответ написан
    2 комментария
  • Как открыть порт iptables?

    adelkhalitov
    @adelkhalitov Автор вопроса
    >
    Тему не актуальна. Спустя 6 часов я нашел причину.
    Хостер блокирует функцию iptables из за тарифного плана.
    Джино полное уныние
    Ответ написан
    4 комментария
  • Как убрать ошибку cURL error 7: Failed to connect to 80: Connection refused?

    @younghacker
    cURL error 7: Failed to connect to foods-service.com.ua port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

    Ваш хост
    1)забанили
    2) у вас криво настроен firewall
    3) с хоста запрещены исходяшие соединения.

    Например у меня всё в порядке
    $ nmap -p80,443 foods-service.com.ua
    
    Starting Nmap 7.12 ( https://nmap.org ) at 2017-02-05 22:24 CET
    Nmap scan report for foods-service.com.ua (37.139.15.228)
    Host is up (0.036s latency).
    PORT    STATE SERVICE
    80/tcp  open  http
    443/tcp open  https
    Ответ написан
    Комментировать
  • Как загрузить характеристики товара для дальнейшей фильтрации?

    foxayb
    @foxayb Автор вопроса
    newbie
    Кому интересно - решение я реализовал следующее:
    Т.к. плагин "WP All import" нужно использовать в связке с другим плагином "WooCommerce Add-On Pro", соответственно он и отвечает за загрузку атрибутов и ограничивает их на 28 смв. в слаге, то в файле /wp-content/plugins/wpai-woocommerce-add-on/libraries/services/XmlImportWooTaxonomyService.php, в функции public function createTaxonomy($attr_name, $prefix = 1) (72 линия) нужно прописать следующее:
    spoiler
    /**
         *
         * Create new taxonomy.
         *
         * @param $attr_name
         * @param int $prefix
         * @return string
         */
        public function createTaxonomy($attr_name, $prefix = 1) {
    		$attr_name_fix = $attr_name; //зафиксил
    		$attr_name = substr($attr_name, 0, 27);  //обрезал имя
            $attr_name_real = $prefix > 1 ? $attr_name . " " . $prefix : $attr_name;
            $attribute_name = wc_sanitize_taxonomy_name( stripslashes( (string) $attr_name_real ) );
    		
    	//	$bsk = rand(10,999);
    		$attribute_name = substr($attribute_name, 0, 27);  //обрезал url
    		
            $args = array(
                'attribute_label'   => stripslashes( (string) $attr_name_fix ), //применил фикс к лейблу
                'attribute_name'    => $attribute_name,
                'attribute_type'    => 'select',
                'attribute_orderby' => 'menu_order',
                'attribute_public'  => 1
            );
    
    
            if ( ! taxonomy_exists( wc_attribute_taxonomy_name( $attr_name_real ) ) ) {
                if ( in_array( wc_sanitize_taxonomy_name( stripslashes( (string) $attr_name_real)), $this->reserved_terms ) ) {
                    $prefix++;
                    return $this->createTaxonomy($attr_name, $prefix);
                }
                else {
                    // Register the taxonomy now so that the import works!
                    $domain = wc_attribute_taxonomy_name( $attribute_name );
                    if (strlen($domain) < 31){
                        register_taxonomy( $domain,
                            apply_filters( 'woocommerce_taxonomy_objects_' . $domain, array('product') ),
                            apply_filters( 'woocommerce_taxonomy_args_' . $domain, array(
                                'hierarchical' => true,
                                'show_ui' => false,
                                'query_var' => true,
                                'rewrite' => false,
                            ) )
                        );
                        $this->createWooCommerceAttribute($args);
                        $this->getLogger() and call_user_func($this->getLogger(), sprintf(__('- <b>CREATED</b>: Taxonomy attribute “%s” have been successfully created.', \PMWI_Plugin::TEXT_DOMAIN), wc_attribute_taxonomy_name( $attribute_name )));
                    }
                    else {     				
    					$this->getLogger() and call_user_func($this->getLogger(), sprintf(__('- <b>WARNING</b>: Taxonomy “%s” name is more than 28 characters. Change it, please.', \PMWI_Plugin::TEXT_DOMAIN), $attr_name));
    				}
                }
            }
            else {
                if ( in_array( wc_sanitize_taxonomy_name( stripslashes( (string) $attr_name_real)), $this->reserved_terms ) ) {
                    $prefix++;
                    return $this->createTaxonomy($attr_name, $prefix);
                }
            }
    
            if (!wc_attribute_taxonomy_id_by_name($attr_name_real) && strlen($attribute_name) < 31) {
               $this->createWooCommerceAttribute($args);
            }
    
            return $attr_name_real;
        }


    на выходе мы получим такой эффект: при импорте все атрибуты, что имеют название более 27 символов будут обрезаться в слаге (url), что позволит все успешно импортировать, а названия сохранят свою длину.
    Ответ написан
    1 комментарий
  • Как работать с websocket в php без библиотек?

    @xfg
    Прочитать соответствующий RFC https://tools.ietf.org/html/rfc6455 чтобы понять, как происходит рукопожатие и какие байты в переданном сообщении за что отвечают. После этого будет понятно как написать реализацию. Я досконально уже не помню, но фактически от клиента приходит обычный http запрос с определенными заголовками, сервер разбирает этот запрос и если всё ок, то сохраняет открытое соединение в массив, если нет, то отправляет соответствующий ответ и закрывает соединение. Дальше по открытому соединению начинает сыпаться поток байтов от клиента их нужно разбирать, чтобы понять длину сообщения, сами данные переданные в фрейме, закончился фрейм или еще нет и тому подобное. Обратно также кодировать данные в поток байтов и отправлять по открытому соединению. Каждый байт в переданном фрейме несет определенный смысл. Обо всем этом подробно написано в RFC, но на английском. Вообще это хорошо примерно понимать как работает, но глупо писать такую низкоуровневую реализацию, когда есть готовые. Такие вещи развивают и поддерживают годами. Вы же не пишите HTTP серверы, а берете готовые вроде nginx и тому подобное.

    В каком месте можно полученные данные подготовить к записи в бд.

    Как сделать, что бы на стороне клиента, один websocket отвечал за сообщения, другой за статьи. (Или за эти два действия отвечает один websocket, тогда как мне на сервере это различать).

    Вебсокет это низкоуровневая штука, для передачи потока байтов от клиента на сервер, в отличии например от HTTP, где есть заголовки и тело сообщения. Поверх вебсокета нужно делать еще один протокол или самописный или выбрать один из готовых. Это проще говоря, то как выглядят ваши фреймы (сообщения), которые вы отправляете с клиента на сервер и назад. Например клиент может отправлять такой фрейм:
    ["id", "controller/action", {param1: value1, param2: value2}]

    в ответ получать
    ["id", "OK"]
    если запрос был обработан успешно или
    ["id", "ERR", {error: "action not found"}]
    если произошла ошибка. По переданному id в массиве, можно понимать, к какому запросу относится ответ.
    Для уведомлений (событий) сервер может отправлять клиентам что-то такое
    ["user_added", {user: {...}}]
    и т.д. Этот протокол необходимо придумать самому или выбрать из готовых (популярных пока нет) и написать его реализацию (клиентскую и серверную часть) или опять же взять уже готовую.

    После того, как такой протокол будет написан, делаешь тоже самое, что делают обычные PHP фреймворки, пишешь роутер, который будет разбирать твои сообщения, понимать к какому контроллеру идет обращение, к какому экшену и вызывать его. В экшене уже будешь делать свои вызовы к базе данных.

    Но это уже всё должно быть, просто возьми real-time фреймворк. Там за тебя написали и websocket сервер и протокол поверх него и экшены уже есть. Всё низкоуровневое уже готово. Бери и пиши приложение. В nodejs самый популярный это например https://github.com/socketio/socket.io, а в php я не знаю, но уверен, что тоже есть что-то популярное.

    Своё написать не получится, без опыта и без попыток сделать приложение на чем-то готовом. Нужно как минимум прочитать RFC и посмотреть реализации других разработчиков. Для этого нужно быть кем-то больше, чем "программистом сайтов".
    Ответ написан
    1 комментарий
  • Как сделать сортировку объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделайте из объекта массив и сортируйте его как вам нужно:

    const sortedData = Object
      .entries(data)
      .map(([ key, val ]) => ({ ...val, id: key }))
      .sort((a, b) => b.id - a.id);
    Ответ написан
  • Почему ссылка не кликабельна?

    v3shin
    @v3shin
    Веб-шаман
    Картинкой перекрывается.
    5e54ebbd00f49626731902.png
    Чтобы починить добавьте тексту z-index: 1.
    Ответ написан
    1 комментарий
  • Когда используется php://input и php://output?

    @ArtemioVegas
    php developer
    ПХП по умолчанию не парсит запросы кроме application/x-www-form-urlencoded multipart/form-data, поэтому данные не попадают в суперглобальный массив $_POST, а тело запроса нужно парсить самостоятельно как вы и привели в примере из php://input , т.к. туда поступают необработанные данные из тела запроса
    Ответ написан
    Комментировать
  • json_encode и кириллица

    @MaZaAa
    Все намного проще...
    json_encode($res, JSON_UNESCAPED_UNICODE);
    Ответ написан
    7 комментариев
  • Как из пути до файла получить имя файла без расширения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    без регулярных выражений встроенной в PHP функцией pathinfo():
    $info = pathinfo('/doc2/Тестовый документ.pdf');
    echo $info['filename']; // Тестовый документ
    Ответ написан
    4 комментария
  • Как по-нормальному вытащить smarty переменную в php код?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Дело в том, что смарти - это шаблонизатор, т.е. он отвечает за представление (рендеринг) данных перед отдачей в браузер и его работа обычно начинается тогда, когда работа контроллера уже завершена. Именно по этой причине прямых путей передачи чего-либо из смарти обратно в код не предусмотрена, т.к. оно не нужно обычно.

    И, по хорошему, нужно придерживаться такого стиля программирования, иначе получится дичайшая каша и разобраться, где и кто поменял состояние будет все сложнее и сложнее, а, стало быть, отлавливать косяки и баги, рано или поздно, станет мега-трудной задачей.

    В общем я категорически не рекомендую пытаться что-то передавать из смарти обратно в код, только если это не отрендеренный шаблон, например, письма, который рендерится до завершения работы контроллера. Во всех остальных случаях односторонний поток данных обязателен.
    Ответ написан
    Комментировать
  • Расскажите подробно про php://input, как пользоваться?

    php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа контента.

    Данные, могут быть:
    • application/x-www-form-urlencoded ( application/x-www-form-urlencoded тип application/x-www-form-urlencoded для простых форм- application/x-www-form-urlencoded ) или
    • multipart/form-data-encoded (в основном multipart/form-data-encoded для загрузки файлов)

    Это связано с тем, что это единственные типы контента, которые должны поддерживаться браузерами. Поэтому сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могли бы).

    Если вы просто отправляете POST-ом обычную HTML-форму, запрос выглядит примерно так:
    POST /page.php HTTP/1.1
    key1=value1&key2=value2&key3=value3

    Но если вы много работаете с Ajax, может понадобиться обмен более сложными данными с типами (строка, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON является лучшим выбором. Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
    POST /page.php HTTP/1.1
    {"key1":"value1","key2":"value2","key3":"value3"}

    Теперь содержимое будет application/json (или, по крайней мере, ни один из вышеперечисленных), так что $_POST -wrapper из PHP не знает, как с этим справиться (пока).

    Данные всё еще там, вы просто не можете получить к нему доступ через $_POST. Поэтому вам нужно получить его с "сыром" виде помощью file_get_contents('php://input') (если он не закодирован в формате multipart/form-data).

    Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
    Ответ написан
    Комментировать
  • Как установить Laravel на обычный хостинг-сервер?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Но теперь решил, что пора двигаться дальше и нужно установить его на свой хостинг. Вот только как это сделать? Там нужен композер или еще что-то?

    Не нужен. Композер - это менеджер пакетов, который разгружает файлы в папку "vendor", а так же обновляет их там и т.д. Нет никакой проблемы закачать их "руками", в конечном виде, на хостинг.

    Максимум, что может понадобиться - это наличие сервера Apache (коий есть примерно у 95% хостеров), что бы переопределить корневую директорию проекта.

    Весь мануал будет удивительно краток:
    1. Загружаете все файлы на хост ("как есть")
    2. Создаёте в корешке хоста файл .htaccess вот с таким содержимым:
    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteRule ^(.*)$ public/$1 [L]
    </IfModule>

    3. Готово

    Там нужен композер или еще что-то? Ну и все эти приблуды с локального сервера. Буду благодарен за предоставление мануала. Спасибо :)

    "Композер и что-то ещё" могут быть нужны при наличии некоторых механизмов "деплоя" (англ. "deploy"), но это уже не хостинг, а как минимум VPS, и желательно там иметь Git и другие механизмы и т.д... Когда Вам это очень понадобиться - вопросы подобные тому, что Вы озвучили выше - отпадут сами собой :)
    Ответ написан
    7 комментариев
  • События для динамически добавленных в DOM элементов?

    @relic
    используйте метод on
    $(document).ready(function() {
        ...
        $('.clickable-elements element').on('click', 'a', function(e){
            //Какое-то действие
        });
       ...
    });
    
    Ответ написан
    4 комментария