• Возможно ли стать middle/senior без работы?

    @Kripto77
    Теория без практики в IT вообще бесполезна. Как думаете стать профи - читая книжки и доки? Так сейчас книжки устаревают пока их пишут, а доки часто не успевают за разработкой насколько быстро все развивается.
    Ответ написан
  • PhpSpreadsheet: Как установить такой формат ячейки, чтобы она принимала текстовые значения, не обрезая в них знак "+"?

    @Kripto77
    Столкнулся с той же проблемой - ответ на шел в доках, возможно кому-то пригодится
    https://phpspreadsheet.readthedocs.io/en/latest/to... - Раздел "Setting a number with leading zeroes"

    В тип string значение ячейки приводится примерно таким кодом
    // Set cell A8 with a numeric value, but tell PhpSpreadsheet it should be treated as a string
    $spreadsheet->getActiveSheet()->setCellValueExplicit(
        'A8',  // координаты ячейки
        "01513789642",   // нужное значение строки
        \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING
    );
    Ответ написан
    Комментировать
  • Как проверять юзера при каждой аутентификации в Symfony 5?

    @Kripto77 Автор вопроса
    Спасибо всем за комментарии - навели на нужные идеи.
    По итогу пришел к не очень красивому решению через EventSubscriber и глобальный onKernelRequest (срабатывает на любой запрос). Буду признателен если кто подскажет решение получше.

    //src/Events/GlobalSubscriber.php
    
    namespace App\Events;
    
    use App\Entity\User;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\RequestEvent;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Routing\RouterInterface;
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
    
    class GlobalSubscriber implements EventSubscriberInterface
    {
        /** @var RouterInterface $router */
        private $router;
    
        /** @var TokenStorageInterface $tokenStorage */
        private $tokenStorage;
    
        /**
         * @param RouterInterface $router
         * @param TokenStorageInterface $tokenStorage
         */
        public function __construct(RouterInterface $router, TokenStorageInterface $tokenStorage)
        {
            $this->router = $router;
            $this->tokenStorage = $tokenStorage;
        }
    
        public function onKernelRequest(RequestEvent $event)
        {
            if(!$event->isMasterRequest())
                return;
    
            $this->isUserBlocked($event);
        }
    
        /**
         * Проверка блокировки пользователя
         * @param RequestEvent $event
         */
        private function isUserBlocked(RequestEvent $event)
        {
            if (empty($this->tokenStorage->getToken()) || !$this->tokenStorage->getToken()->getUser() instanceof User) return;
    
            /** @var User $user */
            $user = $this->tokenStorage->getToken()->getUser();
    
            if ($user->isBlocked()) {
                $event->setResponse(new RedirectResponse($this->router->generate('app_logout')));
            }
    
        }
    
        public static function getSubscribedEvents()
        {
            return [
                // Правка от @Flying
                KernelEvents::REQUEST => 'onKernelRequest'
                // Старый вариант - RequestEvent::class => 'onKernelRequest'
            ];
        }
    }


    Странно почему не заработал EventListener - делал по офф.докам https://symfony.com/doc/current/event_dispatcher.h...
    Ответ написан
  • Как в Symfony 5 / Mailer отключить TLS?

    @Kripto77 Автор вопроса
    Поиски показали что сейчас эта проблема только костыльно решаема. В версии Symfony 5.1 будет введен параметр verify_peer=false
    MAILER_DSN=smtp://user:pass@localhost?verify_peer=false


    Пока придется использовать PHPmailer
    Ответ написан
    Комментировать
  • Как сделать универсальный метод для правки input на лету?

    @Kripto77 Автор вопроса
    Решение, может кому пригодится.
    Код указан для компонента либы Vuetify, т.к. требуется @change.native (напрямую на теге input не работает)

    <div id="app">
                                <v-text-field
                                    v-model="myModel"
                                    label="Tine:"
                                    @keyup="filterToFloat($event)"
                                    @change.native="setToFloat($event)"
                                >
                                    <span slot="append">час</span>
                                </v-text-field>
    </div>
    
    <script>
        let app = new Vue({
            el: '#app',
            data: {
                item: {
                  subitem: 0.25
                }
            },
            methods: {
                setToFloat: (event) => {
                    event.target.value = parseFloat(event.target.value)
                    event.target.dispatchEvent(new Event('input'))
                },
                filterToFloat: (event) => {
                    event.target.value = event.target.value.replace(',', '.').replace(new RegExp(/[^0-9.]/), '')
                    event.target.dispatchEvent(new Event('input'))
                },
            },
        })
    </script>
    Ответ написан
    Комментировать
  • Как в динамической таблице по Enter передавать фокус следующему Input?

    @Kripto77 Автор вопроса
    Мое решение по наводке Alex

    На каждый нужный input добавлен класс .find-me-for-next-focus и повешено событие @keyup.enter="findNextFocus($event)"

    findNextFocus: function(event) {
                    let element = event.target;
                    ['td', 'tr'].some(function(item, i) {
                        let nextElement = element.closest(item).nextElementSibling;
                        if(nextElement && nextElement.querySelector('.find-me-for-next-focus')) {
                            nextElement.querySelector('.find-me-for-next-focus').focus();
                            return true;
                        }
                    });
                },
    Ответ написан
    Комментировать
  • Как в Symfony 4.3 принудительно разлогинить юзера по ID?

    @Kripto77 Автор вопроса
    Doc

    Решение через EquatableInterface. Сокращенный класс что получилось:

    //src/Entity/User.php
    
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Security\Core\User\EquatableInterface;
    
    /**
     * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="UNIQ_8D93D649E7927C74", columns={"email"})})
     * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
     * @UniqueEntity(fields={"email"}, message="There is already an account with this email")
     * @ORM\HasLifecycleCallbacks()
     */
    
    class User implements UserInterface, EquatableInterface
    {
       /**
         * @see EquatableInterface
         * @param UserInterface $user
         * @return bool
         */
        public function isEqualTo(UserInterface $user): bool
        {
            return $user->roles === $this->roles;
        }
    
    }
    Ответ написан
  • Как решить проблему с загрузкой через Composer на OpenServer?

    @Kripto77 Автор вопроса
    Проблема все-таки оказалась в Касперском 19.

    В основном списке composer.bat в Доверенных.

    Пришлось добавить дополнительно в
    Настройки - Дополнительно - Угрозы и исключения - Указать доверенные программы - composer.bat - Не наследовать ограничения родительского процесса (программы)
    Ответ написан
    Комментировать
  • Как узнать размер файла на другом сервере по http?

    @Kripto77 Автор вопроса
    cUrl так cUrl - было интересно найти решение на встроенных пхп функциях

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

    class curlDownloader
    Ответ написан
    Комментировать
  • Как почистить xml файл от недопустимых символов?

    @Kripto77 Автор вопроса
    Максим Вы оказались правы - подсовывали файл в кодировке UCS-2 вместо UTF-8.
    Ответ написан
    Комментировать
  • Передать data атрибуты в попап?

    @Kripto77
    Поздно отвечаю - но решение 100% рабочее - может кому пригодится

    Картинка в magnific popup через data
    <div class="zoom" data-src="/images/test.jpg"></div>

    $('.zoom').click(function(){
    		$.magnificPopup.open({
    	    	items: {
    		      src: $(this).data('src')
        		},
    		    type: 'image'
    		});
    });
    Ответ написан
    Комментировать