• Как сделать карусель такую же как у гинзы?

    они используют www.idangero.us/swiper

    более простой вариант www.owlcarousel.owlgraphic.com
    Ответ написан
    Комментировать
  • Как реализовать множество условий?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Итак... возьмем ваш код

    if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) die("Bad login");
            if (
            $type != 'voice' and $type != 'balance1' and $type != 'balance2' and $type != 'absvoice' and $type != 'passhash' and
            $type != 'paytime' and $type != 'white1' and $type != 'exp1' and $type != 'white2' and $type != 'voice2' and
            $type != 'exp2') die("Wrong type");
            if ($action != 'set' and $action != 'get' and $action != 'add') die("Wrong action");
            if ($action == 'set' and !(preg_match("/^[0-9-.]+$/", $value)) and $type != 'passhash') die("Wrong value");
            if (($action == 'set' or $action == 'add') and ($type == 'paytime' OR $type == 'absvoice')) die("paytime/absvoice read only");
            if (($action == 'add') and ($type == 'passhash' or $type == 'white1' or $type == 'white2')) die("add not available for this");


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

    if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) die("Bad login");
    
    $availableTypes = ['voice', 'balance1', 'balance2', 'absvoice', 'passhash', 'paytime', 'white1', 'exp1', 'white2', 'voice2', 'exp2'];
    if (!in_array($type, $availableTypes)) {
        die("Wrong type");
    }
    
    if (!in_array($action, ['set', 'get', 'add'])) {
        die("Wrong action");
    }
    if ($action == 'set' and !(preg_match("/^[0-9-.]+$/", $value)) and $type != 'passhash') {
        die("Wrong value");
    }
    if (($action == 'set' or $action == 'add') and in_array($type, ['paytime', 'absvoice'])) {
        die("paytime/absvoice read only");
    }
    if (($action == 'add') and (in_array($type, ['passhash', 'white1', 'white2']))) {
        die("add not available for this");
    }


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

    Далее мы можем вынести эти правила в массив, и тогда избавиться от ифов вообще, так как мы заменяем их на массив правил для каждого экшена. Но все портит регулярное выражение для set, у меня есть подозрение что... оно не верно.

    updated: избавляемся от всех ифов (точнее заменяем на один)
    $constraints = [
        'unsupportedTypes' => !in_array($type, $availableTypes),
        'unsupportedAction' => !in_array($action, ['set', 'get', 'add']),
        'expectedNumericValue' => $action == 'set' && is_numeric($value),
        'readOnlyType' => 'get' !== $action && in_array($type, ['paytime', 'absvoice']),
        'disallowedTypes' => 'add' === $action && in_array($type, ['passhash', 'white1', 'white2']),
    ];
    
    $constraintsMessages = [
        'unsupportedTypes' => 'Type "<type>" is not supported',
        'unsupportedAction' => 'Action "<action>" is not supported',
        'expectedNumericValue' => 'Wrong value, expected numeric',
        'readOnlyType' => '<type> is read only',
        'disallowedTypes' => 'Type "<type>" is not supported for action "<action>"'
    ];
    
    $errors = array_keys(array_filter($constraints));
    if (!empty($errors)) {
    
        die(str_replace(
            ['<type>', '<action>'],
            [$type, $action],
            $constraintsMessages[reset($errors)]
        ));
    }


    это дело можно еще упростить и соорудить нормальные правила валидации + отдельную функцию которая будет проверять все это дело.
    Ответ написан
    2 комментария
  • Какие впечатления от Phalcon по сравнению с Symfony / Yii?

    TrogWarZ
    @TrogWarZ
    web developer
    Переходил с Yii 1 на Phalcon 1.3.x. Сейчас крутится на проде, всё хорошо.

    Нижеописанное – субъективное имхо:
    – Проще понимать, но документация скуднее.
    – Допотопная ORM. После Yii кажется кастрированной, в некоторых случаях она ещё и неоптимально работает с базой by design. Если запилить свой велосипед типа OrmModel, который будет расширять функционал и уменьшать многословность, то более-менее пользоваться можно.
    – Чрезмерно многословная ORM: связи, события, валидация.. да всё. До лаконичности Yii с учётом идеологии Phalcon ей не добраться.
    – Отвратительный нефункциональный CLI (имею ввиду tasks), его даже кастрированным называть – преувеличивать.
    – Удобный встроенный cli для генерации шаблонного кода.
    – Очень удобные и простые конфиги, сервисы, DI, миграции. Архитектурно намного удобнее, чем в Yii.
    – Есть облегчённая версия (Micro) для мелких проектов – на ней писать REST API одно удовольствие.
    – Шустрый шаблонизатор.
    – Удобная работа с кэшерами, есть разделение на front/back кэши, дублирование данных и приоретизация по скорости между ними.
    – Удобно создавать свои расширения или инклудить в проект сторонние.
    – Несмотря на реализацию в виде .so, есть годный официальный автокомплит для IDE.
    – Есть полуофициальный(?) репозиторий удобных расширений – Incubator.

    В целом, впечатления хорошие, не считая ORM. Для прода готов (:
    Ответ написан
    2 комментария
  • Какие впечатления от Phalcon по сравнению с Symfony / Yii?

    deadbyelpy
    @deadbyelpy
    веб-шмеб
    Все собираюсь написать про это статью, да никак.
    если кратко имхо то: Phalcon лучше чем Symfony, который лучше чем Yii
    какие критериии отбора? Symfony имеет больший порог входа чем Phalcon, Yii же имеет порог входа еще меньше, но он отстает по архитектуре "внутри"
    Phalcon имеет Volt (шаблонизатор), у SF - Twig, Yii - ничего (но никто не мешает ставить туда Twig)
    У Ph,SF есть вменяемый DI, а Yii это Yii->app()
    SF поставляется с ACL, Yii - RBAC + ACL, Phalcon - ACL.
    Ph, SF2 (Doctrine) есть AR, у Yii же еще есть и DAO
    Ph на шаред хостинге не развернешь, но кто делает проекты для шаред хостингов на SF2? На Yii знаю т.к. достаточно быстро можно развернуть бложик.
    Больше написать просто неуспеваю, напоследок. делать сложные приложения на Phalcon уже можно, он готов к проду, он проще чем SF2 и удобнее, при этом архитектура у него продуманная как и у SF2
    Продвинул идею Phalcon в компании где работаю, его с радостью встретили и с радостью пользуются для сложных, enterprise проектов.
    все конечно только исходя из моего опыта работы с ними. не навязываю никому свое мнение
    Ответ написан
    6 комментариев
  • Как средствами Yii2 проверить на валидность Email?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    docs.mirocow.com/doku.php?id=yii2:start

    $email = 'test@example.com';
    $validator = new yii\validators\EmailValidator();
    if ($validator->validate($email, $error)) {
        echo 'Email is valid.';
    } else {
        echo $error;
    }
    Ответ написан
    Комментировать
  • Как сделать выезжающую панель для сайта?

    @nizulko Автор вопроса
    воча гона ду
    Скрипт реализован очень быстро и качественно!

    С позволения автора, публикую пару решений:
    jsfiddle.net/4vuPS/1/ — панель открывается по щелчку и закрывается также
    jsfiddle.net/4vuPS/2/ — панель открывается при наведении и закрывается по щелчку

    Огромнейшее спасибо и низкий поклон!!!
    Ответ написан
    1 комментарий
  • Для чего нужна ORM?

    Вы не путаете ORM с DBAL? ORM это не технология замены SELECT * FROM goods WHERE cost < 100.00 на $db->select()->from('goods')->where('cost < 100.00'). ORM это способ задания связи объектов и РСУБД. По сути позволяет абстрагироваться от способа хранения объектов вообще, с лёгкостью переходя от SQL к NoSQL, memcache, файлам или REST/RPC API на удалённом сервере, оперируя на уровне модели (если говорить о MVC и т. п.) простыми plain old objects, а их персистентность отдать контроллеру. Не $db->select()->from('goods'),, не mysql_query('SELECT * FROM goods'), а $goodsRepository->findAll(), а уж будет репозиторий формировать SQL запрос, читать файлы или память, а может стучаться на Гугл и парсить его вывод — его, репозитория, личное дело (а также разработчика(ов), отвечающих за подсистему хранения).

    Кроме того ORM, как правило не исключает обращение к БД на уровне произвольных SQL запросов, оно лишь преобразуют результаты этих запросов в объекты модели предметной области (и наоборот), которые ничего не знают (в идеале) о таблицах, WHERE, HAVING и т. п.

    ORM это не только инструмент архитектурного разделения областей ответственности объектов и классов приложения, а также инструмент облегчения разделения труда разработчиков: кто хорошо шарит в SQL вообще и особенностях конкретного движка в частности — работает по «ту сторону» ORM, оптимизирует его как хочет, может нормализовывать и денормализовывать, например; кто хорошо разбирается в дебетах и кредитах — работает с plain old objects в терминах предметной области и может вообще ничего не зная об SQL, ему лишь нужно знать, что он всегда может получить объект или их коллекцию обратившись к методам вроде findById() или findAll() и сохранить результат работы методом save() или flush().
    Ответ написан
    3 комментария