• Как поставить bower ("bower" не является внутренней или внешней командой...)?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    После успешной установки Bower через npm вам также необходимо установить путь либо напрямую к нему, либо к папке npm целиком, если исполняемый файл Bower лежит там же, где и npm, так как сама ваша система (Windows) сама этого угадать не может.

    Для этого нужно зайти в "Свойства системы / Дополнительно / Переменные среды", после чего в разделе "Системные переменные" (не спутайте с "Переменные среды для пользователя %User%") отредактировать переменную path, добавив в нее через строчку запятой расположение исполняемого файла Bower.

    Лично у меня и npm, и Bower лежат в одной папке, поэтому моя переменная содержит только лишь путь до нее, это что-то вроде "C:\Users\Stas\node.js\4.4.0\"

    Проще говоря, найдите через поиск файл bower.cmd и добавьте в указанную системную переменную путь до него (без имени самого файла).
    Ответ написан
    2 комментария
  • Доп. шаблон WooCommerce?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Вы можете создать какой-то "особенный" шаблон для категорий товаров, поправив файл taxonomy-product_cat.php. Подробнее в документации самого WC. Если коротко, то сам WC не использует систему шаблонов WP, у него свой подход ко всему этому. Файл, который я обозначил выше, содержит простецкий код:
    if ( ! defined( 'ABSPATH' ) ) {
    	exit; // Exit if accessed directly
    }
    
    wc_get_template( 'archive-product.php' );

    Как можно догадаться, для вывода особенного шаблона для особенных страниц вы должны прописать тут некоторое условие, которое будет брать шаблон archive-product.php или другие в определенных условиях. Интерактивности можно добавить, дописав функционал самого WC или плагина для него, который будет через хук добавлять в настройки WC в админке выбор того или иного шаблона для тех или иных страниц.
    Ответ написан
  • Как подключить файл в PHP?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Есть несколько моментов, которые нужно учесть при подключении файлов.

    • В целом есть два варианта их подключения, через require и через include. Оба сделают одно и то же, но второй вариант выдаст warning при отсутствии файла, а первый - fatal error.
    • Оба варианта имеют свои подварианты, а именно require_once и include_once - в случае использования такой записи файлы включаются в код единожды, и если вы где-то два раза попытаетесь подключить их, подключение произойдет только один раз.
    • Путь, который по умолчанию используется в обоих вариантах, зависит от настроек среды, в каких-то случаях он может быть не задан, и тогда путь считается от файла, в котором вы подключаете другие файлы, а в каком-то будет установлена переменная конфигурации include_path и вся ваша логика нарушится. В связи с этим настоятельно рекомендуют подключать файлы с помощью такой конструкции: include __DIR__ . '/dir/file';, где __DIR__ - "магическая" переменная, содержащая абсолютный путь до папки вашего срипта.
    • Слеши в пути отличаются в разных системах, получить нужный вам можно через предопределенную константу DIRECTORY_SEPARATOR.
    • Если вы подключаете конкретно конфиг вашей системы, вы можете сделать вот так в скрипте: $config = include __DIR__ . '/config.php';, а в конфиге сделать что-то вроде return = ['pass'=>'...', login=>'...'], после чего в основном скрипте получать переменные через что-то вроде config['pass'] - в целом, работать все будет и без этого, но зато так повысится читаемость вашего кода.
    Ответ написан
    Комментировать
  • Как сделать скидку на второй товар Woocommerce?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    А вас интересует, как самому написать это, или же плагин для управления скидками? Я бы вам советовал воспользоваться вторым вариантом, так как в случае самостоятельного написания это не слишком тривиальная задача, так как даже в случае такой простой скидки по-хорошему нужно сделать ее управляемой через админку сайта, и это вырастает уже до серьезной задачи.

    Плагины, решающие вашу проблему:

    WooCommerce Dynamic Pricing - $129.
    WooCommerce Bulk Discount - free.
    Pricing Deals for WooCommerce - free with Pro version.
    Ответ написан
    Комментировать
  • Можно вместо $(document).ready(function(){ написать JavaScript код после HTML, вроде бы сначала HTML прогружается потом JS?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Ответ на ваш вопрос: нет, далеко не во всех случаях этот код эквивалентен.

    Когда вы собираетесь писать какой-либо JS-код, нужно пройти несколько этапов принятия решения, что, на чем и как вы будете писать.

    1. С чем должен работать ваш код, с DOM-деревом (если говорить просто, то с html-кодом), с какими-то внешними сервисами, или с просто консолью, например.
    2. Насколько объемен этот код, и соответственно, если задачи простые и их минимальное количество, использовать вместо JQuery (а именно она у вас, скорее всего, и используется) обычный Javascript, так называемый ванильный JS (чистый). Не путать с библиотекой Vanilla.js.
    3. Будет ли этот код расширяться в дальнейшем.

    Ответив на первый вопрос, вы поймете, нужно ли вам дожидаться, пока что DOM-дерево страницы будет построено браузером. Обратите внимание, что конструкция вида $(document).ready(function(){... не равнозначна написанному после html некоему скрипту, так как браузер у вас сначала получает запрошенную страницу, и потом, если не оговорено, одновременно начинает "строить" ее отображение и одновременно выполнять ваш js-код.

    Именно чтобы браузер дождался первого и после начал выполнять второе, используют конструкции, приведенные вами в вопросе. И даже если бы вы писали на чистом JS, вы все равно писали бы что-то вроде этого document.addEventListener('DOMContentLoaded', ..., то есть один в один тот же код, с точки зрения его логики.

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

    Ну и ответив на третий вопрос, вы поймете, стоит ли ввязываться в работу с чистым JS, или же все-таки лучше не рисковать и сразу писать с использованием какой-либо библиотеки, чтобы потом не упереться в излишнюю сложность своей работы.
    Ответ написан
    2 комментария
  • Какие PHP стили записи существуют?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Я пишу на Laravel мне не нравится что постоянно необходимо создавать 2 функции 1ну для отображения вьюхи 2 для самой логики


    Если коротко, то все ваши проблемы из-за того, что вы не совсем верно неверно поняли модель MVC. Если вы бы иначе построили структуру своего приложения, то вас не смущали бы "две функции".

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

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

    То, что вы в данный момент используете - это совсем не right way. И точно так же не right way делать в одном контроллере две "функции" (на самом деле - два метода класса вашего контроллера), одна из которых будет что-то вроде showRegister(), а другая - createRegister(). Правильный в вашем конкретном примере вариант - это разбить вашу логику на две (три) логические единицы (два/три контроллера или группы контроллеров), одна - показ страниц бекенда / фронтенда, а другая - обработка задач авторизации. В итоге у вас должно будет получиться что-то вроде:

    app
    ...
    ├── Http
    │   ├── Controllers
    │   │   ├── Auth // 1. тут мы обрабатываем роуты, ответственные за авторизацию
    │   │   │   ├── ForgotPasswordController.php
    │   │   │   ├── LoginController.php
    │   │   │   ├── RegisterController.php
    │   │   │   └── ResetPasswordController.php
    │   │   ├── Backend // 2. тут мы показываем бекенд
    │   │   ├── Frontend // 3. тут мы показываем фронтенд
    │   │   │   ...
    │   │   ├── Controller.php
    │   │       ...
    ...


    В пунктах 2 и 3 вы в выводимых ими вьюхах используете роуты, которые про авторизацию, и у вас в итоге будет отдельная группа роутов вроде /auth/* и отдельные группы вроде /* (главная) и /admin/*.

    Согласитесь, теперь все выглядит логично и понятно. И "стили записи" тут совершенно ни при чем.
    Ответ написан
    4 комментария
  • Можно ли передать права на репозиторий с одного аккаунта на другой на bitbucket.org?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Верно, это возможно. Инструкция от самого Bitbucket:

    1. From the repository you want to transfer, click Settings in the left menu.
    2. From the Repository details page, scroll down and you'll see Transfer or delete repository. Click Transfer repository to open the Transfer repository window.
    3. Enter the Username of the individual or team account you want to transfer to.
    4. Press Transfer.

    The Bitbucket server sends the user or team account an email notification containing a transfer request. The Transfer repository page changes to indicate that you have transferred the repository.
    Additionally, the system displays a pending transfer banner at the top of each repository tab. This warns others who have access to your repository that a transfer is pending. You are able to revoke the transfer request at any time before the new user accepts it. If you revoke a transfer before a user accepts it, Bitbucket sends the user a notification that the transfer was rescinded.


    Что касается передачи коммитов и прочего, то верно, передается все целиком:

    If you have administrative rights on a repository, you can change or transfer the ownership of a repository to another team or to a individual account. The account holder you are transferring to must accept the transferred repository to complete the transfer. You can revoke a pending transfer before it is accepted. Transferring a repository transfers the commit history, issue tracker, and wiki associated with that repository.


    Я нашел эту информацию в кеше Гугла, сама страница с этой информацией в данный момент выдается с 503-ей ошибкой.
    Ответ написан
    Комментировать
  • Как сделать js, css пакеты для Laravel?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    вообще composer для php

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

    видимо нужно создавать npm-пакеты, но тут уже я потерялся, пытаясь понять, как это для веб оформить


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

    вынести некоторые части js кода в отдельные пакеты, чтобы потом использовать в других проектах


    Еще раз по предыдущим пунктам - composer действительно собирает в основном для бекенда (условно движок), хотя и им можно забивать гвозди. NPM собирает для скорее опять же каких-то нужд бекенда, в том числе административных, например, через него ставится Bower. В том числе потому, что у него для каждого пакета в его папку подтягиваются все его зависимости, каждый раз для каждого пакета, даже если пакеты, от которых они зависят, являются общими.

    А вот тот же Bower можно и нужно использовать для подтягивания пакетов для фронта. Elixir, laravel-mix - это все сборщики, как и тот же Gulp, они занимаются не установкой пакетов, а их преобразованием - например, минифицируют и конкатенируют файлы стилей или скриптов, это совершенно иные задачи.

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

    # Git endpoint
    $ bower install git://github.com/user/package.git
    # URL
    $ bower install http://example.com/script.js
    Ответ написан
  • Где синхронизировать данные?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    есть ли бесплатные сервисы, которые смогут мне предоставить вышеописанные возможности?

    Не совсем понятно, какие именно возможности вас интересуют, но в целом можете посмотреть на де-факто стандарт в разработке API, на текущий момент, swagger.io. Он будет бесплатен для вашей задачи.

    Или надо арендовать сервер и на нём устанавливать deployd приложение?

    В целом, аренда сервера стоит копейки по нынешним ценам, пара сотен рублей в месяц. Но если вас смущает эта цена и не смущает стоимость вашего времени, потраченного на поиски альтернативных решений и их настройку, вы можете всегда поднять локальный веб-сервер у себя на машине, используя хоть VirtualBox+Vagrant, хоть Denwer, хоть что угодно еще. Для задач разработки и тестирования этого хватит на 100%.
    Ответ написан
    1 комментарий
  • Что грузится с плагином Contact Form 7?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Данная проблема давно известна, и именно ваша попытка ускорить сайт к ней и привела - Contact form 7 конфликтует с различными плагинами, ускоряющими сайт за счет кеширования и других вещей. Посмотрите на этот ответ на SO, возможно, что он поможет вам.

    В общем же суть такова, что вам нужно отключить кеширование для CF7, а конкретнее -
    для функции (скрипта, ее содержащего) wpcf7OnloadRefill(). По крайней мере, на тот момент это было связанно именно с ней. Так или иначе, ваша задача - это определить, что именно в текущей версии плагина стоит указать как некешируемое.
    Ответ написан
    2 комментария
  • Как можно оптимизировать код ajax отправки формы для многократного использования?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    пробовал поставить через класс но что то я делаю не так или это вообще не возможно


    Нет, это возможно, и ход мыслей у вас абсолютно верный. Скорее всего, вы ошиблись при написании селекторов в $("#form").submit(...). Если у вас на странице все формы именно те, что вам нужно обрабатывать указанным скриптом, то вам достаточно написать вот так: $("form").submit(...). Если же у вас есть еще какие-то формы, которые нужно обрабатывать иным способом, то вам следует придумать некий класс для обсуждаемых форм, и делать по ним выборку таким образом: $("form.some-class").submit(...).
    Ответ написан
    1 комментарий
  • Как изменить дату в docker container?

    stanislav-belichenko
    @stanislav-belichenko
    Backend PHP Developer
    Возможно, стоит делать это из под root или с помощью su/sudo? ;-)

    Источник:
    That's not possible with Docker. Docker uses the same clock as the outside kernel. What you need is full virtualization which emulates a complete PC.

    The sudo fails because it only makes you root of the virtual environment inside of the container. This user is not related to the real root of the host system (except by name and UID) and it can't do what the real root could do.

    In you use a high level language like Python or Java, you often have hooks where you can simulate a certain system time for tests or you can write code which wraps "get current time from system" and returns what your test requires.

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

    Так что, судя по всему, ваш путь - это либо хаки в той среде, которую вы хотите проверить с измененной датой, либо использование более полноценной виртуализации.
    Ответ написан