Здравствуйте! Пытаюсь найти способ ускорить работу с типами материалов и полями (чтобы не создавать одни и те же типы матералов на разных сайтах заново, например). Специальных команд для создания типов материалов через 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.png | 98.45 КБ |
2017-12-05_12-07-28.png | 85.08 КБ |
Комментарии
В восьмёрке это решено конфигами. В семёрке с этим хорошо справляются Features и Bundle Clone.
А как посмотреть названия типов виджетов, чтобы их указывать в команде drush field-create?
В справке по команде drush field-info types есть только дефолтные. Может какой-то файл открыть drush и там поискать?
Или это в ядре или модулях Друпала прописано? Комнада drush field работает только из директории сайта у меня, поэтому наверное нужно искать в ядре и модулях Друпал? Features буду использовать, когда нужно перенести весь функционал и в неизменном виде, а еcли только поля добавлять однотипные, но не идентичные полностью, то удобнее с drush. Не могу найти основной форум по Drush (сам проект теперь на github, а форум ?)
Именно по этой причине в своё время я отказался от этой затеи.
Ясно. Спасибо.
Тогда пока искать не буду пробовать. Включу анлийский как язык по умолчанию, посмотрю названия в открывающихся диалогах в drush, предлагаемые к выбору, и попробую по ним наугад методом подбора самые частые вычислить названия виджетов для команд drush.
Если что-то получится вычислить, то напишу.
Как вариант, через module_implements можно получить все имплементации hook_field_widget_info и тогда будет ясно, где смотреть, какие названия виджетов есть на сайте.
Спасибо. Если удастся разобраться с module_implements, попробую такой способ.
Удалось найти например
В 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 или это просто название проекта и я не там смотрю?
Можешь посмотреть в чем ошибка?
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)
А если попробовать не через drush, а в какой-то файл добавлять строчки о новых полях через комнадную строку просто и/или если потребуется в базу данных?
Спасибо изучу. Особенно Features. Bundle Clone больше именно для копии, но покапаюсь с ним, может получится и менять что-то при клонировании.
И все же ищу еще варианты, чтобы не через ui это делать.
Посмотрите реализацию стандартного профиля, напишите свою drush-команду (или просто скрипт) по аналогии.
Спасибо. Если готовых решений не найдется, буду рассматривать такой вариант.
Пробую создавать через druhs, очень удобно
Пример как получается при вводе "drush field-create mytest city,text,text_textfield" на скриншоте.
Но пока не удалось найти, как отдельно вводить машинное имя и метку, как менять виджет (сам списко пока не могу найи) и возможно ли добавлять переводы полей через drush.
Скриншот почему-то не прикрепился файлом и изображением, прикрепляю в теме второй файл
Пока удалось найти файл, ? в котором, возможно, частично прописан вывод таблицы справочной по команде 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;
}
Хотя у меня уже предположение, что для некоторых модулей, которые добавлены вручную 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
все равно создается виджет по умолчанию
Пока удалось найти файл, ? в котором, возможно, частично прописан вывод таблицы справочной по команде 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;
}
Удалось найти способ полностью создавать поле через drush.
Чтобы добавить возможность указывать и метку при создании, необходимо в файле contributions/drush/commands/core/field.drush.inc
Исправить
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?
Нужно в списке еще одну переменную перечислить? Если переменную, то это та же переменная будет, но с уточнениями или для другая?
Вот кстати нашелся пэтч для включения перевода поля
https://www.drupal.org/project/entity_translation/issues/1800530
https://www.drupal.org/files/issues/entity_translation-field_translation...
я на основании него предполагаю, что можно попробовать с помощью переменной
$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);
+}
Если 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.
Для того, чтобы при создании поля через драш указывать имя а не только машинное имя удалось отредактировать файл 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.