• Почему не выбираются элементы не принадлежащие ни к одному разделу из инфоблока при критериях SECTION_ACTIVE и SECTION_GLOBAL_ACTIVE в фильтре Bitrix?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    <? 
    array(
    	"IBLOCK_ID" => $iblock_ids, 
    	"ACTIVE" => "Y", 
    	array(
    		"LOGIC" => "OR",
    		array( 
    			"SECTION_ACTIVE" => "Y", 
    			"SECTION_GLOBAL_ACTIVE" => "Y"
    		),
    		array( 
    			"IBLOCK_SECTION_ID" => 0, 
    		)
    	),
    )


    Фильтр со сложной логикой под таблицей есть описание.
    Ответ написан
    Комментировать
  • Сколько стоит час веб-разработчика-фрилансера?

    @deliro
    Ты веcь такой кругом молодец, то знаешь, это знаешь. А теперь представь себе среднестатистический проект, который должен приносить бизнесу деньги. За две недели работы ты едва напишешь хлипкий CRUD для данных, неправильно смаппив бизнес-сущности в объекты ORM, ещё через месяц натянешь какой-то слайдер на jQ, попутно захватив 2мб JS кривых библиотек, а через два заказчик поставит тебе плохую оценку, потому что твой ценник он оплатил не за то, что ему нужно, а потому что ты знаешь монады, которые ему даром не сдались.

    А теперь давай представим простого программиста. Из алгоритмов он с трудом вспоминает сортировку пузырьком, а двусвязный список — предел его знаний о структурах данных, и даже этим списком он пользовался два раза в жизни. Хаскель он никогда не видел в глаза, C++ учил только в школе, вместо этого пишет неэффективный код на PHP. И у него есть опыт. За день он распишет сущности, за второй сделает универсальный CRUD, на третий день поднимет фронт на React'е с SSR. Да, внутренности проекта будут "медленными". Вместо O(logN) что-то будет выполняться за O(N) или даже O(N^2), но всем похер. Пока всё работает на приемлемом уровне — бизнес радуется.

    Кстати, к чему эта поучительная лапша? Я хотел сказать, что всеми этими модными словами можно пугать друзей и преподавателей, но в реальной жизни все алгоритмы уже реализованы, все типы данных уже подобраны оптимально. Знать их полезно для себя (чтобы мозг не атрофировался), но не для работы. Для работы тебе нужны такие навыки как:

    * Оптимальный баланс между говнокодом и идеальным кодом
    * Оптимальный баланс между скоростью разработки и оптимизацией кода
    * Оптимальный баланс между поддерживаемым кодом и костылями
    * Умение использовать те инструменты, с которыми ты работаешь. Опять же, для того, чтобы писать быстро, при этом имея минимальное количество говнокода и обеспечивая максимальную поддерживаемость (в пределах сроков). Например, можешь выкинуть в помойку свой Vim, как бы круто ты себя не чувствовал, разрабатывая в консольном редакторе, если продукты от JetBrains позволят за это же время сделать что-то лучше или чего-то больше
    * Чувство "знаю больше менеджеров". Это то чувство, когда тебе кажется, что "вот эта фича скоро изменится" и надо сделать архитектуру заранее более гибкой. Или "вот эту фичу мы через месяц выпилим" и не надо тратить на неё силы — напиши костыль и через месяц с чистой совестью удали его
    * Знания, как сделать ту или иную фичу. Потому что фичи повторяются (немного видоизменяясь) от проекта к проекту. И если ты сделал что-то за два дня, в следующий раз ты похожее сделаешь за три часа

    Что касается инструментов, выбери любой полноценный фреймворк, который умеет решать 90%+ потребностей "из коробки": Symfony, Django, Laravel

    Всякие "минималистичные" поделия вроде Falcon, Flask (в PHP не знаю, я на питоне пишу) оставь хипстерам. Пусть они говорят: "Мой фалкон такой быстрый, он написан на Cython". Тебя это не должно волновать, потому что бизнес с твоей скоростью разработки уже заработал достаточно денег, чтобы купить ещё десять серверов, пока фалконисты неделю гуглили, как прикрутить миграциии и запустить юнит-тесты на VPSке за пять баксов.
    Ответ написан
    5 комментариев
  • Зачем в современном php фреймворки?

    borisdenis
    @borisdenis
    Ленив и вреден...
    Ну вот вы сами себе противоречите
    плохо не использовать фреймворки в современном php?

    наш микро фреймворк документирован

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

    Ну а на Ваш вопрос - Зачем в современном php фреймворки можно ответить очень просто - А зачем Вы в процессе разработки создали свой микрофреймворк?
    Ответ написан
    Комментировать
  • Переменная или define? Когда что использовать?

    DevMan
    @DevMan
    что лучше использовать: мягкое или теплое?
    константа и переменная - совершенно разные понятия.
    и лучше начать с осознания этой простой истины и прочих основ программирования.
    Ответ написан
    Комментировать
  • Bitrix. Правильная кастомизация шаблонов?

    sabramovskikh
    @sabramovskikh
    Просто никто не пользуется стандартными шаблонами, у всех свои наработки.
    Стандартный шаблон создан только для людей, которые никогда и не полезут в код.
    Ну уж если нужно отформатировать - phpStorm с этим отлично справляется
    Ответ написан
    Комментировать
  • Как грамотно обновиться?

    Важно учитывать какие кастомизации выполнялись на сайте с момента последнего обновления и готовность кастомного кода сайта к переход на другую версию php так как актуальная версия Битрикс требует актуальной версии php.

    Порядок действий и что нужно учитывать:
    1. Активировать лицензию на основной версии сайта без установки обновлений.
    2. Развернуть тестовую копию сайта на площадке с настройками соответствующими основному сайту
    3. Выполнить проверку "Монитор качества" на предмет модификации файлов ядра Битрикс.
    3.1. При обнаружении модификаций проверить что это - кастомный код который нужен для работы проекта и написанный в недопустимом месте или ложно срабатывание инструментов проверки сайта.
    3.2. Выявленный кастомый код перенести в корректное место - отдельные компоненты или файлы обработчики где этот код не будет затерт при обновлении.
    4. На тестовой копии выполнить обновления до 17.1 или 17.5. На этом этапе могут быть выявлены первые трудности.
    4.1. Компоненты оформления заказа переходят на новое API и при наличии кастомных обработчиков в шаблонах оформления заказа будут выявлены ошибки.
    4.2. Серьезные изменения в работе с JS Битрикс также нужно проверить готовность сайта к работе с новым JS
    5. Выполнить конвертации таблиц базы интернет магазина и перейти на ядро D7.
    6. Скорее всего возникнут проблемы в работе функционала оформления заказа. Вреенно можно перевести оформление заказа в режим совместимости со старым API.
    7. Если на сайте была подключена 1С, службы оплаты, службы доставки - на этом этапе они отавалятся так как формат работы Битрикс с оплатами изменился.
    8. Если все работает обновляем Битрикс до 18.1 и проверяем функционал
    9. Переключаем работу сайта на php 7.0 (можно сразу на php 7.1, но лучше решать проблемы поэтапно)
    10. После переключения версии php проверяем корректность работы кастомного кода на новой версии и при необходимости переписываем код на совместимый с актуальной версией php

    Это общий сценарий. Каждый случай индивидуален и друдозатраты по задаче зависят от качества разработки сайта, качества кастомного кода. Но даже при корректной разработке при таком значительном обновлении многие сторонние модули установленные на сайте потребуют доработки или как минимум обновления.

    Задача может потребовать от 10ч. до 200ч и больше. Это зависит от количества и качества кастомного кода (от размера технологического долга проекта). В некоторых случаях приходится весь "костыльный" кастомный код перерабатывать в модули и компоненты.

    Самый запущенный случай который встречал - это технологический долг в 500-600ч.
    было принято решение запускать новый проект и постепенно в нем корректно реализовывать весь кастомный функционал без потери возможности устанавливать обновления.

    Не запускайте свои проекты - следите за тем что бы технические специалисты при выполнении задача соблюдали требования Битрикс к реализациям и сохранялась возможность устанавливать обновления.
    Ответ написан
    7 комментариев
  • Как сделать уникальный ЧПУ на уровне раздела?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    • Отключаете стандартную проверку на уникальность символьного кода в настройках ИБ.
    • Пишите собственную функцию проверки символьного кода на уникальность в рамках раздела (например checkElementXmlId($xmlId, $sectionId)). Проверку выполняйте с помощью CIblockElement::GetList
    • Пишите собственные обработчики событий OnBeforeIBlockElementAdd и OnBeforeIBlockElementUpdate. В этих событиях проверяйте XML_ID элемента с помощью ранее написанного метода checkElementXmlId. Примеры обработчиков событий можете по ссылка на страницах с документацией.
    Ответ написан
    1 комментарий
  • Что конкретно делает эта функция mysqli_real_escape_string()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQL инъекции, уже облажался.

    При том что функция эта совершенно примитивная - экранировать кавычки в строках SQL. Для соблюдения корректного синтаксиса. Это единственная функция этой функции, и больше ни для чего она не нужна.

    Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
    SELECT * FROM table WHERE name='vasya'
    Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
    SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'

    Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
    Поэтому кавычки надо экранировать.
    SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'

    никаких ошибок не выдаст.
    Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки,
    SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'

    то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
    Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений.

    Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в которых слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
    Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

    Но читатель уж сучит ножками в нетерпении - а что же SQL инъекции, о которых так долго говорили большевики? Не может же быть, чтобы они были совсем не при чем. Окей, в качестве побочного эффекта, строка, в которой экранированы спецсимволы (слеш и кавычка), не пропустит инъекцию. Но здесь следует понимать две вещи:

    1. Строки надо форматировать в любом случае, независимо от того, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна.
    2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью.

    То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

    Нашлись умные люди, которые придумали, что колупаться вручную с форматированием переменных для SQL запроса - это долго, неудобно, и можно что-то забыть или перепутать. И пусть лучше БД сама этим занимается. И придумали вместо переменных подставлять в запрос специальные маркеры, а сами переменные передавать отдельно. А БД уже потом сама разберется, что и как форматировать.

    В принципе, mysqli умеет так делать, но не так удобно как PDO. Поэтому при возможности вместо нее лучше использовать PDO:
    $stmt = $pdo->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->execute(["Vasya", "Д'Артаньян"]);
    $rows = $stmt->fetchAll();
    - и получить, в итоге, готовый массив с данными, которые вернула БД.
    Если же возможности нет, то кода придется написать чуть побольше
    $stmt = $mysqli->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->bind_param("ss", ...["Vasya", "Д'Артаньян"]);
    $stmt->execute();
    $rows = $stmt->fetch_all(MYSQLI_ASSOC);


    Но при этом всё равно никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. Просто, быстро, лаконично и безопасно.
    Ответ написан
    4 комментария
  • Webstorm vs VS Code 2019?

    Я считаю каждый работает на том, на чем привык работать и будет хвалить именно свой IDE или редактор кода. За свое время я работал со следующими IDE для написания JS кода и все они казались мне ничего:
    • Adobe Dreamweaver
    • Eclipse
    • Komodo IDE
    • Codelobster
    • NetBeans IDE
    • Visual Studio

    Но веб не стоял на месте, появлялись новые стандарты js, npm, ESLint, grunt, gulp, webpack и прочее. И из этой шестерки более менее успевал за модой только Visual Studio. Успевал это конечно очень образно говоря. Про остальные я вообще молчу.
    И когда я познакомился с WebStorm меня конечно сразу подкупила его функциональность, современность, следование тенденциям в веб-разработке. Так вот о чем я, VS Code конечно тоже хороший редактор, но главный его плюс это бесплатность. В плане функционала, современности и удобства пользования у WebStorm нет конкурентов. Но понять это можно только используя если не все, то хотя бы половину его возможностей. Многие его фичи открываются только любопытным людям.

    P.S. Многие говорят что у VS Code есть плагины, но все почему-то забывают что у WS они тоже есть.
    Ответ написан
    Комментировать
  • Как отследить нажатие на кнопку php?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    При нажатии на них должна меняться переменная в php:
    В первую очередь, Вы должны понимать, что переменные в PHP будут переинициализированы, при каждом новом запуске скрипта и то, что все переменные и значения в PHP-скрипте существуют только в тот момент, пока этот самый скрипт выполняется.

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

    Как это сделать?)
    С помощью отправки формы на сервер, либо с помощью AJAX-запроса, это наиболее распространённые способы.
    Ответ написан
    4 комментария
  • Насколько важен PHP в системном администрировании?

    mindtester
    @mindtester
    http://iczin.su/hexagram_48
    Есть ли связь между PHP и системным администрированием?
    нет

    ps разве что если админу надо сопровождать сайт на php. с таким же успехом можно говорить о связи админства с 1С, к примеру, и это будет, возможно, даже чаще востребовано

    pps теоретический хороший админ, знает много операционных систем, умеет создавать кластера, умеет обслуживать разные СУБД, возможно очень много разных СУБД.. и очень много разного ПО, как серверного, так и десктопного

    ppps но самое главное - умеет во время делать бекапы. мало того - такие, из которых можно быстро запустить систему после большой аварии
    Ответ написан
    Комментировать
  • Как скрыть путь к файлу скрипта в form?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не нужно ничего ни от кого скрывать, это бессмысленно. И к "информационной безопасности" такое втыкание головы в песок не имеет ни малейшего отношения.
    Ответ написан
    2 комментария
  • Как синхронизировать store и back-end?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Насколько хороши варианты:
    1. интервалом синхронить стейт корзины.
    2. Синхронить стейт при событии onunload
    3. Писать обработчик кликов, который будет регулировать частоту запросов (очень не хочется)

    У всех этих вариантов есть общий недостаток. Предположим, кот пользователя внезапно решил поиграть с кабелем питания компьютера и выдернул его. Ну, как-то так получилось. Или пользователь телефон выронил, при падении слетела крышка, аккумулятор вывалился. Или ещё что-то в том же духе. Короче, отрубилось всё. А перед этим пользователь как раз добавил товар в корзину / изменил количество / удалил товар из корзины. И никакой синхронизации.

    Надо как-то сразу сохранять состояние корзины, после любого действия пользователя, немедленно. Пишите его в localstorage. Под это дело есть плагины для vuex - например. При загрузке приложения синхронизируйте.

    Как синхронизировать в процессе работы - я бы предпочёл третий вариант. Только конечно не клики надо обрабатывать, а состояние корзины в хранилище. Делаете watch, в обработчике - запрос на синхронизацию с сервером, обёрнутый в debounce (лень писать - можете легко нагуглить готовый вариант).

    Т.е., будет что-то вроде

    methods: {
      syncCart: debounce(function() {
        ...
      }),
    },
    watch: {
      '$store.state.cart': {
        immediate: true,
        deep: true,
        handler: 'syncCart',
      },
    },
    Ответ написан
    Комментировать
  • Как описать текст окружностью?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    Ответ написан
    Комментировать
  • Как обновить фронтенд на существующем проекте?

    nuykon
    @nuykon
    Full Stack Developer
    Я так понимаю вы в ручную html пишите(про шаблонизаторы и препроцессоры слышали)?
    Сделайте сборщик используя gulp/webpack/nodejs, который к примеру по мимо html будет собирать php/tpl/twig/blade файл.
    Я к примеру использую pug шаблонизатор, webpack у меня собирает из него html, из stylus/less/sass собирается css при необходимости я использую плагин или самописный скрипт, который переименовывает html в php к примеру или создает копию и переименовывает ее (не в ручную, все скриптами).

    Если не хотите осваивать все эти инструменты, то можно попробовать вот это - https://github.com/pug-php/pug, будете писать вместо html pug шаблоны, а бекендер будет работать с ними же.

    Еще как вариант - фронтенд делаем SPA, с бекендом общаемся по JSON API, в таком случае бекендеру не нужно вообще возиться с шаблонами(ни php, ни html) и вам не нужно лезть в php(бекенд)
    Ответ написан
    2 комментария
  • Как реализовать такой переход по страницам?

    @jasper-blondin
    Как сделать чтоб при нажатии на привязанный элемент на детальной странице "Элемент_основной" мы переходили на страницу привязанного элемента, но при этом адрес в строке браузера был Каталог/Раздел/Элемент_основной/привязанный_элемент


    Легко. Рассмотрим по шагам.
    1. В sections.php шаблона комплексного компонента каталога получаем текущий адрес, парсим его.
    2. Распарсив адрес, мы сможем определить, какой именно объект каталога (корень, раздел или элемент) вызывается.
    3. Если вызывается элемент каталога, забираем код элемента из адреса, заполняем массив $arResult["VARIABLES"] и инклудим файл element.php.
    4. В ином случае отображаем то, что у нас написано в sections.php (т.е. корень каталога, там обычно TOP элементов).
    Ответ написан
    1 комментарий
  • Math.random() в цикле each(). Как сделать чтобы в каждой итерации число было рандомным?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Вы хоть и выполняете рандом для каждого program-link, но назначаете этот рандом не к текущему элементу, а к всем. Код $('.program-link img') берет все элементы img из program-link. т.е. каждую итерацию, вы создаете случайный поворот, и назначаете его ко всем картинкам. В итоге, после работы скрипта, все картинки имеют один угол поворота - последний сгенерированный.
    Вот так лучше:
    $(document).ready(function () {
            $('.program-link').each(function(){
                var degree = Math.random() * (5 + 5) - 5;
                $(this).find('img').css( // берем картинку только из текущего .program-link
                    {transform: 'rotate(' + degree + 'deg)'}
                )
            });
        });
    Ответ написан
    1 комментарий
  • Почему в php 7.0 работают модификаторы классов?

    DevMan
    @DevMan
    тащемта их завезли ещё в пхп5.
    в 7.1 прост расширили их действие на константы.
    Ответ написан
    Комментировать
  • Как правильно сделать фильтр по нескольким полям?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    UF_ROLE и UF_PROFILE это не поля \Bitrix\Main\UserTable. Скорее всего вам должна была высветиться ошибка с сообщением об этом.
    Ответ написан
    1 комментарий