4 февр. 2021 г.

Failed to start mars-pn: Failed to exec docker-compose: exec: "docker-compose": executable file not found in $PATH


IF YOU GOT THESE ERRORS:
ddev composer install
return errors
docker executable file not found in PATH
and
Failed to start mars-pn: Failed to exec docker-compose: exec: "docker-compose": executable file not found in $PATH
and 
docker–compose –version
return

Command 'docker–compose' not found, did you mean:

  command 'docker-compose' from deb docker-compose

Try: sudo apt install <deb name>
FIX error

pyrsistent requires Python '>=3.5' but the running Python is 2.7.17

try to install python 3

install python 3

sudo apt-get -y -qq update
sudo apt-get install python3-pip python3-dev build-essential
sudo pip3 install --upgrade setuptools
sudo pip3 install awsebcli --upgrade


then install

pip3 install docker-compose





28 янв. 2021 г.

Drupal 8. Composer update drupal


Check current status

composer outdated 'drupal/*'



Update drupal

 composer update drupal/core 'drupal/core-*' --with-all-dependencies




Then run;

drush updb
drupal cr

Drupal 8. Plugin API

Plugin system overview

1. What the plugin is ? 

https://druki.ru/wiki/8/plugins

Plugins are small pieces of functionality that are swappable. Plugins that perform similar functionality are of the same plugin type

The basic idea of plugins is to allow a particular module or subsystem of Drupal to provide functionality in an extensible, object-oriented way. 

Drupal 8 plugins similar to Drupal 7 hooks

  • @FieldType = hook_field_info()
  • @FieldType = hook_field_schema()
  • @FieldFormatter = hook_field_formatter_info()
  • @FieldWidget = hook_field_widget_info()


Создание кастомного плагина

Плагины состоят из:

Аннотации - это то что в комментариях задается. По сути можно передать какие-то базовые данные о плагине без необходимости писать код и методы. Т.е. данные что у плагина всегда будут статичны внутри него и не будут меняться ни при каких обстоятельствах - можно выносить в аннотации, например: id плагина и его заголовок. Обязательно, как минимум, должен содержать id;

Интерфейс плагина - тут мы описываем какие методы плагин обязан описать у себя;

База плагина (Plugin Base) - абстрактный класс, который наследуется от интерфейса плагина и позволяет для методов задать значения по-умолчанию, тем самым сделав эти методы не обязательными для объявления, если поведения из базового хватает. Это очень востребовано для получения данных из аннотации, так как они получаются всегда одним путем, то их можно описать в базе плагина;

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


2.Compare plugins vs. services 

https://www.drupal.org/forum/support/module-development-and-code-questions/2015-09-29/d8-difference-between-service-and

Плагины реализуют различные модели поведения через общий интерфейс.

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

Сервисы предоставляют одинаковую функциональность и взаимозаменяемы, отличаясь только своей внутренней реализацией.

Например Кэш должен предоставлять методы get, set и expire. Пользователь просто ожидает кэш, и один должен быть в состоянии заменить другой без каких-либо функциональных различий. Внутренняя реализация этих методов и механизмы, которые она использует для этого, могут быть совершенно разными. В этом случае более подходящим будет использовать Сервисы.

Исключение

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


3. Explain Plugin Types, Plugin Discovery, Plugin Factory 

Систему плагинов можно разделить на несколько фундаментальных элементов:

  1. Plugin Types — централизованное место, объявляющая как плагины данного типа будут обнаруживаться и использоваться.
  2. Plugin Discovery — процесс, который используется менеджером плагинов, для того чтобы найти плагины конкретного типа, объявленных во всех модулях. Плагины могут объявляться несколькими способами:
    • Annotation: Данный плагины являются объектами, в комментариях класса которого находится аннотация, описывающая параметры для конкретного типа плагина. Это основной способ определения и поиска плагинов, как и самый распространенный для создания собственных типов.
    • Хуки: Плагины, объявленные через хуки.
    • YAML: Плагины, описанные в YAML файлах. Ядро Drupal использует данный способ для обнаружения ссылок local tasks (вкладки) и local action (кнопки действий на страницах). Данный способ очень полезен для тех типов плагинов, где используется один общий класс.
    • Static: Плагины являются объектами, но регистрируются менеджером плагинов. Это полезно, если вы хотите запретить создание плагинов данного типа (используется статичный список плагинов в коде).
  3. Plugin Factory — отвечает за определенных плагинов для конкретного использования.


Core Plugins

field formatters,  field widgets, views filters, 


