• Какие оптимальные технологии и методы для разработки аукциона?

    piromanlynx
    @piromanlynx
    Системный администратор в Perfect Solutions
    Можно и на php. Храните данные в хорошо доступном хранилище - redis/memcached и вынимайте их в обход php - например модули nginx для работы с memcached/redis - это позволит иметь горячие и доступные данные независимо от тормозов бакенда.
    Важно понимать, что эти данные - кеш и этот кеш должен писаться в момент изменения/сохранения данных, а не в момент запроса; т.е. кеш должен быть всегда горячим и генерируемым при сохранении данных, не иметь expires и изменятся только событийно.
    При такой архитектуре ваши данные будут всегда доступны из быстрого хранилища напрямую из nginx (в нем можно использовать например ssi для получения этих данных в контент страниц).
    Оповещение js-фронтенда в realtime можно реализовать на websocket-ах, примеров массы, но я бы советовал не гонять очень много данных через него - только события о факте изменения и минимальные данные (всё что нужно можно забрать аяксом тогда когда нужно).
    Ответ написан
    Комментировать
  • Одно действие с множеством модификаций. Как организовать архитектуру?

    27cm
    @27cm
    TODO: Написать статус
    Я бы попробовал использовать паттерн Factory.
    Фабрика будет создавать форму для конкретного типа документа, в ней не должно быть дублирования кода.
    Список полей и правила их валидации для каждого типа договоров хранить в конфигурационных файлах concrete-document-type.php:
    <?php
    return [
        'elements' => [
            'name',
            'surname',
            'phone' => [
                'validators' => ['by']
            ],
            ...
        ],
        ...
    ];

    Структуру привёл условную. Фабрика должна уметь по требуемому типу договора получить нужный конфигурационный файл и по нему построить нужную форму договора.

    У вас получится 70 конфигурационных файлов. Дальше можно думать, как их максимально упростить. Например, у вас есть PhoneElement формы, использующий PhoneValidator, вы создаёте его наследника PhoneByElement с валидатором беларусского номера телефона. И конфигурационный файл превращается в:
    <?php
    return [
        'elements' => [
            'name',
            'surname',
            'phone_by',
            ...
        ],
        ...
    ];


    Или добавляете понятие локали в конфигурационный файл:
    <?php
    return [
        'country' => 'by',
        'elements' => [
            'name',
            'surname',
            'phone',
            ...
        ],
        ...
    ];
    Ответ написан
    Комментировать
  • Как в Django сделать извлечение данных из POST-запроса в json?

    maximkv25
    @maximkv25
    web-developer
    def example(request):
        try:
            data = json.loads(request.body.decode())
        except ValueError:
            return JsonResponse({
                'error': 'bla bla bla',
            })
    Ответ написан
    Комментировать
  • Как в Django сделать извлечение данных из POST-запроса в json?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Было бы здорово, если бы вы привели в своём вопросе пример формы, с которой надо работать, и формат получаемого json.

    Всё должно быть просто, получаете от фронтенда json, преобразовываете его в словарь с помощью json.loads() и передаёте результат в конструктор формы так же, как обычно передаёте request.POST
    import json
    from django import forms
    
    class SomeForm(forms.Form):
        name = forms.CharField(label=u'Name', max_length=25)
    
    def some_view(request):
        json_string = request.POST.get('json_data')
        form_data = json.loads(json_string)[0]
        f = SomeForm(form_data)
        if f.is_valid():
            name = f.cleaned_data['name']
            # ... Работа с данными ...
        else:
            # ... Обработка ошибки ...
    Ответ написан
    Комментировать
  • Можно ли сделать авторизацию на разных доменах стандартными средствами Yii2?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Если сервер 1 (допустим backend и frontend на разных доменах), то можно, например в backend конфиге
    'components' => [
            'cache' => [
                'class' => 'yii\caching\FileCache',
                'cachePath' => '@frontend/runtime/cache' //делаем общий кеш
            ],
            'request' => [
                'csrfParam' => '_csrf-myap', //тоже делаем такое же как и на frontend
                'cookieValidationKey' => 'nk34HGdd8w6rf', //тоже делаем такое же как и на frontend
            ],

    Должно получиться.
    Ответ написан
    Комментировать
  • Возможно ли выжать все соки из vue.js без webpack?

    copist
    @copist
    Empower people to give
    Есть вариант "рисовать" главные страницы через внешние сервисы
    https://toster.ru/answer?answer_id=668876#comments...
    https://toster.ru/answer?answer_id=916006#comments...
    Ответ написан
    Комментировать
  • Как сделать переход в backend?

    qonand
    @qonand
    Software Engineer
    для начала в конфиге нужно подключить дополнительный URL-менеджер ссылающийся на back-end, например:
    'urlManagerBackend' => [
        'class' => 'yii\web\urlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'baseUrl' => $backEndUrl,
    ],

    после чего при редиректе просто его юзать, например:
    return $this->redirect(Yii::$app->urlManagerBackend->createUrl('index'));


    Но как бы frontend это пользовательская часть сайта, backend - админская. И для каждой части сайта лучше делать свою авторизацию
    Ответ написан
    2 комментария
  • Yii2 как с базы вывести категории когда у них есть подкатегориии с подкатегориями?

    Steein
    @Steein
    Программист
    $menu = Array( // Предполагалось, что он SQL SELECT
      Array('id'=>1,'title'=>'Menu 1',          'parent_id'=>null),
      Array('id'=>2,'title'=>'Sub 1.1',         'parent_id'=>1),
      Array('id'=>3,'title'=>'Sub 1.2',         'parent_id'=>1),
      Array('id'=>4,'title'=>'Sub 1.3',         'parent_id'=>1),
      Array('id'=>5,'title'=>'Menu 2',          'parent_id'=>null),
      Array('id'=>6,'title'=>'Sub 2.1',         'parent_id'=>5),
      Array('id'=>7,'title'=>'Sub Sub 2.1.1',   'parent_id'=>6),
      Array('id'=>8,'title'=>'Sub 2.2',         'parent_id'=>5),
      Array('id'=>9,'title'=>'Menu 3',          'parent_id'=>null),
    );


    function has_children($rows,$id) {
      foreach ($rows as $row) {
        if ($row['parent_id'] == $id)
          return true;
      }
      return false;
    }
    function build_menu($rows,$parent=0)
    {  
      $result = "<ul>";
      foreach ($rows as $row)
      {
        if ($row['parent_id'] == $parent){
          $result.= "<li>{$row[title]}";
          if (has_children($rows,$row['id']))
            $result.= build_menu($rows,$row['id']);
          $result.= "</li>";
        }
      }
      $result.= "</ul>";
    
      return $result;
    }
    echo build_menu($menu);


    <ul>
      <li>Menu 1<ul>
        <li>Sub 1.1</li>
        <li>Sub 1.2</li>
        <li>Sub 1.3</li>
      </ul></li>
      <li>Menu 2<ul>
        <li>Sub 2.1<ul>
          <li>Sub Sub 2.1.1</li>
        </ul></li>
        <li>Sub 2.2</li>
      </ul></li>
      <li>Menu 3</li>
    </ul>
    Ответ написан
    1 комментарий
  • У меня есть класс для авторизации. Как я могу в нем сделать свои сообщения об ошибках?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Добавить к вьюхе метод обработки ошибочного состояния формы - form_invalid(), а в нём добавить к форме ошибку методом add_error():
    def form_invalid(self, form):
        form.add_error(None, u'Вы кто такие? Я вас не звал!');
        return super(LoginFormView, self).form_invalid(form)
    Ответ написан
    2 комментария
  • Почему у меня высвечивается все данные авторизованным пользователям?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    1. Посмотрел Ваш код, но не вижу, что бы Вы где то подключили mdmsoft/yii2-admin. Дайте путь где подключено что-ли, так как в ожидаемых backend/config/main.php common/config/main.php и frontend/config/main.php нет и следа
    2. У Вас шаблон advanced, а mdmsoft/yii2-admin сделан для basic
    3. Что бы разобраться с RBAC и потом не гадать с фига ли что-то не работает, надо самому написать 1 раз велосипед для него. Мутная тема, но разобравшись потом очень просто решаются проблемы. А возможно, что свой велосипед окажется интереснее готовых.
    Ответ написан
    8 комментариев
  • Как победить OPTIONS при CORS?

    @davidnum95
    Касательно YII2 в базовом контроллере нужно указать поведение для CORS:
    public function behaviors()
        {
            return [
                'corsFilter' => [
                    'class' => Cors::className(),
                ],
                'authenticator' => [
                    'class' => HttpBearerAuth::className(),
                    'except' => ['options'],
                ],
            ];
        }
    Ответ написан
    Комментировать
  • Как победить OPTIONS при CORS?

    astec
    @astec
    Разработчик https://debtstracker.io/
    Только вчера разбирался для своего проекта по учёту долгов https://debtstracker.io/ и победил.

    На OPTIONS надо возвращать 200 с заголовками и пустой ответ.

    Я руководствовался этой схемой:
    cors_server_flowchart.png

    Вот мой работающий код на Go:

    func getOnly(handler HttpHandler) HttpHandler {
    	return func(w http.ResponseWriter, r *http.Request) {
    		c := appengine.NewContext(r)
    		if r.Method == "OPTIONS" {  // Preflight request
    			origin := r.Header.Get("Origin")
    			switch origin {
    			case "http://localhost:8080":
    			case "http://localhost:8100":
    			case "https://debtstracker.local":
    			case "https://debtstracker.io":
    			case "":
    				BadRequest(c, w, errors.New("Missing required request header: Origin"))
    				return
    			default:
    				err := errors.New(fmt.Sprintf("Unknown origin: %v", origin))
    				log.Debugf(c, err.Error())
    				BadRequest(c, w, err)
    				return
    			}
    			log.Debugf(c, "Request 'Origin' header: %v", origin)
    			if accessControlRequestMethod := r.Header.Get("Access-Control-Request-Method"); accessControlRequestMethod != "GET" {
    				BadRequest(c, w, errors.New("Not a valid preflight request"))
    				return
    			}
    			responseHeader := w.Header()
    			responseHeader.Set("Access-Control-Allow-Methods", "GET")
    			if accessControlRequestHeaders := r.Header.Get("Access-Control-Request-Headers"); accessControlRequestHeaders != "" {
    				log.Debugf(c, "Request Access-Control-Request-Headers: %v", accessControlRequestHeaders)
    				responseHeader.Set("Access-Control-Allow-Headers", accessControlRequestHeaders)
    			} else {
    				log.Debugf(c, "Request header 'Access-Control-Allow-Headers' is empty or missing")
    				// TODO(security): Is it wrong to return 200 in this case?
    			}
    			responseHeader.Set("Access-Control-Allow-Origin", origin)
    			w.WriteHeader(200)
    			return
    		}
    		if r.Method != "GET" {
    			BadRequest(c, w, errors.New(fmt.Sprintf("Expecting to get request method GET, got: %v", r.Method)))
    			return
    		}
    		handler(w, r)
    	}
    }
    Ответ написан
    1 комментарий
  • Как настроить "вставку включаемой области" в Bitrix?

    alexyarik
    @alexyarik
    Битрикс разработчик
    Переходите в режим правки (кнопка в правом верхнем углу). Переходите в нужный раздел и в режиме правки жмете кнопку "изменить раздел" -далее заполняете поле "Описание". Если шаблон компонента каталога не стандартный и текст не появился добавляете вывод текста в коде шаблона каталога:
    <? =$arResult["DESCRIPTION"] ?>
    //без пробелов, которые я вставил
    Ответ написан
    1 комментарий
  • Почему Yii:$app это плохо?

    @developer007
    Глобальные переменные в большинстве случаев нарушают инкапсуляцию. К ним открыт неконтролируемый доступ отовсюду.

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

    Глобальные переменные в большинстве случаев нарушают принцип инверсии зависимостей (или делают возможным его нарушение).

    Глобальные переменные ухудшают масштабируемость проекта.

    Глобальные переменные ухудшают читаемость кода (в каком-то конкретно взятом месте непонятно, нужна ли какая-то конкретная глобальная переменная, или нет).

    Глобальные переменные приводят к трудноуловимым ошибкам. Примеры: нежелательное изменение её значения в другом месте/другим потоком, ошибочное использование глобальной переменной для промежуточных вычислений из-за совпадения имен, возвращение функцией неправильного значения при тех же параметрах (оказывается, она зависима от глобальной переменной, а ее кто-то поменял).

    Глобальные переменные создают большие сложности при использовании модульного тестирования.
    Глобальные переменные увеличивают число прямых и косвенных связей в системе, делая её поведение труднопредсказуемым, а её саму - сложной для понимания и развития.
    Ответ написан
    Комментировать
  • ZF2 Модуль (или что угодно) для работы с Yandex|Google Map Api?

    Immortal_pony
    @Immortal_pony
    function makeGoogleApiRequest($params)
        {
            $apiUrl = "https://maps.googleapis.com/maps/api/geocode/json";
            $context = stream_context_create(['http'=>['timeout'=>5]]);
            
            
            
            // Make request
            $response = json_decode(file_get_contents($apiUrl . "?" . http_build_query($params), false, $context)); 
    
            
            
            // Check response
            if (
                json_last_error() ||
                !isset($response->status) || 
                $response->status !== "OK" ||
                !isset($response->results[0]->place_id) || 
                !isset($response->results[0]->formatted_address) ||
                !isset($response->results[0]->address_components) ||           
                !isset($response->results[0]->geometry->location->lat) ||
                !isset($response->results[0]->geometry->location->lng)           
            ) {                
                throw new \UnexpectedValueException ("Google Api Request Failed");
            }
            
            
            
            return $response;
        }
    
       
    
    
    
        /* Пример использования */
        $place = makeGoogleApiRequest([
            'address' => "Москва, Лаврушинский пер, 10",
            'language' => "ru"
        ]);
    Ответ написан
    1 комментарий
  • Как начать изучать AngularJS?

    GTRxShock
    @GTRxShock
    SA
    довольно давно начинал с интерактивного курса https://www.codecademy.com/learn/learn-angularjs
    но сейчас все монетизировали уже)

    погуглите интерактивные курсы сами, наподобие https://www.codeschool.com/courses/shaping-up-with...

    а еще лучше, если поставите реальную задачу и вооружившись гуглом и бест практиками начнете творить сами :)
    https://github.com/johnpapa/angular-styleguide/blo...
    Ответ написан
    Комментировать
  • Как в yii подключить отдельные стили на определенную страницу?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Так же как и всегда. Либо добавить стили в head
    //это во view
    $this->registerCss('
    body {background-color:#fff;}
    ');

    либо как файл.
    //это во view
    $this->registerCssFile('path/to/myfile');

    Если зависимостей много и их еще где-то в таком же наборе надо подключить, то можно создать AssetBundle, подробнее тут www.yiiframework.com/doc-2.0/guide-structure-asset...
    Как правило в самом view не подключают css и js, так как при правильной верстке все должно быть виджетами, а у виджетов есть свой метод подключения зависимостей. И если есть необходимость во view прописать какой-то css, то скорее всего это ошибка глобальная в структуре.
    Ответ написан
    1 комментарий
  • Где дохода будет больше android или web?

    @Josi
    Да не гонитесь Вы за баблом! Программирование - это в первую очередь удовольствие. Выбирайте что Вам ближе по душе.
    Ответ написан
    6 комментариев
  • Как русифицировать все поля в админке django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Конечно "не переводится", вы же зачем-то переопределили поле в форме. Если вам это действительно нужно, то стоит задать ему параметр label:
    class WorkModelForm(forms.ModelForm):
        description = forms.CharField(label='описание', widget=forms.Textarea, required=False)
        ...

    Но подозреваю, что не нужно, что вам просто нужно было задать для этого поля виджет:
    class WorkModelForm(forms.ModelForm):
        class Meta:
            model = Work
            fields = "__all__"
            widgets = {
                'description': forms.Textarea,
            }
    Ответ написан
    1 комментарий
  • Переход из 1С в web-разработчики (PHP ) в 35 лет. С чего начать и реально ли?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Больше 10 лет работаю под Битриксом. Мне очень нравится то, что в этой работе нужен целый стек знаний. Начиная от настройки апача и нжинкса (у меня свой сервер на Хетцнере) и до вёрстки. Прям прёт от кайфа.

    Этот год начал вникать в новое ядро (а там уже ORM), начал восполнять недостаток знаний. Ниточка за ниточкой... — просмотрев видео-курс по Ларавел понял, что моё мировоззрение дало трещину. Насколько там всё строго и по полочкам, в противовес анархии внутри Битрикса. Но у битрикса шикарное лицо. CMS прокачана так, что удобно как заказчику, так и обслуживающей команде. Вряд ли какая CMS сможет угнаться. Но внутренности... Мама дорогая. Хочется скрестить Ларавел и Битрикс (CMS).

    Есть надежда, что новое ядро привнесёт какую-то строгость, но, увы, Битриксы не культивируют "эко-культуру". То есть тренда быть стильным, правильным, структурным — нет. Порог входа опущен настолько, что можешь писать лапшой, можешь прикручивать свои шаблонизаторы. Вообще твори что хочешь. Битрикс ограничивается необязательными рекомендациями.

    Ища выход стремлению "хочу большего" завёл профиль на апворке и логично задумался: а что я могу предложить? То есть сначала была шальная мысль выходить на full-stack заказы c Битриксом, но, блин, после Ларавелл я уже не уверен. Если переходить (менять тех заказчиков, которые уже есть), то на солидный уровень (по задачам, в первую очередь). А для этого нужно понимание: к чему душа лежит (выбор технологии) и что востребовано (однозначно могу сказать, что буду копать Ларавел — уже и мини-проекты придумал; из фронт-энда буду пробовать пилить Вью, но пока что нет жёсткой мотивации: чистый css/js никто не отменял). А значит метод проб и ошибок. Пока не определился — держать ушки на макушке и анализировать входящий поток, не особо отвлекаясь от текущих дел, потому что так можно и загнуться (а на плечах семья, дети).

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

    Но чем хорошо (полезно) по-фрилансивать: остаёшься в курсе новинок, не оседаешь в своей тине и не разучиваешься шевелиться. По сабджу — держать нос по ветру, пробовать разные задачки, пока не придёт чёткое понимание.
    Ответ написан
    Комментировать