Задать вопрос
  • Php Phalcon как создать списки контроля доступа для пользователей?

    copist
    @copist
    Empower people to give
    Документация
    https://olddocs.phalconphp.com/en/3.0.0/api/Phalco...
    https://olddocs.phalconphp.com/en/3.0.0/api/Phalco...

    Тут основная сложность, не описанная в документациии - это конкретная реализация получения роли текущего пользователя
    $acl->isAllowed("Guests", "Profiles", "show")
    Надо как-то определить, что текущий пользователь имеет роль Guest - это выходит за рамки документации.

    Вариант 1
    Можно хранить код роли в отдельной колонке role таблицы user
    Тогда будет $acl->isAllowed($user->role, "Profiles", "show")

    Вариант 2
    Можно в ACL прописать доступные права для каждого пользователя, например
    $acl->allow("ivanoff", "Profiles", "show");
    Тогда будет
    $acl->isAllowed($usr->username, "Profiles", "show")
    Ответ написан
  • Как сделать роли для юзеров nodejs?

    copist
    @copist
    Empower people to give
    В настройках конкретного пользователя сохрани признак его роли, а в middleware проверяй этот признак у текущего авторизованного пользователя и подменяй выдачу для разных ролей

    Вот два примера

    https://www.npmjs.com/package/express-roles
    https://gist.github.com/joshnuss/37ebaf958fe65a18d4ff
    Ответ написан
    Комментировать
  • Как переместить папку с помощью composer update?

    copist
    @copist
    Empower people to give
    Ответ описан детально на stackoverflow https://stackoverflow.com/a/14867050
    Нашёл запросом "npm vendor/node_modules", первый результат в списке
    Ответ написан
  • Php Phalcon, как отправить данные в формате json?

    copist
    @copist
    Empower people to give
    0. Убедитесь в /etc/hosts, что домен learning относится к хосту 127.0.0.1
    1. Проверьте вручную через консольную команду curl на том же самом сервере, что http://learning/test/accept возвращает какой-либо ответ
    2. Проверяйте логи веб-сервера
    access.log - был ли вообще запрос между двумя скриптами
    error.log - были ли ошибки
    3. В код sendAction() замените код, чтобы увидеть ошибку
    if( ! $result = curl_exec($curl)) // чтобы проверить на наличие ошибки CURL или HTTP
    {
        trigger_error(curl_error($curl));
    }
    curl_close($curl);
    echo $result; // чтобы видеть результат запроса

    4. В коде acceptAction() добавьте код
    $receive_data = json_decode($json,true);
    if (json_last_error()) // чтобы проверить наличие ошибки декодирования JSON
    {
        trigger_error(json_last_error_msg());
    }


    -------------

    А вообще логика вашего скрипта какая?
    Я вижу, что
    1. Первый скрипт выбирает пользователей из базы (без лимита, это страшно на продакшене)
    2. Этот список пользователей посылается запросом из public function sendAction() на http://learning/test/accept в формате JSON
    3. Этот JSON декодируется и передаётся в $this->view->users
    4. ... зачем?

    -----------

    Уточнённое решение

    На одном сервере получить JSON и показать через шаблон
    class TestController
    {
        public function showAction()
        {
            $json = file_get_contents("http://learning/test/users"); // получить данные со второго сервера
            $users = json_decode($json, true);
            $this->view->users = $users; // передать в представление
        }
    }


    На втором сервере выбрать данные из базы и выдать в формате JSON
    class TestController
    {
        public function usersAction()
        {
            $users = Users::find(); // получить из базы
    
            // подготовиться к выдаче ответа в формате JSON
            $this->view->disable();
            $response = new \Phalcon\Http\Response();
            $response->setStatusCode(200);
            $response->setJsonContent($users);
            $response->setContentType('application/json', 'UTF-8');
            return $response;
        }
    }


    По идее первый должен показать то, что хранится в базе в таблице user на втором сервере
    Ответ написан
  • Как проверить баланс сим-карты МТС на PHP?

    copist
    @copist
    Empower people to give
    У них есть Личный кабинет и мобильное приложение. Там доступен баланс.

    А. Решение через "Личный кабинет"
    1. имитировать логин в личный кабинет с помощью curl с сохранением кук и прочей мишуры
    2. имитировать запрос в личный кабинет на страницу баланса с помощью curl
    скорее всего эта страница содержит баланс
    https://login.mts.ru/profile/header?ref=https%3A//ihelper.sib.mts.ru/selfcare/welcome.aspx&scheme=https&style=2015v2&updat&updat&updat

    3. парсить HTMl баланс через XML или регулярку
    https://monosnap.com/file/DLyZ0XcQfjQykKLxS4fVkJWP...

    Б. Решение через мобильное приложение
    1. Снифить трафик между андроидом и сервером через прокси
    2. Имитировать такие же пакеты
    3. В итоге получить пакет, в котором есть баланс
    Ответ написан
    1 комментарий
  • Множество сущностей, связанных с одной таблицей. Хорошо ли это?

    copist
    @copist
    Empower people to give
    Такой подход позволяет использовать сквозные ID и уменьшать количество связей в БД, не теряя целостности.
    Например, не комментарии к фильмам, комментарии к записям блога, комментарии к товару в интернет магазине, комментарии в ленте пользователя, а иначе - "комментарии к записи базового типа".

    Применение указанной тобой формы или, наоборот, нормализация её - это исходит из бизнес-требований. Структура таблиц следует из анализа предметной области, а не потому что "так правильно" или "так красивее". Если модель хранения подходит для конкретного применения - это хорошая модель. Зачастую моделей может быть несколько, приходится выбирать одну исходя из требований. Для реальных задач может даже пригодиться ненормализованные данные (JSON) хранить в реляционной базе. А вот если идеальная красивая понятная модель по третьей нормальной форме не способна реализовать потребность с учётом простоты, объёмов, надёжности, гибкости, быстроты - это никому не нужная модель.

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

    Или вот ещё пример: в системе может быть пользователь (user), который вдруг может стать продавцом (supplier) или потребителем (customer). Их можно хранить в одной таблице (user = customer = supplier), если отличие - в каком-нибудь признаке "is_сustomer" и "is_supplier".
    Если у них разные дополнительные атрибуты, например у продавца есть банковский счёт, а у покупателя - счёт в PayPal, у продавца - адрес хранения товара, а у покупателя - адрес доставки - то часть полей одной записи таблицы user используется для покупателя, а часть - для продавца
    table `user`
      column `id` as primary key
      column `full_name` - общее поле
      column `is_supplier` - продавец
      column `is_customer` - покупатель
      column `shipping_address` - адрес доставки покупателя
      column `store_address` - адрес хранения продавца
      column `bank_account` - банковский счёт продавца
      column `paypal_account` - счёт покупателя

    Схема условная

    Но можно в одной таблице хранить только общие поля, а в дополнительных таблицах дополнительные поля. Сквозной ID сохраняется, даже нормальные формы работают.

    table `user`
      column `id` as primary key
      column `full_name` - общее поле
      column `is_supplier` - продавец
      column `is_customer` - покупатель
    
    table `supplier`
      column `id` as primary key & foreign key to `user`:`id`
      column `shipping_address` - адрес доставки покупателя
      column `bank_account` - банковский счёт продавца
    
    table `customer`
      column `id` as primary key & foreign key to `user`:`id`
      column `store_address` - адрес хранения продавца
      column `paypal_account` - счёт покупателя

    Схема условная
    Тут указано, что их надо связывать отношением "один-к-одному".

    Вообще грань очень незаметна. В любом случае в сложной схеме то на одни, то на другие грабли приходится наступать. Тут сквозные ID и избыток колонок в записи, а тут лишние UNION или JOIN, чтобы собрать вместе в одном отчёте. Если этот отчёт потребуется :)

    Хранение сущностей в одной таблице относится к теме "Наследование в реляционных моделях" (не могу точно найти определение). Можно дополнительно прочитать тут:

    www.sql.ru/forum/67152/nasledovanie-v-baze-dannyh
    https://msdn.microsoft.com/ru-ru/library/bb531247.aspx
    postgresql.ru.net/manual/ddl-inherit.html
    https://habrahabr.ru/post/28023/
    https://habrahabr.ru/post/322596/
    Ответ написан
    Комментировать
  • Как закрывть div при клике вне этого дива?

    copist
    @copist
    Empower people to give
    Поисковая фраза в Google "hide click outside HTML JS"

    https://stackoverflow.com/questions/152975/how-do-...
    https://stackoverflow.com/questions/1403615/use-jq...
    https://stackoverflow.com/questions/13892375/how-t...

    Относительно указанного примера:
    var clickCount = 1;
    $('.button').click(function(event){ // при клике по кнопке - обработать тут, но не давать обработать дальше
      event.stopPropagation();
    	if(clickCount == 1){
    			$(this).children('.show-block').show();
    			clickCount = 2;
    		}else{
    			$(this).children('.show-block').hide();
    			clickCount = 1;
    		}
    });
    
    $('.button .show-block').click(function(event) { // при клике по блоку - вообще проигнорировать, иначе будет закрываться даже если в блок кликнуть
    	event.stopPropagation();
    });
    
    $(window).click(function(event) { // при клике в любом месте страницы - закрывать блок
    	$('.button .show-block').hide();
    });
    Ответ написан
    1 комментарий
  • Каким способом уменьшить связность между модулями в NodeJS?

    copist
    @copist
    Empower people to give
    В таких небольших проектах плюю на связность и делаю проект дальше.
    Модульность - это когда надо чтобы одна часть системы без другой работала.
    Тебе база нужна? Без базы сможешь работать? Если не сможешь, то распиливать бессмысленно.
    Тебе логер нужен? Без логера сможешь обойтись? Если не сможешь, то аналогично - живи с логером.

    Если модули отвязывать, то переходить на DI, события и очереди. Очереди можно в памяти держать, совсем не обязательно отдельно сервис поднимать.

    Можно как Yustas Alexu сказал - сделать модуль, который снаружи работает как адаптер к БД, а внутри - смесь адаптера базы, логера и прочих перделок.
    Ответ написан
    Комментировать
  • Какие факторы влияют на показатель отказов сайта?

    copist
    @copist
    Empower people to give
    Отказ - это если посетитель ничего не кликнул, никуда не скролил. Посмотрел, почитал - и ушёл.
    Варианты:
    1. Ему не интересно

    Всё.
    Ответ написан
    Комментировать
  • Как вывести строку из txt файла по порядку на php?

    copist
    @copist
    Empower people to give
    $filepath = 'path/to/file.txt'; // файл со строками
    $filenumpath = 'path/to/file.line'; // дополнительный файл с номером последней строки
    
    $file = file($filepath);
    $linenum = is_file($filenumpath) ? 1+(int)trim(file_get_contents($filenumpath)) : 0; // прочитать номер из файла; если файла нет, то номер = 0
    echo $file[$linenum%count($file)]; // вывести строку
    file_put_contents($filenumpath, $linenum); // записать номер в файл
    Ответ написан
    7 комментариев
  • Как иконку в произвольное поле поста?

    copist
    @copist
    Empower people to give
    Какое назначение этого "произвольного поля"? Где отображаться должно?

    Если просто в тексте поста, то можно так (GIF): https://ps.w.org/icons-enricher/assets/screenshot-...
    Плагин https://wordpress.org/plugins/icons-enricher/
    Ответ написан
    1 комментарий
  • Какой подход выбрать для иерархической таблицы?

    copist
    @copist
    Empower people to give
    > Буду рад любым теориям
    Несколько вариантов:
    • Nested Sets
    • Parent-Child
    • Materialized Paths
    • Иерархические БД
    • Специальный синтаксис SQL-1999 для WITH recursive
    • Специальный синтаксис Oracle для START WITH ... CONNECT BY


    Ссылки:
    Ответ написан
    Комментировать
  • Почему ajax форма не отправляет на почту?

    copist
    @copist
    Empower people to give
    Смотрите access.log сервера - был ли запрос к PHP
    Сделайте отладку на сервере в PHP - например, через error_log() и смотрите в error.log сервера - нет ли ошибок в PHP

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

    copist
    @copist
    Empower people to give
    1. Вагрантом пользуешься?

    Выключи sendfile в Nginx и Apache

    если nginx - в файле /etc/nginx/nginx.conf и поменяй опцию
    sendfile off

    если Apache - в зависимости от операционной системы - найди httpd.conf или apache.conf и поменяй опцию EnableSendfile off

    2. Заголовки Expiration устанавливаешь?
    Это на самом деле хорошая практика, но в разработке мешает
    Попробуй сделать так: на продакшене заведи файл VERSION.txt и записывай туда номер версии (например, 1.0) в тот момент, когда обновление выкатываешь. У себя такой файл не держи.
    Когда подключаешь CSS к странице, то проверяй наличие такого файла. Если файла нет, то ставь текущую метку времени.

    Пример на PHP
    <?php
    $versionPath = 'path/to/VERSION.txt';
    $version = is_file($versionPath) ? file_get_contents($versionPath) : time();
    ?>
    <link rel="stylesheet" href="/path/to/style.css?v=<?php echo $version ?>">


    На продакшене у тебя будет ссылка на CSS с фиксированной версией вида
    <link rel="stylesheet" href="/path/to/style.css?v=1.0">


    А на твоей машине будет всегда уникальный URL, который будет свежим, даже если заголовок Expiration выставлен.
    <link rel="stylesheet" href="/path/to/style.css?v=1494560580">


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

    copist
    @copist
    Empower people to give
    jQuery - это принцип событий и модификации DOM, а сохранение состояний - дело второстепенное
    Типичный механизм: что-то произошло (клик/скрол) -> что-то изменить в DOM, возможно что-то запомнить в JS

    React - это принцип состояний, а изменение DOM или события - дело второстепенное
    Возможно произошло событие -> обновить специальный объект (его называют модель)
    Что-то изменилось в модели -> возможно обновить DOM, если модель как-то связана с HTML
    Ответ написан
    Комментировать
  • За сколько реально освоить Yii?

    copist
    @copist
    Empower people to give
    Я изучал около 3х месяцев до трудоустройства и год после :) Никто за тебя оценку по времени не сделает.

    ... дали тестовое задание по Yii


    Сделай задание правильно (как требуется по заданию), потом получи оценку, потребуй сделать review. Переделай, если что-то им не понравилось. В следующий раз то же самое будешь делать быстрее. А тонкости фреймворка изучишь по мере работы.
    Ответ написан
    Комментировать
  • Есть ли плагин для WordPress для вставки иконок на страницах?

    copist
    @copist
    Empower people to give
    По удобству выделяется Icons Enricher

    * Всё бесплатно
    * Много иконок
    * Удобная система семантического поиска с приятным пользовательским интерфейсом - иконку можно найти, даже если вообще не знаешь её название, по синонимам или ассоциациям.
    screenshot-4.gif?rev=1654780

    Он намного удобнее, чем плагины, где иконки нужно выбирать из бесконечных селект-боксов, искать глазами в огромных таблицах или составлять теги иконок вручную через shortcode.
    Ответ написан
    Комментировать
  • Пример архитектуры большого сайта-SPA?

    copist
    @copist
    Empower people to give
    OpeSource решения на базе нужных технологий
    https://github.com/relax/relax - CMS платформа
    mern.io - хорошая архитектура для крупных React/Redux приложений
    https://github.com/andrewngu/sound-redux - клиент Soundcloud написан на React / Redux
    https://github.com/WebbyLab/itsquiz-wall - изоморфное приложение на React - система тестирования
    https://github.com/Automattic/wp-calypso - админка для WordPress на React/Redux
    https://www.neos.io/ - CMS платформа, постепенно переписывается с PHP на React, отдельные части проекта https://github.com/neos/
    Ответ написан
    Комментировать
  • Как избавиться от замкнутого круга с портфолио и опытом работы?

    copist
    @copist
    Empower people to give
    Привет. Могу помочь разорвать цепочку, оформить веб-портфолио дизайнера и разработчика https://webmentor.pro/portfolio

    В качестве идей для веб-дизайнера:

    Посмотри не на themeforest, где уже целые темы - это сложно для начинающего концепцию целого сайта придумать, а на https://dribbble.com/ - там дизайнеры публикуют очень небольшие по объёму работы, например только форма обратной связи или одна страница приложения-чата.

    Первый вариант - ревью чужих работ.
    Как дизайнеру я предлагаю тебе взять раздел "Дебюты" https://dribbble.com/shots?list=debuts, оценить любую работу по качеству, найти недостатки. Считай что ты как будто занимаешься приёмом на работу другого дизайнера. Встал на другую сторону так сказать.
    После твоего же ревью найди возможность улучшения чужой работы, исправить самостоятельно, то есть перерисуй с учётом своих же замечаний.
    После этого в портфолио можно вставить чужую работу как образец, свои замечания к ней и переработанную личную версию. С пометкой "ревью", "ремейк", "по мотивам". Это не воровство, а абсолютно самостоятельная работа.

    Второй вариант, который встречается на практике - рисовать новые страницы сохраняя общий стиль и идею.
    Вот дали тебе PSD макеты нескольких страниц или UI Kit с полным набором всех элементов интерфейса. Нарисуй страницу, которой нет. Например, у тебя на руках только PSD главной страницы и формы обратной связи. Как бы выглядела страница со списком клиентов, страница тарифов, страница личного кабинета пользователя, страница витрины интернет-магазина в том же стиле? Эта работа дизайнера. Они не всегда рисуют дизайн с нуля. Бывает к проекту подключают второго или третьего дизайнера и они обязаны продолжать работу в одном стиле.
    Это не воровство, а тоже абсолютно самостоятельная работа.

    Третий вариант - имитация работы с заказчиков и исполнителем.
    Ты ведь часто ходишь по сайтам, мы все тут часто куда-то ходим. Поставь себе таймер на какой-нибудь момент времени и когда он сработает - СТОП! - та страница, на которой ты сейчас находишься - она требует срочного редизайна.
    1) представь, что ты сам заказчик:
    посмотри на то что уже есть на странице;
    определи задачу, которую решает эта страница;
    определи задачу, которую решает этот сайт;
    опиши задание дизайнеру на редизайн
    2) представь, что ты сам дизайнер:
    сделай прототип;
    черновой дизайн;
    и наконец выполни задачу
    И это не воровство, а самостоятельная работа.

    В качестве идей для веб-разработчика:
    Запрограммируй то, что видишь на макете. Можно использовать тот же https://dribbble.com/ - там полно целых макетов сайтов и отдельных элементов интерфейса.

    Покупать только PSD считаю бесполезной тратой. Рекомендую брать сразу готовый результат вёрстки (то есть HTML шаблона сайта), к которому прилагается PSD, чтобы сделать вёрстку самостоятельно и потом сравнить свой вариант и вариант более опытного верстальщика. Учиться у старших, можно сказать. Особенно ценными считаю макеты, у которых есть ревизии, то есть их переделывали несколько раз, исправляя замечания.
    Ищи в google по фразе "free PSD HTML5"
    Примеры:
    bootflat.github.io
    https://thesiteslinger.com/blog/free-html-templates
    graphicdesignjunction.com/2015/10/html5-website-te...

    Есть вариант списаться с дизайнерами, которые выложили на themeforest только PSD макеты. Их можно сверстать и продавать самостоятельно или совместно с автором темы согласно вашей договорённости.

    Конечно же веб-разработчику каждый HTML макет в итоге нужно запрограммировать. Сделать на его базе сайт с нужной функциональностью, решающий какую-то задачу. А какую именно - придумай сам.
    Генераторы идей:
    tevko.github.io/practice/index.html
    https://copist.ru/ru/blog/2016/02/11/pet-project-ideas/
    Ответ написан
    Комментировать