• Почему так происходит?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Потому что в первом случае вы в $new_events присваиваете результат сравнения $order->get_new_events_count('comments') > 0 (это может быть true или false).

    echo true;  // выведет "1"
    echo false; // выведет "" (пустую строку).

    Поэтому, какое бы число ни возвращала функция get_new_events_count, если оно больше 0 - всегда будет выводиться цифра 1.

    Правильно делать так:
    <?php
    $new_events = $order->get_new_events_count('comments');
    ?>
    <?php if ($new_events > 0): ?>
        <?= $new_events; ?>
    <?php endif; ?>


    Можно было бы написать то же самое вот так:
    <? if (($new_events = $order->get_new_events_count('comments')) > 0): ?>
        <?= $new_events; ?>
    <? endif; ?>

    Но, сами видите, в таком коде легко допустить ошибку. Присвоение внутри оператора сравнения считается плохой практикой, помимо проблем с порядком выполнения нередки ситуации, когда разработчик пишет if ($foo = $bar), вместо if ($foo == $bar)

    А во втором в if выполняется нормальная проверка, но функция get_new_events_count вызывается дважды, вы, судя по всему, именно этого хотите избежать.
    Ответ написан
    Комментировать
  • Как в git перенести некомиченные изменения из одной ветки в другую?

    Denormalization
    @Denormalization
    Можно так же использовать git stash для этого.
    Особенно если нужно переключиться на другую ветку, там что-то сделать и потом вернуться обратно.
    Ответ написан
    1 комментарий
  • Что же лучше процедурный подход или ООП?

    @Espleth
    Сейчас практически везде используется ООП. Почему? Так, очевидно, проще.
    Почему ООП используется не везде? На то есть пара причин: 1) ООП код работает медленнее. Поэтому там, где нужна высокая скорость работы, очень часто используют Си, например драйвера. 2) На совсем небольших проектах ООП не дает особого улучшения кода. Даже наоборот, возможно в процедурном стиле код будет выглядеть проще.
    Я понимаю все это примерно так.
    Ответ написан
    Комментировать
  • Что же лучше процедурный подход или ООП?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Все имеет свою цену. Не существует лучшего подхода просто самого по себе.
    Существует задача, требования к задаче и от этого уже отталкиваться какой метод в конкретном случае будет удобнее.
    Поэтому не нужно искать теоретических выводов.
    Ответ написан
    1 комментарий
  • Как в yii проверить ,является модель единичным экземпляром или коллекцией?

    maximw
    @maximw
    is_array()
    Но вообще, если такая проблема возникла, то ее решение - костыль. Такого быть не должно, это проблемы в архитектуре приложения.
    Ответ написан
    Комментировать
  • Как вы строите архитектуру приложения?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Тут мой ответ по связанной теме: Как составить план проектирования проекта?
    А кроме того, хочу отметить, что начинать проект с дизайна (если Вы имеете в виду дизайн пользовательского интерфейса) это в большинстве случаев очень плохая практика. Проект нужно начинать с концепции, а потом переходить к информационной модели, потом к структурам данных (как в базе, так и в памяти) и уже потом только понятно, что на экране будет делаться. Исключение могут составлять игры, электронные книги, анимационные, интерактивные и подобные произведения, которые являются в большей степени произведением визуального искусства, чем программным продуктом. Из средств проектирования посмотрите разные реализации UML и RUP (Rational Unified Process), например Rational Rose. Вот, посмотрели, и понравилось - берите, а стало страшно - значит это Вам не нужно. Это для проектов крупных и очень крупных. Что точно нужно, так это уметь рисовать ER-диаграммы на бумажке карандашом, архитектуру модулей программной системы и железную инфраструктуру для развертывания. На большинство вопросов, которые Вы задаете, ответы можно дать только относительно конкретного проекта. Иногда нужны автоматизированные средства проектирования, иногда они не нужны и все можно сделать в уме и сэкономить время. Это очень зависит от задачи и опыта. Но что определенно, так не следует разводить лишней бюрократии,
    Ответ написан
    1 комментарий
  • Каковы Ваши доводы за неиспользование транслита в коде?

    @Dvvarreyn
    Я не знаю транслита и не видел курса по нему, а английский можно выучить. (здесь я, наверное, немого лукавлю, но и программист тот вряд ли совсем уже не знает английского)

    Я читаю транслит гораздо медленней, чем английский. (и это чистая правда, транслит читаю по слогам, мне проще незнакомые романские языки читать, чем транслит)

    На транслит много стандартов, каждый пишет, как ему захочется. С английским проще.

    Названия ключевых слов и прочего в языке программирования на английском, и английские же названия переменных и функций сморятся более эстетично foreach object in list: validate(object), чем рунглиш.
    Ответ написан
    Комментировать
  • Каковы Ваши доводы за неиспользование транслита в коде?

    Отправьте на курсы английского
    Ответ написан
    Комментировать
  • Проверка наличия данных в бд. Как?

    Ashlst
    @Ashlst
    Фанат эстетики и красивых решений.
    Используйте mysqli_num_rows()...если результат - 0 - пропускаем,иначе - выводим..Для удобства,я бы привел к булевому типу.
    Вариант лучше:
    Использование PDO.Пример:
    $PDO = new PDO('mysql:dbname=admin_ibanking', 'root', '');
    $result = $PDO->query(
                sprintf(
                    'SELECT EXISTS (SELECT * FROM secretnumber WHERE productnumber = %s) is_exist', $productNumber 
                         )
                     )->fetchObject();
    echo ($result->is_exist) ? 'Yes' : 'NO';


    UPD: Пример взят здесь
    Ответ написан
    Комментировать
  • Как лучше построить таблицы в БД?

    @AlikDex
    2 таблицы

    1) таблица городов
    city_id Города | city название города.
    1 | Тверь

    2) - таблица фраз
    city_id города | key - хз как обовать. смысл короче | фраза.
    1 | header | "Добро пожаловать..."

    Можно еще конечно третью таблицу придумать, чтобы привести в третью нормальную форму и исключить одинаковые фразы, но это ни к чему. У вас де не килотонны текста.
    А работает просто:
    SELECT * 
    FROM `phrases` as p
        JOIN `cities` AS c USING (city_id)
    WHERE `p`.`city_id`="1";
    Ответ написан
  • Почему не работает php в html?

    Закройте туториал из которого Вы берёте код и никогда не открывайте. И пожалуйта, не пытайтесь больше вставить PHP в HTML.
    Ответ написан
    2 комментария
  • Как сделать post запрос с передачей параметров в виде json?

    @matperez
    Попробуйте Guzzle. Отличная штука.
    Ответ написан
    Комментировать
  • Множестов объектов одним запросом (insert/update)?

    @deliro
    Транзакцией.
    Ответ написан
    Комментировать
  • Можно ли использовать type hinting для Object?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    how уже ответил и дал по поводу интерфейса дельное замечание. Но оно не раскрыто подробнее, новички в ООП не поймут. Исправляю ситуацию, так как это полезный трюк:

    1. Создаем пустой интерфейс
    interface Object {
       // Здесь ничего нет
    }

    Его название потом и будем использовать для type hinting.

    2. Имплементируйте этот интерфейс в нужных классах:
    class MyBaseClass implements Object {
       // ваш обычный код класса
    }


    3. Теперь все будет работать, например:
    function myFunc (Object $obj);
    Ответ написан
    Комментировать
  • Как создать объекта в Yii2 по имени в переменной?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Тут Yii2 совсем не при делах. Это работа с неймспейсами, которую вам нужно изучить.

    $string = '\\read\\the\\docs\\Php';
    $obj1 = new  $string;
    
    $result = $string::someMethod();
    Ответ написан
    Комментировать
  • Как организовать загрузку файлов в форме?

    vakorovin
    @vakorovin
    Разработчик
    Здравствуйте! Не раскрыли вы полностью ваш вопрос, но постараюсь ответить, исходя из наших проектов на yii2.
    Если используется механизм, при котором файлы можно прикреплять на этапе создания некой модели (скажем Portfolio), и загружаются они сервер посредством ajax-запроса (к примеру https://github.com/hayageek/jquery-upload-file), то возникает ситуация, что привязываться то еще не к чему (объект класса Portfolio еще не сохранен), а файлы уже на сервере. На этот случай используем поле hash, значение которого уникально, и именно по нему привязываются файлы. Т.е. при создании нового объекта Portfolio сразу генерируем уникальный hash, передаем его в форму создания, и с ним грузим аяксом файлы. При желании можно повесить cron-задачу для удаления из файловой системы файлов, которые привязаны к несуществующему Portfolio.hash.

    Далее, сама модель. Берем официальную документацию:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    Расширяем как нам угодно, например так:

    class File extends \yii\db\ActiveRecord
    {
        public $file;
    
        public function rules()
        {
            return [
                [['file'], 'file'],
                [['filename', 'parent_id'], 'required'],
                [['parent_id'], 'integer'],
                [['filename', 'path'], 'string', 'max' => 255],
                [['description'], 'string']
            ];
        }


    Далее, в контроллере как себя вести, описано как раз по ссылке выше, но в нашем случае суть такова - для каждой новой модели (об этом чуть позже) получаем сам файл:

    $model = new File();
            $model->file = UploadedFile::getInstance($model, 'file');


    и назначаем все остальные параметры, будь то parent_id или что-то еще (включая генерацию нового имени для хранения в файловой системе). Далее, если модель проходит валидацию - сохраняем ее в БД и сохраняем файл в файловой системе:

    if ($model->file && $model->validate()) {                
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }


    Одно уточнение. Если загружать файлы по одному, и только в форме показывать несколько полей, то это решается средствами js, повесить кнопку для создания очередных fileInput с именем File[][file] и textInput File[][description] - проблем не составит. А вот если требуется закинуть их сразу пачкой, то выходов 2 - либо как в указанном по ссылке примере - в одной модели разрешить мультизагрузку, и уже из нее (после валидации) создавать нужные вам модели, либо (что мне кажется логичнее) играться с методом formName(), который будет возвращать нужное имя аттрибута из формы.

    Т.е. в базовом случае поля формы имею имена File[file], File[description], File[id]. В нашем же случае получаются такие имена:

    File[0][file], File[0][description], File[0][id];
    File[1][file], File[1][description], File[1][id];
    File[2][file], File[2][description], File[2][id];


    Теперь в контроллере в цикле проходим

    foreach (Yii::$app->request->post('File') as $sn => $file){
            $model = new File;
            $model->fakeFormName = "File[{$sn}]";
            $model->file = UploadedFile::getInstance($model, 'file');
        }


    В примере выше мы заранее создали свойство $fakeFormName, в которое поместим требуемое для каждого случая базовое имя полей формы и вернем его значение в методе formName(), в таком случае UploadedFile::getInstance($model, 'file') сработает как надо.

    Уф, не знаю, насколько доходчиво разъяснил, что-то может потерял в потоке сознания, но думаю основную суть и опорные точки разъяснил. Если что-то непонятно, отпишитесь, я распишу подробнее (проектов на Yii2 много, все включают работу с файлами в той или иной степени, есть разные реализации, в том числе прямо сейчас пишем файловый менеджер для нашей админки на yii2).
    Ответ написан
    Комментировать