• Нужна ли отдельная CRM если сайт использует платформу Magento?

    Это должны решать работник, руководитель и владелец магазина — достаточно ли им встроенной функциональности Magento, или же им ещё нужна CRM.
    Я для своих магазинов теперь использую CRM, потому что, в дополнение к Magento, она позволяет мне :
    • Вести учёт дополнительных (не встроенных) характеристик для покупателей.
    • Вести учёт дополнительных сущностей, привязанных к покупателям (например, я продаю программное обеспечение (как раз-таки модули для Magento), и для меня важен учёт таких привязанных к покупателям дополнительных сущностей как «веб-сайт», «лицензия», «веб-агентство (партнёр по продаже / внедрению)» и т.п.).

    Поэтому мне встроенной функциональности Magento было недостаточно, и я для себя внедрил Oro Platform.
    Эта платформа для бизнес-приложений, созданная основателем и бывшими разработчиками Magento 1.x.
    На основе этой платформы они создали свою тиражируемую CRM (OroCRM), а также, в вместе с партнёрами, ряд других бизнес-приложений:
    • Oro Commerce (движок интернет-магазина для юрлиц)
    • Akeneo (движок для глубокого товарного учёта)
    • Marello (ERP для интернет-магазина)
    • DiamanteDesk (движок техподдержки)

    Я оценивал разные учётные системы, и свой выбор Oro Platform обосновал здесь.
    Знания и навыки, полученные в процессе внедрения, я задокументировал на своём сайте oplatform.club.
    Примечательно, что часть функциональности моей учётной системы доступна публично.
    Например, на этом моём мини-сайте, посвящённом одному из моих программнных продуктов — модулю Stripe для Magento 2, список клиентов формируется динамически посредством Oro API на основе информации из моей системы CRM.
    Ответ написан
    Комментировать
  • Сканеры штрих-кодов и PHP

    @lesha_penguin
    Сканеры штрих-кода (из тех, с которыми мне довелось работать) обычно работают в двух вариантах:
    1) Эмуляция клавиатуры (те, кто подключаются через PS/2 или работают как USB HID)
    2) Эмуляция COM-порта (те, которые соответственно втыкаются в компорт либо являются USB Serial Device)

    Взаимодействие с первыми аналогично клавиатуре. В чем их плюс — возможность работы даже с тем софтом который не знает что такое «сканнер штрих-кода». Для программы это будет выглядеть полностью аналогично как если бы оператор набрал на клавиатуре артикул товара. (то есть полностью прозрачно для программ)
    Соответственно, сериальные устройства для тех программ, которые знают что такое сканнер штрих-кода и умеют с ним работать.

    Соответственно, вопрос. Вам для каких нужд? Если Вы хотите минимальными затратами организовать «рабочее место оператора» с взаимодействием через веб — то вариант с USB HID — это ваш вариант. Вы просто с помощью PHP рисуете форму, с полем, куда JS-ом выставляете фокус. Оператор «пикнув» сканнером штрихкода просто введет туда цифры. (И незабываем, какой еще ОГРОМНЫЙ плюс возникает, если штрихкод потерт и нечитается — оператор просто набивает артикул на клавиатуре в это поле.)

    Вариант с Serial-подключением имеет плюсы лишь когда вы организуете выделенное узкозаточенное рабочее место.
    Ответ написан
    Комментировать
  • Как изменить отображение navbar для мобильных телефонов через Twitter Bootstrap?

    Примерно такое могу предложить как идею
    <nav class="navbar navbar-inverse">
      <div class="container-fluid">
        <div class="navbar-header pull-left">
          <a class="navbar-brand" href="#">WebSiteName</a>
        </div>
        <div class="navbar-header  pull-right">
          <ul class="nav navbar-nav nav-pills pull-left">
            <li><a href="#"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
            <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
          </ul>
          <button data-target="#myNavbar" data-toggle="collapse" class="navbar-toggle" type="button">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>                        
          </button>
        </div>
        <div class="collapse navbar-collapse" id="myNavbar">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">Home</a></li>
            <li class="dropdown">
              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Page 1 <span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="#">Page 1-1</a></li>
                <li><a href="#">Page 1-2</a></li>
                <li><a href="#">Page 1-3</a></li>
              </ul>
            </li>
            <li><a href="#">Page 2</a></li>
            <li><a href="#">Page 3</a></li>
          </ul>
        </div>
      </div>
    </nav>
    Ответ написан
    2 комментария
  • Сделать инсерт нескольких строк в одну таблицу за один запрос в Yii2?

    @Ronii
    Написать такой запрос и выполнить, или например batchInsert()
    Ответ написан
    Комментировать
  • Совет начинающему программисту. Как следует подходить к приобритению навыка OOP?

    @veitmen
    Почитал ответы.

    Могу только посоветовать еще развивать объектное мышление. Да, книги - хорошо. В них вы начнете понимать как использовать инструменты ООП и для чего они нужны. Но проектировать ваши типы вы научитесь только после того, когда четко начнете использовать объектное мышление. Пробуйте идя по улице смотреть на то, что вас окружает. И думайте о том, как любой окружающий объект переложить на код. Как сделать потом так, что бы эти объекты было проще создавать с минимальным количеством кода (научитесь использовать наследовани и полиморфизм). Почему что то из реализации нужно скрывать от пользователя (инкапсуляция). Начните думать какую можно создать иерархию классов для нематериальных вещей (процессы, связи, чувства). Когда вы смотря на задачу (подчеркну, что задача любая), будете видеть какие объекты вам нужны и как они взаимодействуют, то значит вы научились ООП.

    ООП - лишь еще один инструмент, не думайте что это золотая пуля. Состояние, в целом - зло.
    Ответ написан
    2 комментария
  • Как правильно реализовать masonry на чистом CSS?

    PretorDH
    @PretorDH
    HTML5, CSS3, PHP, JS - люблю в чистом виде.
    Попробуй так изменить разметку:
    ...
          /* Добавим data-header="M" к .masonry-item*/
         <div class="col-lg-3 col-md-3 col-sm-3 col-xl-12 masonry-item" data-header="M">
              /* <li class="header">M</li>  Убрать из разметки*/ 
              ...
         </div>
         ...

    В своем стиле сделать псевдо елемент :before :
    .masonry-item[data-header]:before {
                   content: attr(data-header);
                   display: block;
                   font-weight:bold;
              }

    Как вариант можно скинуть data-header в первый li (не в li c класом header - его быть не должно), и поменять селектор на .masonry-item li[data-header]:before

    P.S. В вопросе ставь код, а не скриншоты. Набирать наново лениво.
    Ответ написан
    2 комментария
  • Web-разработка. Уровень погружения в язык программирования: PHP vs JavaScript. Где "глубже"?

    mlnkv
    @mlnkv
    JavaScript Developer

    не столько важно в идеале знать язык программирования, как важно знать технологии, библиотеки, фреймворки связанные с ним

    В корне с вами не согласен. В первую очередь важно в идеале знать сам язык.
    Ответ написан
    Комментировать
  • Как правильно вести разработку web-проектов?

    Matvey-Kuk
    @Matvey-Kuk
    Разработчик в Cisco, CA.
    Не понятен пункт 5. Зачем сливать из боевого в гит? В гите должны храниться только исходные коды, по этому там всегда самая актуальная версия. И суть тестового сервера теряется из-за пункта 3. Обычно строится так:

    Локальная машина разработчика -> пуш в git ветку test -> ci сервер сам накатывает ветку test на тестовый сервер -> разраб проверяет обновление -> мерж git ветки test с master -> ci накатывает ветку master на боевой сервер.

    Параллельно по таймауту работают джобы по бэкапу боевого сервера на резервный, базы данных(mysqldump) и статики(rsync), например, раз в день с 3:00 до 4:00. Обновление базы на тестовом сервере обычно никак не автоматизируется, ибо там всегда каша из мусорных данных, которые наплодили автотесты.
    Ответ написан
    2 комментария
  • Сохранение и валидация relations в yii2 через формы - как избежать дублирования атрибутов в форме?

    restyler
    @restyler Автор вопроса
    Если для кого-то актуально - я решил вопрос введением дополнительного атрибута selectedStudents у класса School, он в бд не пишется, существует чисто для формы и для валидационных правил.
    В afterSave хуке в School мы делаем примерно такое:

    $students = Student::find()->where(['id' => $this->selectedStudents])->all();
    foreach ($students as $student) {
       $student->school_id = $this->id; // еще можно использовать метод link()
       $student->save();
    }


    Если подобных дублей атрибутов (students readonly и selectedStudents read/write) хочется избежать любой ценой - надо вводить отдельную модель для формы, чтобы в модели School оставался только relation, а в модели формы уже был атрибут selectedStudents, но это мне кажется лучше приберечь для более сложных кейсов.
    Ответ написан
    Комментировать
  • Как выполнить многоуровневое меню из одной таблицы в стиле Yii?

    Remmi
    @Remmi
    > Особенно смущают места - mysql_num rows() , mysql_query(), mysql_fetch_array()
    Они закомментированы и вместо них стоит AR Product.

    Работать с БД можно через PHP PDO: php.net/manual/ru/pdo.query.php
    Yii DAO: yiiframework.ru/doc/guide/ru/database.dao
    Или Yii Active Record: yiiframework.ru/doc/guide/ru/database.ar

    Например, вместо функций getCat и viewCat вынесите категории в отдельную таблицу и создайте для них AR-модель. Тягать существующие категории из списка товаров - не есть хорошо.

    Вместо getCat() будет Category::model()->findAll(), а вместо viewCat($code_par) будет Category::model()->findByPK()

    UPD: а, там несколько уровней. Тогда в таблице с категориями дополнительно храните parent_id у категорий, и исходите из этого при выборке.
    Ответ написан
    Комментировать
  • Как преобразовать xml в json или в array (PHP)?

    $xml = simplexml_load_string($xml_string);
    $json = json_encode($xml);
    $array = json_decode($json,TRUE);
    Ответ написан
    2 комментария
  • Yii2: как добавить в AR данные из другой таблицы?

    1. в модели User создать связь getUserBookmarks
    2. создать модель UserBookmark, в ней связь getFilms
    из User использовать так:
    $user = User::find()->with('userBookmarks', 'userBookmarks.films' )->all();


    можно в связях где-нибудь добавить asArray() для облегчения процесса.
    Ответ написан
    5 комментариев
  • Как добавить Foreign Key в таблицу MySQL?

    1) Поля должны быть ключами. В таблице User поле level проиндексируйте (в phpmyadmin есть кнопочка с молнией "Index")
    2) Поля должны быть одинаковы по типу и по ограничениям. Если первое поле Integer с ограничением в 11 символов, то и второе должно быть Integer 11 символов.
    Ответ написан
    Комментировать
  • Yii arrayhelper, как вернуть массив?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    public static function getItemList($cat_id)
    {
    
       return array_map(function (array $item) {
            return [
                'id' => $item['id'],
                'name' => $item['name_en'];
            ];
       }, NetItem::find()->where(['count_id' => $cat_id])->asArray()->all());
    }


    А еще лучше (но не отвечаю за работоспособность, я не вкурсе как там что в Yii2), указать явно в селекте.
    Ответ написан
    1 комментарий
  • Как сделать фильтр поиска и сортировку в GridView Yii2 с измененным полем?

    @AlexGx
    Yii2 developer, business analytics
    Спросонья может не так понял. Поидее решение выглядит так:

    'attribute' => 'username',
                'format' => 'html',
                'label' => 'Пользователь',
                'value' => function ($model) {
                    return UserColumn::widget([
                        'userId' => $model->id
                    ]);
                }


    Тобеж задайте `label`.
    Ответ написан
    Комментировать
  • Yii2, работа с формами, как написать более сложную форму?

    metamorph
    @metamorph
    Кстати, вот еще занятный вариант. Сам пока не пробовал, но вдруг?..
    https://github.com/yiisoft/yii2/issues/2580
    См последний коммент от создателя.
    Ответ написан
    2 комментария
  • Yii2, работа с формами, как написать более сложную форму?

    metamorph
    @metamorph
    Ох.

    Ну, в общем, смотрите в сторону параметра fieldConfig (передается при создании виджета формы, вот тут <?php $form = ActiveForm::begin(); ?>), ну и там всякие options, cssOptions, template итд.

    Пример:
    $form = ActiveForm::begin([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => '{label}<div class="col-sm-10">{input}</div><div class="col-sm-10">{error}</div>',
            'labelOptions' => ['class' => 'col-sm-2 control-label'],
        ],
    ]);


    Для того, чтобы понять, что куда идет, откройте файл vendor/yiisoft/yii2/widgets/ActiveForm.php, оно всё там (и неплохо документировано).
    Ответ написан
    3 комментария
  • Как максимально просто распарсить время в unix_timestamp выходящее за рамки 24 часов на PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $time = '123h 5 m 07s';
    if (preg_match('~(\d+)\s*h~', $time, $match)
        $hours = $match[1];
    if (preg_match('~(\d+)\s*m~', $time, $match)
        $minutes = $match[1];
    if (preg_match('~(\d+)\s*s~', $time, $match)
        $seconds = $match[1];

    Только для unix_timestamp ещё дата нужна и часовой пояс, это количество секунд с 1970-01-01 00:00:00 UTC.
    Ответ написан
    1 комментарий
  • Валидатор 'safe'?

    wartur
    @wartur
    www.yiiframework.com/doc/guide/1.1/ru/form.model

    Все очень просто. Эта такая штука, которая позволяет понять фреймворку, что данный атрибут модели, пришедший из атрибутов (cmodel::attributes) является разрешенным к присвоению к атрибутам модели без валидации. Эту штуку надо юзать осторожно.

    например $model->attributes = $_POST['Article'];
    Ответ написан
    5 комментариев