Типы материала и поля через drush или файлы

Главные вкладки

Аватар пользователя univerico univerico 1 декабря 2017 в 0:29

Здравствуйте! Пытаюсь найти способ ускорить работу с типами материалов и полями (чтобы не создавать одни и те же типы матералов на разных сайтах заново, например). Специальных команд для создания типов материалов через drush найти не удалось.
Но есть идея, как хотя бы частично можно ускорить с помощью drush.
Как Вы думаете лучше организовать работу с полями и типами материала с помощью drush?
1)Может тип материала создавать через ui, а потом к нему добавлять поля с помощью команд drush field...?
2)Или лучше найти файл, в который записывается информация и его редактировать или модуль писать какой-то?
В каких файлах это прописано?
3)Или может какой-то из модулей миграции для этого использовать?

Если через drush даже и работать с полями, то все равно не понятно, как можно делать настройки вкладок (включать многоязычность, карту сайту и др?)
Может с помощью drush variable? или что-то типа того?

4)Также по полям пока получается только вызвать выбор пошаговый почти как в браузере только текстом (см скриншот), а как сразу все перечислить в команде drush, выбрав нужное, чтобы не приходилось вручную выбирать?
Как например прописать сразу все аргументы и опции для поля - термина таксономии?
пока не пойму как выбирать подтип виджета, например для терминов таксономии как выбирать внутри
Есть таблица типов полей и виджетов, но у меня почему-то в ней только виджет по умолчанию, а списка нет возможных (например для taxonomy_term_reference только options_select)

Основные комнады ниже:
Для variable
variable-realm-del Delete a variable for a specific realm and key.
variable-realm-get Get a variable for a specific realm and key.
variable-realm-set Set a variable for a specific realm and key.

Для полей

1)field-clone Clone a field and all its instances.
2)field-create Create fields and instances. Returns urls for field editing.
3)field-delete Delete a field and its instances.
4)field-info View information about fields, field_types, and widgets.
5)field-update Return URL for field editing web page.

Подробнее про эти комнады из справки
2) field-create
Create fields and instances. Returns urls for field editing.

Examples:
drush field-create article Define new article fields via interactive prompts.
open `drush field-create article` Define new article fields and then open field edit form for refinement.
drush field-create article Create two new fields.
city,text,text_textfield
subtitle,text,text_textfield

Arguments:
bundle Content type (for nodes). Name of bundle to attach fields to. Required.
field_spec Comma delimited triple in the form: field_name,field_type,widget_name. If widget_name is omitted, the default widget will be
used. Separate multiple fields by space. If omitted, a wizard will prompt you.

Options:
--entity_type Type of entity (e.g. node, user, comment). Defaults to node.

4)field-info
View information about fields, field_types, and widgets.

Examples:
field-info types Show a table which lists all field types and their available widgets

Arguments:
type Recognized values: fields, types. If omitted, a choice list appears.

Options:
--fields=
--format= Select output format. Available: table, csv, json, list, var_export, yaml. Default is table.
--pipe Equivalent to --format=csv.

Topics:
docs-output-formats Output formatting options selection and use.

Список типов полей и виджетов
Type name Default widget Widgets
addressfield addressfield_standard
commerce_customer_profile_reference options_select

commerce_line_item_reference commerce_line_item_manager

commerce_price commerce_price_simple

commerce_product_reference options_select

country options_select

datetime date_select

date date_select

datestamp date_select

entityreference entityreference_autocomplete

file file_generic
image image_image
inline_conditions inline_conditions
link_field link_field
list_integer options_select

list_float options_select

list_text options_select

list_boolean options_buttons

mailup_list_reference mailup_list_reference
mailup_subscription mailup_subscription
number_integer number
number_decimal number
number_float number
physical_weight physical_weight_textfield
physical_dimensions physical_dimensions_textfields
taxonomy_term_reference options_select

text text_textfield
text_long text_textarea
text_with_summary text_textarea_with_summary

ВложениеРазмер
Иконка изображения 2017-12-01_00-13-16.png98.45 КБ
Иконка изображения 2017-12-05_12-07-28.png85.08 КБ

Комментарии

Аватар пользователя univerico univerico 5 декабря 2017 в 11:01

А как посмотреть названия типов виджетов, чтобы их указывать в команде drush field-create?
В справке по команде drush field-info types есть только дефолтные. Может какой-то файл открыть drush и там поискать?
Или это в ядре или модулях Друпала прописано? Комнада drush field работает только из директории сайта у меня, поэтому наверное нужно искать в ядре и модулях Друпал? Features буду использовать, когда нужно перенести весь функционал и в неизменном виде, а еcли только поля добавлять однотипные, но не идентичные полностью, то удобнее с drush. Не могу найти основной форум по Drush (сам проект теперь на github, а форум ?)

