Задать вопрос
  • Как в GridVIew сокращать длиный текст?

    В $data хранятся все свойства, функцией mb_substr обрезаем строку до нужного кол-ва символов, если длина исходного текста меньше заданного, то выводим без изменений, иначе - сокращенную строку.
    В myattribute подставляйте свой атрибут.
    [
        'attribute' => 'myattribute',
        'value' => function($data) {
            $charsCount = 100;
            $croppedText = mb_substr($data->text, 0, $charsCount);
            return mb_strlen($data->text) > 100 ?  $croppedText : $data->text;
        }
    ],
    Ответ написан
    1 комментарий
  • Нормально ли для программиста быть трудоголиком, любить рутину, иногда быть уставшим и тупить от этого?

    @majstar_Zubr
    C++, C#, gamedev
    Предлагаю обобщить проблемы в одну и решить её.

    Обобщенная проблема называется дисциплинированность. Придерживание дисциплины - сложная работа для силы воли, и поэтому её сводят к формированию привычек и жёсткому следованию и слежению за исполнением того, что составляет привычку.

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

    Мытьё посуды, ремонт чего-то, чтение книги, кода, контрибуция в пет/опенсорс проект, семья - для всего нужно ввести правило, уделять не менее N времени в день/неделю/месяц.

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

    Может уйти и больше времени, потому что привычка, поддерживающая дисциплинированность требует называть вещи своими именами и не обманывать себя.

    Производительность и занятость часто путают с продуктивостью и результативностью, и если вам очевидны симптомы того, что вы часто путаете первое со вторым, то значит пришло время остановится и:

    1) вернуться к азам - перечитать основополагающие для вас книги, например, для меня это Совершенный код, Экстремальное программирование и Тайм-менеджмент для системных администраторов; если есть подозрения, что вместо паттерна вы используете антипаттерн, то пришло время для тотальной работы над ошибками;

    2) начать записывать каждое решение задачи за день, самое важное - указывать время начала и время конца, если вы не ведёте ежедневник (в любом виде, достаточно весьма обобщенного лога деятельности за день);

    3) отдых и перерывы (кофе-брейк, перекур, переменка) отмечать тоже обязательно, и важно не путать отдых и паузы. Отдых сотредоточен на восстановлении организма после физического или интеллектуального стресса, в то время как брейки сотредоточены на недопущении вхождения в поток и на чередовании видов деятельности, что приводит к экономии ресурсов, выделенных на день.

    Для интеллектуальной деятельности и инженерного дела, связанного конструированием, проектированием, согласованием поток вреден, и нужно следить за тем, чтобы не забывать выныривать. Чередование видов деятельности и задач, позволяет медленнее накапливать стресс, потому что смена деятельности даёт отдых разным отделам мозга и частям организма в целом в разное время.

    Проблема зарывания в работу/задачу решается введением строгого ограничения на продолжительность работы. Поставьте на своем смартфоне беззвучные и без вибраций будильники с перерывами в час+8 минут со смещением 5 минут к последующему будильнику. Позже оптимизируете под себя, просто важно ввести привычку поставить все на паузу, выкинуть из головы все на бумагу или в текстовый файл и 5 минут подышать свежим воздухом, выпить чаю, etc.

    Проблема с жадностью выделения времени на оптимизацию работы решается обычным счётчиком 1-2-3. Если вы столкнулись с проблемой третий раз, то вы отдаете себе отчёт, что налицо закономерность, и поскольку математически доказано, что оптимизация сейчас сэкономит время, то вы спокойно в ежедневнике выделяет время на сегодня на оптимизацию.

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

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

    Для того, чтобы не перерабатывать, нужно делать лишь самое необходимое именно сейчас, чтобы брать как можно меньше рисков в текущий момент, откладывать принятие решений на как можно поздний срок - но тут надо уметь называть вещи своими именами - одно дело, когда вы избегаете риска, другое дело, когда вы избегаете ответственности. Если у вас нет ограничения по времени, что ещё может заставить вас попросить помощи или начать работу над ошибками, валидировать свои знания, привычки самого себя?

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

    @majstar_Zubr
    C++, C#, gamedev
    У вас должна быть цель стать профессионалом в области. Потому что только профессионал может выбирать, с кем работать, где работать, над чем работать - над крупными проектами для правительств, над банковским софтом, над веб-проектами или над играми.

    Вот это будет правильная установка. А что учить и в каком порядке вам никто не скажет, потому что требования меняются, возможности устроится на работу у всех разные, неизменно только одно - желательно знать все и вчера. Именно с этой установкой рисуются абстрактные Programming paths, но толку от них не будет никакого, если вы не сможете обобщать знания и не будете постоянно работать над строительством своего дерева знаний. Главное - пополнять свои знания концепциями, из которых потому выводятся базовые шаблоны, шаблоны проектирования, а из них, в свою очередь, архитектурные шаблоны, методология разработки, и непосредственно связь с рынком, экономикой, психологией и прочим, и так далее. И эти концепции не только в книгах по разработке ПО, их много в теор вере, дискретной математике, физике, которые дождаться в голову только в процессе получения высшего образования, системно.

    Любовь к учению - единственное, что может поддерживать на пути, потому что путь очень долгий. Многое будет непонятно и с первого раза, и со второго. Иногда и с третьего, потому что вы на самом деле не поняли базовые вещи. Или выбрали неправильную книгу. Или начали читать правильную книгу слишком рано. А узнаете вы расхождение между объективным знанием и собственным все равно не раньше, чем столкнетесь с проблемой на практике. А по-другому никак.

    Что вы можете сейчас сделать - взять прицел. Конкретно сформулируйте профессию и специализацию. Оптимизируйте процесс полученния знаний: как бы не ругали образование в ВУЗах СНГ, все же это нехилая экономия времени, если вы сразу будете получать профильное образование.

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

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

    Так что, запасайтесь попкорном и начните с языка Си. Освойте структурное программирование. Алгоритмы, структуры данных. Архитектуру компьютера, ОС. Не торопитесь как можно быстрее неправильно понять как можно больше вещей за кратчайший промежуток времени. Перечитывание и практикуете, пока не станет понятно так, что сможете научить кого-нибудь другого. Макконнелл, Роберт Мартин, Кент Бек, Эрик Эванс, Мартин Фаулер + 1 год дополнительного быдлокодинга на java и c# и c++ и у вас появится понимание ООП, ФП, типовые устройства моделей памяти и сборщиков мусора. Ещё за год научитесь писать настоящий ООП код, читать чужой код, даже если он написан в процедурно-макаронном стиле как книгу. Но надо ли вам эти три скучных года, потерянных полностью для личной жизни? Не проще ли получить solid knowledge и постепенно получать практику в среде опытных специалистов?

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

    У меня была подобная задача.
    Нужно было «имя отчество фамилия» преобразовывать в «Имя Отчество Фамилия».
    Решил через расширение стандартного класса `class String`.
    Метод `#capitalize_words` разбивает строку на массив из слов и проходит по каждому слову и делает ему «капитализацию».
    После этого собирает массив в исходную строчку.

    class String
      # @see String#capitalize
      def capitalize_words(separator = ' ')
        words = split(separator).map(&:capitalize)
        words.join separator
      end
    end


    Ниже тест `RSpec` для метода, на всякий случай.

    describe String do
      describe '#capitalize_words' do
        context 'with word' do
          let :one_word do
            'foo'
          end
    
          it 'return capitalized word' do
            expect(one_word.capitalize_words).to eq 'Foo'
          end
        end
    
        context 'with words' do
          let :words do
            'foo bar'
          end
    
          it 'return capitalized all words' do
            expect(words.capitalize_words).to eq 'Foo Bar'
          end
        end
    
        context 'with custom separator' do
          let :words do
            'foo$bar'
          end
    
          let :custom_separator do
            '$'
          end
    
          it 'return capitalized with custom separator' do
            expect(words.capitalize_words(custom_separator)).to eq 'Foo$Bar'
          end
        end
    
        context 'with empty' do
          let :empty do
            ''
          end
    
          it 'return empty' do
            expect(empty.capitalize_words).to eq empty
          end
        end
      end
    end
    Ответ написан
    Комментировать
  • Какие перспективы есть у Elixir?

    @yaBliznyk
    Язык действительно интересный и легкий. Есть русская документация в elixir school и достаточное количество библиотек. Есть русское сообщество в телеграмме @proelixir Есть курсы elixir и большое количество книг тоже на русском. Язык развивается, пусть не так быстро, но от того возможно качественно.
    Его активно используют за бугром, там найти работу не составит труда. У нас достаточно проблематично джуном. Но я бы сказал что джуном берут только в офис практически везде, поэтому вам должно либо повезти с местом жительства, либо вы должны будете продвинуть его на текущем месте работы.
    Я на чистом эликсире писал парсеры, многопоточность выручает очень сильно.
    Рассматривать elixir без phoenix не имеет смысла. Phoenix имеет смысл рассматривать только как очень быстрый микросервис. Как вариант для websockets. Вполне может выстрелить LiveView но до этого надо дожить. В большинстве компаний, на сегодняшний момент в России, предпочтут go вместо elixir.
    В купе за 10 лет он только разовьется, просто в России его еще толком не заметили.
    Как основной язык, возможно, но только там где уже работает erlang. Поэтому лучше потихоньку изучать как добавочный и прикручивать его там, куда go еще не прикрутили)
    Мышление меняет очень сильно, после пары месяцев работы с ним будете смотреть на другие языки уже совсем иначе, но точно не хуже!
    Ответ написан
    Комментировать
  • Стоит ли доверять Windows 10?

    15432
    @15432
    Системный программист ^_^
    Несколько сторонних антивирусов ставить точно не стоит, они друг другу мешают и грузят систему. Моё мнение - для продвинутого пользователя антивирусы не требуются, достаточно не запускать подозрительные файлы и не тыкать по ярким заманивающим ссылкам.
    Ответ написан
    Комментировать
  • Rbac yii2 чем отличается разрешние от роли?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Разрешения это то, что может делать пользователь: просматривать админку, редактировать посты, удалять пользователей и так далее.

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

    При присваивании роли «Администратор» какому-либо пользователю ему становятся доступны все разрешения этой роли. Так же роли можно наследовать. Админ может наследовать роль пользователя и дополнительные разрешения.

    Если вы добавили новое разрешение системы, то вы просто присваиваете это разрешение необходимой роли. И всем пользователям этой роли становится доступно это разрешение. Если бы не было ролей - разрешение нужно было бы присваивать всем пользователям.

    В небольших проектах можно обойтись ролями без разрешений.

    Роль служит для группировки разрешений.

    Достаточно понятно описано в Википедии.
    Ответ написан
    2 комментария
  • Как в spring вернуть лист объектов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    @Repository
    class ShipRepository {
     
        @PersistenceContext
        private EntityManager entityManager;
     
        @Override
        public List<Ship> findLimitedTo(int limit) {
            return entityManager.createQuery("SELECT s FROM Ship s ORDER BY s.id",
              Ship.class).setMaxResults(limit).getResultList();
        }
    }
    Ответ написан
    1 комментарий
  • Symfony 4 autowiring и наследование?

    @Flying
    Поскольку вы наследуете свой класс от абстрактного класса - иницализация parent'а - ваша прямая обязанность (см. сноску после первого абзаца). Таким образом, если абстрактный класс принимает свои зависимости через конструктор - вам необходимо принимать их же и передавать выше по иерархии наследования.

    Т.е. если абстрактный класс выглядит как:
    abstract class AbstractExample 
    {
      public function __construct(Foo $foo, Bar $bar) 
      {
      }
    }

    а вам необходима ещё дополнительная зависимость Baz $baz, то ваш конструктор должен выглядеть примерно так:
    class MyExample extends AbstractExample 
    {
      public function __construct(Foo $foo, Bar $bar, Baz $baz) 
      {
        parent::__construct($foo, $bar);
        // ... и далее ваша логика ...
      }
    }
    Ответ написан
    Комментировать
  • Как реализовать функцию добавления страниц на сайт пользователями?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    Это ж очень лёгкая задача, модели статья добавляем атрибут типа Boolean "moderated". Вывод отредактировать чтобы учитывал этот атрибут. Делаем форму добавления статьи, настраиваем права доступа. При добавлении статьи пользователем ставим moderated false. В интерфейсе модератора отлавливаем статьи где moderated false.
    Ответ написан
    2 комментария
  • Как ускорить 1С?

    Jump
    @Jump
    Системный администратор со стажем.
    Один из вариантов это переход на серверную версию.
    Хотя с базами 5-7гб при 3-4 пользователях можно прекрасно работать и на файловом варианте.
    Что сделать в первую очередь -
    • Отключаем лишние фоновые задания. - иногда очень сильно тормозят работу.
    • Регулярно делаем сжатие базы - вы давно базу сжимали?
    • Полнотекстовый поиск - включить индексацию, либо выключить его если не пользуетесь.
    • Посмотреть что установлено на сервере - а то бывают случаи, что антивирус умудряются поставить на терминальный сервер с 1с.
    • Проверить базы на ошибки - сначала ChDbfl, потом стандартное ТИИ.
    • Убедитесь что нигде - ни в биос, ни в настройках электропитания не выставлены режимы экономии.
    • Убедитесь что кэш пользователей расположен на SSD диске, убедитесь что SSD не забит под завязку при этом, желательно добавьте для SSD резерв побольше.


    Если памяти достаточно попробуйте поставить 64 битный толстый клиент.
    Прогоните тест Гилева и покажите количество попугаев - зачастую это помогает выявить некоторые проблемы.

    Перекидывать базы в MS SQL?
    Если уж совсем с файловой ничего не получается (что маловероятно) то можно перейти на SQL.
    Тут следует помнить что бесплатная постгри сейчас работает не хуже MS SQL, а при грамотной настройке бывает и получше.
    Есть специальный мини сервер 1с за 15тыс, у которого ограничение на 5юзеров.
    Если не предполагается увеличение числа пользователей - довольно выгодный вариант.
    Ответ написан
    Комментировать
  • Как набить руку на Python разработку и сисадминистрирование за 2 месяца?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Веб-разработка и администрирование сетевых ресурсов более востребованы, поэтому я бы рекомендовал изучить следующее:
    • основы и стандартная библиотека Python -- навык лучше прокачивается написанием скриптов и программ для решения неучебных задач. И если основной навык миддла -- это гуглить (полу)готовые решения, то основной навык джуна -- уметь писать свои "велосипеды". Разработчик, который по-максимуму использует и полагается на готовое -- столь же неэффективен, как и предпочитающий использовать готовое по-минимуму;
    • веб-фреймворк Django -- пилите небольшой проект, получаете общие представления о веб-разработке и практику ООП, но о Python этот веб-фреймворк расскажет мало, делает слишком много работы за программиста, а в его исходном коде можно заплутать, так и не поняв как он работает;
    • система контроля версий Git -- обязательно для разработчика и желательно для сисадмина;
    • wsgi-сервер uWSGI (или Gunicorn) -- см. ниже;
    • http-сервер Nginx -- см. ниже;
    • GNU/Linux -- пробуете развернуть проект с использованием предыдущих двух пунктов;
    • веб-фреймворк Flask -- просто пощупайте или сделайте ещё один небольшой веб-проект, по исходникам этого веб-фреймворка проще понять как работают другие веб-фреймворки и как писать поддерживаемый код, к тому же на Flask часто пилят всякие API / бэкенды;

    Настольные приложения и мобильная разработка на Python кажется менее развита и менее востребована, но когда-нибудь можете пощупать:
    • Python GTK+ 3 (или PySide2) -- Python обёртки над GUI инструментариями для разработки настольных приложений;
    • Kivy -- фреймворк преимущественно для мобильной разработки.

    И, если вопрос предполагает поиск работы через пару месяцев, то работодателям обычно нужны те, разработчики, что будут решать их "бизнес-задачи": снижать расходы, повышать доходы и минимизировать риски. Проще говоря, знание математики, алгоритмов и модных технологий могут не пригодится вообще, а вот доведённые до ума проекты расскажут о Вас работодателю намного больше.
    Ответ написан
    4 комментария
  • Как в Spring MVC отображать изображения?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Приветствую!
    Могут быть различные причину этому... Я тоже иногда сталкиваюсь с этим при работе с Spring Boot.
    1) Используйте Rebuild Project. Не знаю почему, но при простом перезапуске приложения статичные файлы могут не загрузиться. Соответственно, в консоли браузера во вкладке "сеть" - 404 ошибка.
    2) Проверьте включены ли ваши ресурсы в состав приложения. Может изображения физически отсутствуют
    3) Проверьте путь к вашим ресурсам. Например, у меня в Spring Boot вся статика хранится в
    /resources/static/css
    /resources/static/js
    /resources/static/images и т.д.
    Говоря проще, гляньте в настройки вашего проекта и на его структуру....
    Ответ написан
    1 комментарий
  • Модуль для joomla для интерактивной схемы коттеджного поселка?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Ja image hotspot - https://extensions.joomla.org/extension/ja-image-h...
    Делал на нем генпланы 3х поселков.
    Участков много? Есть одна особенность, объясню. Суть в том что в базе данных нужно сменить тип поля который хранит настройки на LONGTEXT.
    Ответ написан
    5 комментариев
  • Как лучше реализовать отображение схемы расположения рабочих мест в офисе в связке vue.js 1С?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    1. Сделайте картинку офиса сверху
    2. Справа создайте кассу символов (компьютер, стол, и т. д.)
    3. Обработчик на перемещение, обработчик на клик, и правый клик, там меню
    4. Элементы сохраняйте в следующем списке
    5. Этот список сохраняйте в 1с в аттрибутах, рядом с инвентарным номером
    6. По желанию можно добавить фильтры

    Дополнил.

    https://www.html5rocks.com/ru/tutorials/dnd/basics/
    Возьмите за основу, добавьте поддержку драгндропа, загрузку и сохранение.

    https://jsfiddle.net/vkorotenko/902cdmLv/

    items: [
    {id: '1', name: 'test', roomid: 2, x: 200, y: 200, angle: 90, zindex: 400, itemtype: 3},
    {id: '2', name: 'test', roomid: 2, x: 210, y: 200, angle: 90, zindex: 400, itemtype: 3},
    {id: '3', name: 'test', roomid: 2, x: 220, y: 200, angle: 90, zindex: 400, itemtype: 3},
    ]
    Ответ написан
    1 комментарий
  • Как получить координаты нужного километра на трассе или по километрам?

    @EmelyanovKonstantin
    GIS архитектура, аналитика, разработка
    где можно скачать такую базу?

    В открытом доступе, скорее всего, не найдёте. Это очень специфично. Можно попробовать договориться с каким-нибудь институтом или организацией.
    PHP или JavaScript / jQuery

    Это уже вопрос технологии, и его лучше решать после получения данных, в зависимости от их формата и объёма.
    Ответ написан
    Комментировать
  • Popup не отображает данные в MarkerClusterGroup react leaflet?

    @EmelyanovKonstantin
    GIS архитектура, аналитика, разработка
    Посмотри так.
    <MarkerClusterGroup>
                    {
                        markers
                    }
                    onMarkerClick={(marker) => console.log(marker, marker.getLatLng())}
    </MarkerClusterGroup>

    Если способ не устарел. Можно добавлять инфу из данных.
    Ответ написан
  • Какой PHP-фреймворк для приложения по обработке данных из разных источников?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Честно не вижу смысла загонять себя в рамки фреймворка. Таких специализированных по моему мнению
    нет. Ваша задача отлично ложится на RabitMQ . Вам потребуется скорее не фреймворк, а базовые принципы
    проектирования / разработки. Понятие интерфейса и класса его реализующего .

    Приблизительно будет так.
    Пользователь Вася хочет опубликовать пост с темой и текстом таким-то
    Слушатель КООРДИНАТОР из этого события Делает события
    - Вася хочет опубликовать в ВК
    - Вася хочет опубликовать в ОК
    - Вася хочет опубликовать в ФБ
    - Вася хочет опубликовать в АХЗ

    Слушатель ВК (кто то хочет запостить, исполняю)
    Ответ написан
    4 комментария
  • Как сделать данную работу на c#?

    SpacePurr
    @SpacePurr
    c#, wpf
    Для примера на WPF.

    После запуска программы в окне изображается две полосы прокрутки.

    Разделим основной Grid на две строки, две колонки. По краям поместим ScrollBar, в большую часть Canvas.
    В Canvas в качестве элементов, которые должны менять позицию, возьмем Button.
    Также добавим обработчики события Button.Click и ScrollBar.Scroll.

    <Window x:Class="Toster.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Toster"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" MinWidth="200">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="15"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="15"/>
            </Grid.ColumnDefinitions>
    
            <Canvas Name="Field">
                <Button Canvas.Left="120" Canvas.Top="150" 
                        Height="50" Width="50" Click="Button_Click"/>
                <Button Canvas.Left="250" Canvas.Top="180" 
                        Height="50" Width="50" Click="Button_Click"/>
            </Canvas>
            
            <ScrollBar x:Name="VerticalScrollBar" 
                       HorizontalAlignment="Right" 
                       Grid.Column="1" Grid.Row="0" 
                       Scroll="VerticalScrollBar_Scroll"/>
            <ScrollBar x:Name="HorizontalScrollBar" 
                       Orientation="Horizontal" VerticalAlignment="Bottom" 
                       Grid.Column="0" Grid.Row="1" 
                       Scroll="HorizontalScrollBar_Scroll"/>
        </Grid>
    </Window>


    В основном классе создадим два свойства:
    1. Point SelectedPoint, в которой будут храниться координаты выбранного элемента
    2. Button SelectedButton, которая будет хранить выбранный элемент.

    ScrollBar сделаем неактивными, пока не будут выбраны объекты для перемещения.

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

    В событии Button.Click ставим крестик выбранному Button. Сохраняем в свойства SelectedButton и SelectedPoint выбранный элемент и его координаты соответственно.
    Значения свойства Value у ScrollBar заполняем относительным положение Button на Canvas.

    При перемещении полосы прокрутки, создаем новую точку с обратно высчитанными координатами и присваиваем новое положение элемента на Canvas.

    public partial class MainWindow : Window
        {
            public Point SelectedPoint { get; set; }
            public Button SelectedButton { get; set; }
    
            public MainWindow()
            {
                DataContext = this;
                InitializeComponent();
    
                VerticalScrollBar.IsEnabled = false;
                HorizontalScrollBar.IsEnabled = false;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (SelectedButton != null)
                    SelectedButton.Content = "";
    
                SelectedButton = sender as Button;
                SelectedButton.Content = "X";
    
                SelectedPoint = SelectedButton.TransformToAncestor(Field).Transform(new Point(0, 0));
                VerticalScrollBar.Value = SelectedPoint.Y / Field.ActualHeight;
                HorizontalScrollBar.Value = SelectedPoint.X / Field.ActualWidth;
    
                VerticalScrollBar.IsEnabled = true;
                HorizontalScrollBar.IsEnabled = true;
            }
    
            private void VerticalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(SelectedPoint.X, VerticalScrollBar.Value * Field.ActualHeight);
                Canvas.SetTop(SelectedButton, SelectedPoint.Y);
            }
    
            private void HorizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(HorizontalScrollBar.Value * Field.ActualWidth, SelectedPoint.Y);
                Canvas.SetLeft(SelectedButton, SelectedPoint.X);
            }
        }


    Пример простой, непрофессиональный, но рабочий. Остальное в ваших руках :)

    5dbf2c1f1718c377695765.gif
    Ответ написан
    Комментировать
  • Как в symfony 3.4 вытащить пользователей у которых нет конкретных ролей?

    @maximrabotaet Автор вопроса
    Вот так:
    /**
         * @param string $role
         *
         * @return array
         */
        public function findWithoutRole($role)
        {
            $qb = $this->_em->createQueryBuilder();
            $qb->select('u')
                ->from($this->_entityName, 'u')
                ->where('u.roles NOT LIKE :roles')
                ->setParameter('roles', '%"' . $role . '"%');
            return $qb->getQuery()->getResult();
        }
    Ответ написан
    2 комментария