Задать вопрос
  • Когда стоит вкладывать input в label, а когда нет?

    KulakovAngel
    @KulakovAngel
    Full Stack Developer (Node.JS)
    В целом, с точки зрения правильности/валидности кода, как заметил Danny Arty, разницы нет. В примитивных случаях верстки визуальной разницы тоже особо не наблюдается.

    Но если нужно сверстать что-то посложнее, сделать более интересное оформление, разница появляется, поскольку нам нужно взаимодействовать с разным порядком и вложенностью различных тегов. Сравните:

    1. В таком варианте у нас имеется два рядом расположенных тега. Чтобы выбрать второй, идущий после первого, можно использовать "соседский" селектор "+" (Label идет сразу после Input). Данный вариант более "независимый", так как мы можем менять местами input и label, и даже разносить их на удаленное расстояние.
    <style>
      input + label {
        color: #ff0000;
      }
    </style>
    
    <input type="checkbox" id="checkbox" />
    <label for="checkbox">чекбокс</label>


    2. И второй вариант. Здесь мы не можем только средствами html/css обратиться "от input к label", так как не существует способа обратиться от ребенка к родителю (это можно, конечно, легко сделать через JS). Существуют селекторы потомков и соседей, но не родителей. Можно обратиться только от label к input, что дает мало преимуществ, так как
    1. input плохо стилизуется
    2. label обычно ничем не примечателен в отличие от input, который информативен (содержит, например, атрибут type).

    <style>
      label > input  {
        outline-color: #ff0000;
        outline-style: double;
      }
    </style>
    
    <label>
      <input type="checkbox" />
      чекбокс
    </label>


    А теперь представим, что нам нужно сверстать нечто подобное на основе (см. картинку):
    5ffea6239c1da641320430.png

    Как это реализовать? Для label соорудим ":before" и ":after", которым дадим форму скругленного прямоугольника и круга (который, к тому же будет перемещаться).

    Здесь второй вариант нам явно не подойдет, так как мы бы хотели в зависимости от состояния checkbox (.checkbox:checked) изменять родственный ему label:before (изменять цвет, перемещать).
    Если хотите взглянуть подробнее на код, пожалуйста:

    Таким образом, принципиальной разницы нет, но первый вариант (с id) более универсален, так как
    1. input и label могут быть разнесены физически (находится в разных местах документа)
    2. label может идти после input, что дает нам возможность обратиться в CSS от второго к первому

    Надеюсь, ответил на Ваш вопрос.
    Ответ написан
    Комментировать
  • PHP. Как получить имя файла по открытому file handle

    Gesper
    @Gesper Автор вопроса
    Сам вопрос задал, сам и отвечу. Пришлось покопаться в мануалах, но ответ нашелся.
    fopen возвращает ресурс типа stream. А среди функций работающих с потоками нашлась функция stream_get_meta_data, которая возвращает ассоциативный массив. В этом массиве есть параметр uri, который и содержит искомое имя файла, с которым ассоциирован наш хендлер.
    Ответ написан
    1 комментарий
  • Как загрузить поток файла post запросом curl?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    поток это поток, файл это файл, ты не можешь передать еще не полученное таким макаром. хотяя... если хочешь знаю один извращенный метод чтобы подсунуть стрим курлу, хотя нафига не очень понятно, чего тебе со stream функциями не работается?
    Ответ написан
  • Eclipse PDT / PHPStorm — как настроить полноценные подсказки?

    AlexeyGfi
    @AlexeyGfi Автор вопроса
    YouTube >>> Битриксоид из Колхоза
    Сам спросил, сам отвечаю =)
    Мучил техподдержку, но разговор похож на теннис — перебрасывание мячика с поля на поле.

    Настроил отладку через xdebug и в вотчере всё увидел.
    Вот как это выглядит в дебагере:
    145d7304f9b846eabb6eb93c43ef0924.png

    ================ Удалённый дебаггинг (remote debug, xdebug) ================
    Инструкция (для тех, кто попадёт сюда с поиска).
    Что нужно для настройки дебаггинга удалённо (потому что, блин, пришлось поковыряться).
    Ниже даны секции по PHPStorm и Eclipse PDT.

    Дано:
    Компьютер №1:
    Windows + PhpStorm.

    Компьютер №2:
    Debian + Апач удалённо.

    Задача: организовать синхронный дебаггинг между компьютерами.

    Важно: шторм будет идти по шагам по вашему файлу, а "слушать" отчёт xdebug, который транслирует, идя по файлам на удалённом сервере.
    Поэтому файл, открытый в шторме, должен быть точной копией того, что выполняется на сервере.

    Шаги:
    1. На сервере устанавливаем xdebug, настраиваем php.ini
    6ff3e74f4c7747a196772da98976f737.png

    В нём я переменную xdebug.remote_enable отключил, потому что на шторм начинают сыпаться запросы со всех сайтов на сервере =)

    Эту переменную инициализировал через .htaccess именно в той директории, откуда провожу отладку:
    php_flag xdebug.remote_enable on

    (!) в рамках всего сайта:
    Чтобы работало так: для обычных пользователей дебаггинг отключен, а для вас стартует — в htaccess прописываем:
    <If "%{REMOTE_ADDR} == '137.126.15.14'">
    	php_flag xdebug.remote_enable on
    </If>

    ... где 137.126.15.14 — ваш IP адрес (аналог php-переменной $_SERVER[ 'REMOTE_ADDR' ])

    Можно htaccess настроить более тонко, чтобы админка не прерывалась в дебаг (или наоборот).
    Пример конфига (REQUEST_URI не захотело использовать, хз почему — в phpinfo() они определены):
    <If "%{REMOTE_ADDR} == '137.126.15.14' && ! %{THE_REQUEST} =~ m#/bitrix/#">
    	php_flag xdebug.remote_enable on
    	php_flag xdebug.remote_autostart on
    </If>


    Если на сервере / на сайте работают разные программисты, можно разделение дебаг-потоков сделать через трансляцию на разные порты в зависимости от пользователя (IP-адреса клиента):
    <If "%{REMOTE_ADDR} == '137.126.15.14' && ! %{THE_REQUEST} =~ m#/bitrix/#">
    	php_flag xdebug.remote_enable on
    	php_flag xdebug.remote_autostart on
    	php_value xdebug.remote_port 9013
    </If>

    ... соответственно, ориентируясь на IP и запрошенный урл, дебаггер транслирует информацию на определённый порт. Программисту остаётся правильно установить туннель.

    2. Пробрасываем SSH-туннель.
    Задача: сделать так, чтобы на порт 9007 компьютера №1 поступала информация, которая транслируется на порт 9002 компьютера №2.

    Исходя из формулировки, благодаря этому способу можно пробросить туннель, если порты отличаются.
    Например, вам достался сервер, на который у вас есть SSH-доступ, но нет возможности менять порт xdebug. Или локально порт занят и вам нужно какой-то нестандартный.
    То есть реально пробросить например туннель, который на порт 9007 компьютера №1 будет транслировать информацию с порта 9002 компьютера №2. Сервер пушит инфу на 9002, а вы на локальном компьютере слушаете порт 9007 .

    Сделал это через putty:
    ff4ab5092dce4326bca9914a4f7168fc.png

    ...как проверить?
    83cd6ae9cd5549269205de6191acade8.png

    ================ PHPStorm ================
    3. На компьютере ставим слушать порт 9007 (в моём случае):
    Меню File / Settings / Languages & Frameworks / PHP / Debug + кнопочка "Start Listening for PHP Debug Connections"
    7c5b067e84c34c3da9cebdb30d151742.png
    +
    916b5cee651c4283bbc48bf997528376.pngUPD: прослушка порта (вкл/выкл).

    Вот скриншот, которого очень не хватает во всех раскопаных туториалах:
    805110c8b3bb43a19192778aac36aac8.pngРезультат: когда шторм слушает порт и мы в обычном браузере открываем страницу, которая находится в разделе, пинаюшем xdebug.remote_enable, шторм перехватывает сигнал и ведёт его уже через свой дебаггер.
    Нужно только не забыть либо поставить breakpoint, либо опцию Break at first line in PHP script, иначе скрипт просто пролетит и даже не заметишь =)

    По поводу соответствия / несоответствия файлов локально и удалённо: если шторм замечает, что не может сопоставить файлы, он выдаст предупреждение и предложит настроить маппинг:
    7d2f592f1d0343759d9ab296a64c8c26.png

    ================ ECLIPSE PDT ================
    Настройка под Eclipse PDT.
    Шаги на сервере и туннеля остаются те же.

    Переходим в Windows / Preferences / PHP / Servers.

    Там создаём новый сервер:
    8390f852457e43afa51c56194fa26bfb.png

    Заходим в него снова и донастраиваем появившиеся вкладки:
    e3818d1a963541c4ae83e613151be318.png

    Ставим созданный сервер по-умолчанию:
    e76298e9b1ea445d9e7347ac853936e5.png

    Поставим ещё, чтобы дебаггер break-нулся с первой же строчки (потом можно отключить и использовать breakpoints):
    dc558e98f2e74b49b499799e7697c02e.png

    Когда убедимся, что всё работает, — рекомендуется проводить то же, но индивидуально для конкретного проекта: через Property проекта, либо через Debug Configuration:

    f96c1932cb334e39bea70d11952878f8.png

    Всё.
    Теперь, когда на порт 9007 поступит сигнал, Eclipse встрепенётся:
    6c181c46964248f59a57a1d08fcb16b6.png

    Принимаем сигнал и начинаем отладку.
    Ответ написан
    Комментировать