Plugin Discovery

1. Explain Core Discovery Types 

2. How to implement custom Plugin Discovery component?


Annotations-based plugins

1. Anotations discovery mechanism vs. hook discovery 

2. How to create custom annotation class?


Plugin Manager

1. How to implement custom Plugin Manager?


Plugin Derivatives, Discovery Decorators

1. Explain what the Plugun Derivatives is. 

2. Explain what the Discovery Decorators is.

 



21 янв. 2021 г.

Drupal 8. Entity API




Entity types in core come in two variants. Content & Config

 The Entity System is the API for entities manipulation (CRUD: create, read, update, delete). Entity validation has its own API (which could validate an Entity saved via REST, rather than a form, for example).

Entities are typed classes with methods


Configuration Entity
Used by the Configuration System. Supports translations and can provide custom defaults for installations. Configuration entities are stored within the common config database table as rows.
Content Entity
Consist of configurable and base fields, and can have revisions and support translations. Content entities are stored within a custom database table as rows. The table name is the same as the content entity "id", and the columns are defined by the entity's "baseFieldDefinitions" method.

Охватывает методы API общего объекта

  • Entity::create()
  • Entity::load()
  • Entity::save()
  • Entity::id()
  • Entity::bundle()
  • Entity::isNew()
  • Entity::label()


В Drupal 8 бандлы представляют собой тип контейнера для информации, которая содержит определения полей или настроек.



Annotations

Annotations are read and parsed at runtime by an annotation engine. Drupal 8 uses the Doctrine annotation parser, which turns it into an object that PHP can use.










17 янв. 2021 г.

Drupal 8. Drupal Console and Drush

Installation

https://hechoendrupal.gitbooks.io/drupal-console/en/index.html 

http://docs.drush.org/en/master/ 

https://www.webwash.net/drupal-cli-drush-and-drupal-console/


install drush via composer

$ composer global require drush/drush:dev-master

Установка с помощью приложения Composer

Перейти в папку с Drupal:

cd /path/to/drupal8.dev

Установка командой composer require:

composer require drupal/console:~1.0 \
--prefer-dist \
--optimize-autoloader

Скачать шаблон DrupalComposer

composer create-project \
drupal-composer/drupal-project:8.x-dev \
drupal8.dev \
--prefer-dist \
--no-progress \
--no-interaction

Обновить Drupal Console:

composer update drupal/console --with-dependencies

Установка пускового файла Drupal Console

С помощью командного приложения curl:

curl https://drupalconsole.com/installer -L -o drupal.phar
mv drupal.phar /usr/local/bin/drupal
chmod +x /usr/local/bin/drupal

ИЛИ если командное приложение curl не установлено

php -r "readfile('https://drupalconsole.com/installer');" > drupal.phar

Capabilities

https://github.com/hechoendrupal/drupal-console h

ttps://drushcommands.com/ 

https://pantheon.io/drupal-8/introduction-drush-and-drupal-console 

https://valuebound.com/resources/blog/developing-drupal-8-sites-a-smarter-way-drupal-console

Custom commands

https://hechoendrupal.gitbooks.io/drupal-console/en/extending/creating-custom-commands.html https://valuebound.com/resources/blog/how-to-write-custom-drush-commands-drupal-8 https://www.droptica.com/blog/your-own-drush-command-drupal-8/ https://drupalize.me/tutorial/drupal-console?p=2766 https://valuebound.com/resources/blog/power-of-drupal-console-in-drupal-8


13 янв. 2021 г.

Drupal 8: Services

 https://niklan.net/blog/150

Drupal 8 Authentication API

 https://niklan.net/blog/166


https://www.drupal.org/docs/8/core/modules/basic_auth/overview

Here is an example of a route that uses Basic Auth to authenticate users:

# core/modules/system/tests/modules/router_test_directory/router_test.routing.yml
module.router_test_11:
  path: '/router_test/test11'
  options:
    _auth: [ 'basic_auth' ]
  requirements:
    _user_is_logged_in: 'TRUE'
  defaults:
    _content: '\Drupal\router_test\TestContent::test11'

In order to access to /router_test/test11, you have to fill the Authentication header with a valid Drupal user who has permissions to access to that page.

Note that Basic Auth is NOT a means of logging into a Drupal site in order to make service GET requests that depend on the identity of the logged-in user (e.g. a views REST display that uses an Authored By relationship to return content belonging to the logged-in user). It is cookie authentication that makes views Relationships possible. See Using other authentication protocols for more on how to login from a client application and get the session cookie.