Аватар пользователя univerico univerico 5 декабря 2017 в 20:36

Ясно. Спасибо.
Тогда пока искать не буду пробовать. Включу анлийский как язык по умолчанию, посмотрю названия в открывающихся диалогах в drush, предлагаемые к выбору, и попробую по ним наугад методом подбора самые частые вычислить названия виджетов для команд drush.
Если что-то получится вычислить, то напишу.

Аватар пользователя gun_dose gun_dose 6 декабря 2017 в 9:13
1

Как вариант, через module_implements можно получить все имплементации hook_field_widget_info и тогда будет ясно, где смотреть, какие названия виджетов есть на сайте.

Аватар пользователя univerico univerico 6 декабря 2017 в 14:51

Удалось найти например
В multiupload_imagefield_widget.module
"**
* Implements hook_field_widget_info().
*/
function multiupload_imagefield_widget_field_widget_info() {
return array(
'image_miw' => array(
'label' => t('Multiupload'),
'field types' => array('image'),
'behaviors' => array(
'multiple values' => FIELD_BEHAVIOR_CUSTOM,
'default value' => FIELD_BEHAVIOR_NONE,
),
'settings' => array(
'progress_indicator' => 'throbber',
'preview_image_style' => 'thumbnail',
),
),
);
}"

и в multiupload_imagefield_widget.info
name = Multiupload Imagefield Widget
description = "Creates a widget for imagefield to upload multiple files at once using html5."
package = Fields
dependencies[] = multiupload_filefield_widget
dependencies[] = image
core = 7.x

Т.е. получается что название виджета multiupload_imagefield_widget или это просто название проекта и я не там смотрю?

Аватар пользователя Александ Александ 6 декабря 2017 в 14:57

Можешь посмотреть в чем ошибка?

Recoverable fatal error: Argument 2 passed to Drupal\commerce\Context::__construct() must implement interface Drupal\commerce_store\Entity\StoreInterface, boolean given, called in C:\OSPanel\domains\testsite.com\www\modules\contrib\commerce\modules\order\src\OrderRefresh.php on line 137 and defined in C:\OSPanel\domains\testsite.com\www\modules\contrib\commerce\src\Context.php on line 46 #0 C:\OSPanel\domains\testsite.com\www\core\includes\bootstrap.inc(566): _drupal_error_handler_real(4096, 'Argument 2 pass...', 'C:\\OSPanel\\doma...', 46, Array)

Аватар пользователя alexo alexo 22 мая 2018 в 14:53

А если попробовать не через drush, а в какой-то файл добавлять строчки о новых полях через комнадную строку просто и/или если потребуется в базу данных?

Аватар пользователя univerico univerico 1 декабря 2017 в 14:40

Спасибо изучу. Особенно Features. Bundle Clone больше именно для копии, но покапаюсь с ним, может получится и менять что-то при клонировании.
И все же ищу еще варианты, чтобы не через ui это делать.

Аватар пользователя bumble bumble 1 декабря 2017 в 20:21
1

univerico wrote:

чтобы не через ui это делать

Посмотрите реализацию стандартного профиля, напишите свою drush-команду (или просто скрипт) по аналогии.

Аватар пользователя univerico univerico 5 декабря 2017 в 11:08

Пробую создавать через druhs, очень удобно
Пример как получается при вводе "drush field-create mytest city,text,text_textfield" на скриншоте.
Но пока не удалось найти, как отдельно вводить машинное имя и метку, как менять виджет (сам списко пока не могу найи) и возможно ли добавлять переводы полей через drush.

Аватар пользователя univerico univerico 6 декабря 2017 в 13:38

Пока удалось найти файл, ? в котором, возможно, частично прописан вывод таблицы справочной по команде drush field-info (скриншот прикрепляю к теме форума)
С 78 и 286 строчек, почему не выводится нормально список там, не пойму. Может можно в нем поправить?

http://api.drush.org/api/drush/commands%21core%21field.drush.inc/6.x
'field-info types' => 'Show a table which lists all field types and their available widgets',
),
'outputformat' => array(
'default' => 'table',
'pipe-format' => 'csv',
'field-labels' => array(
'field-name' => 'Field name',
'type' => 'Field type',
'bundle' => 'Field bundle',
'type-name' => 'Type name',
'widget' => 'Default widget',
'widgets' => 'Widgets',
),
'table-metadata' => array(
'process-cell' => '_drush_field_info_process_cell',
),
'output-data-type' => 'format-table',
),

