• Как сделать динамический select с помощью PHP Yii?

    @likeapimp
    web dev, web design
    Здесь лучше jquery использовать
    Ответ написан
    2 комментария
  • Yii 2 Html::a() options - защита от быдлокода?

    вы видимо используете ссылку внутри колонки грида, а в настройках колонки по умолчанию тип html, который с помощью HtmlPurifier чистит ссылки от барахла. Для использования ссылки as is надо поставить тип raw.
    Ответ написан
    1 комментарий
  • Как заполнить форму на другом URL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    нужен подобный «тестер»

    Не нужен. Это бессмысленная проверка.
    Без всякого теста и так очевидно, что бот зарегистрируется.
    Ответ написан
    Комментировать
  • DOMDocument php, как получить содержимое блока, с html тегами?

    deleted-tnorman
    @deleted-tnorman
    Вот чудо методы для работы с дом-моделью в PHP.
    Я не сильно понял вопрос, но благодаря всякой фигне, которая тут написана, мне удалось управлять DOM моделью в PHP.

    Вам надо обратить внимание на всякие такие штуки как DOMElement. Потому, что получив DOMDocument веселье не кончается. Теперь вам надо наладить работу с его "Документа" элементами. А значит не помешает так же распочковать структуру всех искомых элементов.
    Это можно делать с помощью методов работы с ДОМЕлементами. Такими методами как

    public DOMNodeList getElementsByTagName ( string $name )

    Но я советую более детально ознакомиться с возможностями работы с ДОМЕлементами, чтоб не вышло путаницы. Найти там то, что вам надо и решить свою задачу.
    Ответ написан
    Комментировать
  • Как правильно получать данные из БД в стиле MVC?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Откройте для себя такие вещи как "тонкие контроллеры" и "сервис-ориентированная архитектура".
    Ответ написан
    3 комментария
  • Как правильно получать данные из БД в стиле MVC?

    @mr_ko
    Javascript, Node.js. React.js, Vue.js, Wordpress
    Вот есть хорошая CMS написанная на Yii www.yupe.ru/. Установите себе и смотрите как там решают подобные задачи.
    Ответ написан
    3 комментария
  • Yii2 как сделать рассылку email ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Или лучше использовать что-то другое?

    mailchimp.com

    Вообще лучше отправлять именно в цикле. Письма с множеством адресатов чаще попадают в спам. Вообще есть куча всего что нужно настроить что бы письма не попадали в спам.
    Ответ написан
    4 комментария
  • Что это была за статья на habrahabr о том, чем лучшие программисты отличаются от остальных?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Хороший программист - это тот, кто может найти эффективное решение поставленной задачи. А то, о чём пишите Вы - это классический карьерист-очковтиратель от программирования.
    Ответ написан
    2 комментария
  • Какие плакаты разместить в кабинете информационных технологий?

    bk0011m
    @bk0011m
    Системный администратор
    Фотограции с известными хакерами и вирусописателями..... за решеткой! Чтоб думали прежде, чем писать вирусню и ломать что ни попадя.
    Ответ написан
    2 комментария
  • Как правильно вывести ссылки на сайт, из БД (PHP+MySQL)?

    Symphony
    @Symphony Куратор тега HTML
    ссылки в базе храните www.domen.com или domen.com
    выводите
    echo "<a href = 'http://".$row['homepage']."'>Перейти</a>";
    Ответ написан
    2 комментария
  • Создание лицензии для движка, что прочитать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я решил взяться за это дело нормально и подарить миру нормальную cms.

    Удачи. Получится как обычно.

    Не рассматривали схему, которую выбрали всякие gitlab, магенты и и т.д.? open-source + энтерпрайз редакции + суппорт.
    Ответ написан
    1 комментарий
  • Где правильнее использовать ActiveRecord, в контроллере или модели?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    модель - данные, которыми оперирует ваша бизнес-логика.

    контроллер - нечто обрабатывающее пользовательский ввод

    толстые контроллеры - когда вся логика заключена в контроллерах

    тонкие контроллеры - когда вся логика выносится в сервисный слой, оставляя контроллеру только контроль за тем что отдавать, а все данные обрабатываются в сервисах. То есть в этом случае контроллер не работает напрямую с моделями и active record.

    сервисы - просто какие-то классы инкапсулирующие в себя какую-то работу.

    Принцип единой ответственности - класс должен делать что-то одно и хорошо. Если у вас один и тот же класс отвечает за две разные вещи (валидация и сохранение данных в базе) - это нарушение этого принципа.

    active record - один из шаблонов работы с базой данных который нарушает принцип единой ответственности и еще кучи других в угоду быстрой разработки. В контексте языков типа ruby или python вреда от этого не сильно много, так как все динамичненько и не скручено в кашу. Но в php, java (с партиал классами возможно и не так уж все и плохо) и т.д. почти все реализации ужасны. Но люди мирятся с этим в угоду быстрой разработке.

    Вывод, правильнее будет использовать active record в сервисах, так как при active record у вас перемешаны сервисы валидации, хранения данных и сама модель. Контроллеры же должны оперировать только сервисами.
    Ответ написан
    8 комментариев
  • Где правильнее использовать ActiveRecord, в контроллере или модели?

    korovnikiss
    @korovnikiss
    Frontend
    В модели.
    Ответ написан
    Комментировать
  • Как собрать многоуровневый массив?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я слегка к вечеру начал туго соображать, но давайте попробуем. Возможно я допущу какое грубое невежество или моя версия алгоритма не слишком интересная... но мне откровенно лень много думать. Так что задачу я решу почти в лоб. Для начала определимся что мы должны сделать...

    $words = explode(' ', 'a b c d'); // сразу представим строку как массив для более удобной работы с оным
    $expectedResult = [
        // 1st level
        [
            'a b c d e',
        ],
        // 2-ой уровень
        [
            'a',
            'b c d e'
        ],
        [
            'a b',
            'c d',
        ],
        [
            'a b c',
            'd'
        ],
        // 3-ий уровень
        [
            'a',
            'b',
            'c d',
        ],
        [
            'a',
            'b c',
            'd'
        ],
        [
            'a b',
            'c',
            'd'
        ],
        // 4-ый уровень
        [
            'a',
            'b',
            'c',
            'd'
        ]
    ];


    каждый уровень представляет из себя комбинации предыдущего:
    то есть для строки "a b c d" первый элемент третьего уровня:
    [
        'a',
        'b',
        'c d'
    ]

    можно составить как конкатенацию первого элементов второго уровня строки 'b c d' с добавлением оторванной части
    ['a'] + ['b', 'c d']
    Следовательно можно упростить алгоритм введя рекурсию постоянно уменьшая сложность. Разделяй и влавствуй как говориться. Поскольку нас теперь заботят только элементы первого и второго уровня алгорим существенно упрощается (можно хоть 666 уровней делать, реализация от этого сложнее не становится. Единственный минус - на большой вложенности можно упереться в лимит по стэку - решается заменой стэка на очередь вызовов но это не здесь и не сейчас).

    Единственное о чем нам стоит подумать - о логике склеивания кусков и условия выхода из рекурсии.

    Допустим у нас 4 слова в строке. Нам нужно собрать все варианты элементов третьего уровня. Для этого нам надо:
    1) ['a'] + ['b', 'c d'] - есть наборы для строк "a" и "b c d"
    2) ['a'] + ['b с', 'd'] - есть наборы для строк "a" и "b c d"
    3) ['a b'] + ['c', 'd'] - есть наборы для строк "a b" и "c d"
    На третьем стэпе мы достигли ситуации, при которой у нас вторая часть строки содержит количество слов равной требуемому уровню (два слова для второго уровня). Собирать комбинации больше неизчего. Сделаем это нашим уловием выхода из цикла.

    Давайте теперь попробуем соорудить функцию, которая будет корректно отрабатывать первый и второй уровни

    function buildLevel(array $words, $level) {
        // с первым уровнем все просто
        if ($level === 1) return [implode(' ', $words)];
        if ($level === 2) {
            // со вторым чуть по сложнее...
            $result = [];
            $chunk = [];
            while(count($words) >= $level) {
                // отделяем первое слово из "строки" и зановим его к первому "слагаемому"
                array_push($chunk, array_shift($words));
                $result[] = array_merge([implode(' ', $chunk)], [implode(' ', $words)]);
            }
    
            return $result;
        }
    
        throw new \Exception(sprintf('Not implemented for level %d for now', $level));
    }


    Проверям работу: ideone.com/ggFzJd
    array(1) {
      [0]=>
      string(7) "a b c d"
    }
    array(3) {
      [0]=>
      array(2) {
        [0]=>
        string(1) "a"
        [1]=>
        string(5) "b c d"
      }
      [1]=>
      array(2) {
        [0]=>
        string(3) "a b"
        [1]=>
        string(3) "c d"
      }
      [2]=>
      array(2) {
        [0]=>
        string(5) "a b c"
        [1]=>
        string(1) "d"
      }
    }

    все ок, только результаты надо склеить.... Но давайте вспомним одно из основных правил программирования! DRY - do not repeat your self. Что мы видим? Одинаковый код! В обработке второго уровня у нас используется код, который мы уже использовали в обработке первого уровня! Причем дважды! Кошмар! Рефакторим...

    $result[] = array_merge(buildLevel($chunk, 1), buildLevel($words, 1));


    Теперь вспомним наш замысел... Мы хотели огранизовать рекурсию, и она родимая у нас и выходит. Функция вызывает самою себя понижая уровень. Сложность решения уменьшается, все хорошо. По такому же принципу добавляем обработку третьего уровня. Попробуйте сначала сами и самостоятельно попробуйте побороть проблему "склейки" результатов третьего и второго уровня. Зачем просто унифицируйте решения. Для того что бы поставить логическую точку, я все же предоставлю готовое решение, но постарайтесь все же сами сделать сначала:

    ideone.com/fwS4u6 - к сожалению времени не так много... может позже доделаю склейку. Пока так. Суть надеюсь будет ясна. Если кто допилит - буду рад.
    Ответ написан
  • Правильно ли разбивать на две таблицы?

    azrail_dev
    @azrail_dev
    В одном проекте аодобная табличка разрослась до 320 полей. Это реально не удобно. Имхо, когда возможен такой рост, лучше разбить на 2 таблицы, в одной хранить то, что всегда не будет изменяться и табличка типа ключ-значение для изменяемых параметров. Выборку получаем интересную, похожую на пример
    stackoverflow.com/questions/7674786/mysql-pivot-table
    Ответ написан
    1 комментарий
  • Правильно ли разбивать на две таблицы?

    @1Michael1
    а обязательно задачи вообще в БД хранить?
    может лучше подумать в сторону очередей? BeanTalks, RabbitMQ к примеру?
    на сколько я понял - задачи то будут "выполнил и забыл, а если не выполнил - нужен ретрай через какое-то время"
    Ответ написан
    3 комментария
  • Правильно ли разбивать на две таблицы?

    Serhioromano
    @Serhioromano
    Web Developer
    Если отношение 1-1 то я бы не стал разбивать на таблици. При разбитии может роаботать даже медленнее если нужно делать объединения.

    Так же мого дополнительного кодинга. Например вы разбили и убрали параметры в другую таблицу. А потом заказыик решил что один из параметров должен быть основным и показываться в списке задач. Вам придется или объеденять, что делать нет смысла, зачем тогда разбивали, или переносить этот параметер и менять код что бы он сохранялся теперь в нужной таблице.

    Но это мой личный опыт. Возможно я не прав.
    Ответ написан
    3 комментария
  • Как работать с кнопкой, с которой запущена функция?

    @vdem
    function delte(id) {
        this.value = 'Идет загрузка...';
        ...
    }

    UPD: Блин, запутали! Не КНОПКА, а ССЫЛКА!!!
    function delte(id) {
        this.innerHTML = 'Идет загрузка...';
        ...
    }
    Ответ написан
    3 комментария