и здесь
function drush_field_info($type = NULL) {
if (!isset($type)) {
// Don't ask in 'pipe' mode -- just default to 'fields'.
if (drush_get_context('DRUSH_PIPE')) {
$type = 'fields';
}
else {
$type = drush_choice(drupal_map_assoc(array('types', 'fields')), dt('Which information do you wish to see?'));
}
}

$result = array();
switch ($type) {
case 'fields':
drush_hide_output_fields(array('type-name', 'widget', 'widgets'));
$info = field_info_fields();
foreach ($info as $field_name => $field) {
$bundle_strs = array();
foreach ($field['bundles'] as $entity_type => $bundles) {
$bundle_strs += $bundles;
}
$result[$field_name] = array(
'field-name' => $field_name,
'type' => $field['type'],
'bundle' => $bundle_strs,
);
}
break;
case 'types':
drush_hide_output_fields(array('field-name', 'type', 'bundle'));
$info = field_info_field_types();
module_load_include('inc', 'field_ui', 'field_ui.admin');
$widgets = field_info_widget_types();
foreach ($info as $type_name => $type) {
$widgets = field_ui_widget_type_options($type_name);
$result[$type_name] = array(
'type-name' => $type_name,
'widget' => $type['default_widget'],
'widgets' => $widgets,
);
}
break;
default:
return drush_set_error('DRUSH_FIELD_INVALID_SELECTION', dt("Argument for drush field-info must be 'fields' or 'types'"));
}

return $result;
}

Аватар пользователя univerico univerico 6 декабря 2017 в 14:35

Хотя у меня уже предположение, что для некоторых модулей, которые добавлены вручную drush не знает об их виджетах и нужно их дополнительно указывать именно для drush в каком-то файле, потому что вроде удалось залезть в модуль и найти название виджета, например
(/**
* Implements hook_field_widget_info().
*/
function multiupload_imagefield_widget_field_widget_info() {
return array(
'image_miw' => array(
'label' => t('Multiupload'),....)

но при вводе
$ drush field-create mytest mymulti1,image,multiupload_imagefield
$ drush field-create mytest mymulti2,image,multiupload_imagefield_widget
все равно создается виджет по умолчанию

Аватар пользователя univerico univerico 6 декабря 2017 в 13:31

Пока удалось найти файл, ? в котором, возможно, частично прописан вывод таблицы справочной по команде drush field-info (скриншот прикрепляю к теме форума)
С 78 и 286 строчек, почему не выводится нормально список там, не пойму. Может можно в нем поправить?

http://api.drush.org/api/drush/commands%21core%21field.drush.inc/6.x
'field-info types' => 'Show a table which lists all field types and their available widgets',
),
'outputformat' => array(
'default' => 'table',
'pipe-format' => 'csv',
'field-labels' => array(
'field-name' => 'Field name',
'type' => 'Field type',
'bundle' => 'Field bundle',
'type-name' => 'Type name',
'widget' => 'Default widget',
'widgets' => 'Widgets',
),
'table-metadata' => array(
'process-cell' => '_drush_field_info_process_cell',
),
'output-data-type' => 'format-table',
),

и здесь
function drush_field_info($type = NULL) {
if (!isset($type)) {
// Don't ask in 'pipe' mode -- just default to 'fields'.
if (drush_get_context('DRUSH_PIPE')) {
$type = 'fields';
}
else {
$type = drush_choice(drupal_map_assoc(array('types', 'fields')), dt('Which information do you wish to see?'));
}
}

$result = array();
switch ($type) {
case 'fields':
drush_hide_output_fields(array('type-name', 'widget', 'widgets'));
$info = field_info_fields();
foreach ($info as $field_name => $field) {
$bundle_strs = array();
foreach ($field['bundles'] as $entity_type => $bundles) {
$bundle_strs += $bundles;
}
$result[$field_name] = array(
'field-name' => $field_name,
'type' => $field['type'],
'bundle' => $bundle_strs,
);
}
break;
case 'types':
drush_hide_output_fields(array('field-name', 'type', 'bundle'));
$info = field_info_field_types();
module_load_include('inc', 'field_ui', 'field_ui.admin');
$widgets = field_info_widget_types();
foreach ($info as $type_name => $type) {
$widgets = field_ui_widget_type_options($type_name);
$result[$type_name] = array(
'type-name' => $type_name,
'widget' => $type['default_widget'],
'widgets' => $widgets,
);
}
break;
default:
return drush_set_error('DRUSH_FIELD_INVALID_SELECTION', dt("Argument for drush field-info must be 'fields' or 'types'"));
}

return $result;
}

Аватар пользователя univerico univerico 31 мая 2018 в 11:36

Удалось найти способ полностью создавать поле через drush.
Чтобы добавить возможность указывать и метку при создании, необходимо в файле contributions/drush/commands/core/field.drush.inc

Исправить

// Iterate over each field spec.
  foreach ($args as $string) {
    list($name, $type, $widget) = explode(',', $string);
    $info = field_info_field($name);
    if (empty($info)) {
      // Field does not exist already. Create it.
      $field = array(
        'field_name' => $name,
        'type' => $type,
      );
      drush_op('field_create_field', $field);
    }

а точнее
list($name, $type, $widget)

на

 list($name, $label, $type, $widget)

Остается открытым только вопрос, как еще добавить перевод метки в частности в случае использования для перевода поля entity translation?

Нужно в списке еще одну переменную перечислить? Если переменную, то это та же переменная будет, но с уточнениями или для другая?

Аватар пользователя univerico univerico 31 мая 2018 в 22:37

Вот кстати нашелся пэтч для включения перевода поля
https://www.drupal.org/project/entity_translation/issues/1800530

https://www.drupal.org/files/issues/entity_translation-field_translation...

я на основании него предполагаю, что можно попробовать с помощью переменной
$field_name
как-то еще создать отдельные переменные для метки каждого языка или еще что-то подобное в этом направлении.

Как Вы думаете, как это проще будет сделать?

Этот часть самого пэтч
Вот часть пэтча

 function entity_translation_translatable_form($form, &$form_state, $field_name) {
@@ -497,19 +497,26 @@ function entity_translation_translatable_form_submit($form, $form_state) {
     return;
   }
 
+  entity_translation_translatable_batch_setup(!$translatable, $field_name, $copy_all_languages);
+}
Аватар пользователя univerico univerico 5 июня 2018 в 18:42

Если drush общий на сервере на хостинге установлен ранее был, то там могут быть закрыты права для редактирования, тогда нужно будет добавить еще drush для своего аккаунта.
В службе поддержки it-patrol мне подсказали, что если на сервере версия php 5.3, то можно установить только Драш 7 (не 8).
Но расположение файла field.drush.inc может быть другим,
не
contributions/drush/commands/core/field.drush.inc
а
например ~/.composer/vendor/drush/drush/commands/core.

Также можно будет создать алис для этого второго драш.
Драш можно будет вызывать другой командой, например, drush7.

Для этого нужно будет прописать алиас в файл .bashrc.

Аватар пользователя univerico univerico 7 июня 2018 в 16:48

Для того, чтобы при создании поля через драш указывать имя а не только машинное имя удалось отредактировать файл field.drush.inc
Предполагалось, что будет создаваться поле с именем по команде drush field-create с добавлением [field-label]

drush field-create [content-type] [field-machine-name],[field-label],[field-type],[field-widget-type]

например, drush field-create content_type machname,mylabel,text,text_textfield

Если ввести такую команду до редактирования field.drush.inc, то mylabel будет воспринят как type а не как label и будет сообщение
FieldException: Попытка создания поля неизвестного типа mylabel. в функции field_create_field() (строка 110 в файле .../modules/field/field.crud.inc).

После редактирования field.drush.inc по инструкции поле создается, но в UI все равно отображается везде вместо метки машинное имя (как проверить записалась ли метка где-то в бд или в коде я пока не знаю)

Скриншот добавляю к теме
Также в процессе в файлах встретилась следующая информация (это к теме добавления перевода метки через консоль)
Fields natively implement multilingual support, and all fields use the
* following structure:
* @code
* $entity->{$field_name}[$langcode][$delta][$column_name]
* @endcode
* Every field can hold a single or multiple value for each language belonging
* to the available languages set:
* - For untranslatable fields this set only contains LANGUAGE_NONE.
* - For translatable fields this set can contain any language code. By default
* it is the list returned by field_content_languages(), which contains all
* installed languages with the addition of LANGUAGE_NONE. This default can be
* altered by modules implementing hook_field_available_languages_alter().
*

- field_name (string): The name of the field. Each field name is unique
* within Field API. When a field is attached to an entity, the field's data
* is stored in $entity->$field_name. Maximum length is 32 characters.