使用Entity_MetAdata_Wrapper将数据保存到自定义字段列 -- entities 领域 drupal 相关 的问题

Save data to custom field columns using entity_metadata_wrapper


5
vote

问题

中文

我有一个简单的自定义模块,可以创建一个新的字段类型。该字段在数据库中有多个列;这个想法是用户(或代码)将输入一个值,然后将该值转换为多种不同的格式并保存到数据库列。

当前,这是通过使用书Drupal 7模块开发的方法工作,其中用户的原始值是使用小部件验证功能转换的。

当人类填写形式时,它很棒;但问题是,当我尝试在代码中创建实体时,使用entity_metadata_wrapper,没有窗口小部件,因此,没有窗口小部件验证函数运行。

看起来我需要查看hook_field_info并指定具有自定义setter回调的'struct'的property_type,但我找不到任何描述如何使用属性或getter / setter回调的文档。

如何使用具有自定义字段数据库列的实体元数据包装器?

  /**  * Implements hook_field_info().  */ function device_id_field_info() {   return array(     'device_id' => array(       'label' => t('Device ID'),       'description' => t('Converts the input device ID and saves it to the          database in various formats.'),       'default_widget' => 'device_id_simple',       'default_formatter' => 'device_id_raw',       'default_token_formatter' => 'device_id_combined',       'property_type' => 'device_id',       'property_callback' => array('_device_id_property_callback'),       ),   ); }  /**  * Callback to alter the property info of device id fields.  *  * @see device_id_field_info().  */ function _device_id_property_callback(&$info, $entity_type, $field, $instance, $field_type) {   $name = $field['field_name'];   $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];    $property['type'] = ($field['cardinality'] != 1) ? 'list<deviceid>' : 'deviceid';   $property['getter callback'] = 'entity_metadata_field_verbatim_get';   $property['setter callback'] = 'entity_metadata_field_verbatim_set';   $property['property info'] = device_id_property_info();    unset($property['query callback']); }  /**  * Defines info for the properties of the device ID field data structure.  */ function device_id_property_info($name = NULL) {   // Build an array of basic property information for the device ID field.   $properties = array(     'raw_id' => array(       'label' => t('Raw input ID'),     ),     'esn_hex' => array(       'label' => t('Converted ESN in hexadecimal format'),     ),     'esn_dec' => array(       'label' => t('Converted ESN in decimal format'),     ),     'meid_hex' => array(       'label' => t('Converted MEID in hexadecimal format'),     ),     'meid_dec' => array(       'label' => t('Converted MEID in decimal format'),     ),     'imei_hex' => array(       'label' => t('Converted IMEI in hexadecimal format'),     ),     'imei_dec' => array(       'label' => t('Converted IMEI in decimal format'),     ),     'iccid_hex' => array(       'label' => t('Converted ICCID in hexadecimal format'),     ),     'iccid_dec' => array(       'label' => t('Converted ICCID in decimal format'),     ),   ); }  /**  * Implements hook_field_is_empty().  *  * Pseudo-hook.  */ function device_id_field_is_empty($item, $field) {   if ($field['type'] == 'device_id') {     if (       empty($item['raw_id']) &&       empty($item['cap_dec']) &&        empty($item['cap_hex']) &&        empty($item['meid_dec']) &&        empty($item['meid_hex']) &&        empty($item['imei_dec']) &&        empty($item['imei_hex']) &&        empty($item['iccid_dec']) &&        empty($item['iccid_hex'])) {        return TRUE;     }   }   return FALSE; }  /**  * Implements hook_field_widget_info().  */ function device_id_field_widget_info() {   return array(     'device_id_simple' => array(       'label' => t('Device ID text field'),       'description' => t(         'Allow the user to enter the device ID, and display it in          whatever format it was entered'),       'field types' => array('device_id'),       'behaviors' => array(         'multiple values' => FIELD_BEHAVIOR_DEFAULT,         'default value' => FIELD_BEHAVIOR_DEFAULT,         ),       ),     ); }  /**  * Implements hook_field_widget_form().  *  * Pseudo hook  **/ function device_id_field_widget_form(   &$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {    switch ($instance['widget']['type'] == 'device_id_simple') {      case 'device_id_simple':       $element += array(         '#element_validate' => array('_device_id_wrapper_validate'),         'device_id_wrapper' => array(           'input_id' => array(             '#title' => t('Device ID'),             '#type' => 'textfield',             '#default_value' => isset($items[$delta]['raw_id']) ?                $items[$delta]['raw_id'] : '',           ),         )       );     break;   }   return $element; }  function _device_id_wrapper_validate($element, &$form_state) {   //This function is also called when submitting the field   //configuration form.  If so, skip validation since it    //won't work anyway   if ($form_state['complete form']['#form_id'] == 'field_ui_field_edit_form') {     return;   }    $values = $form_state['values'];   $language = $element['#language'];   $field_name = $element['#field_name'];   $item = $values[$field_name][$language][$element['#delta']]['device_id_wrapper'];    foreach ($values[$field_name][$language] as $delta => $item) {     if (is_array($item)) {       if (array_key_exists('device_id_wrapper', $item)) {         $conversion = new deviceIDConversion($item['device_id_wrapper']['input_id']);         $conversion_values = $conversion->calculate();         if ($conversion_values) {           $new_values = array(             'esn_hex' => isset($conversion_values['ESN_HEX']) ? $conversion_values['ESN_HEX'] : NULL,             'esn_dec' => isset($conversion_values['ESN_DEC']) ? $conversion_values['ESN_DEC'] : NULL,             'meid_hex' => isset($conversion_values['MEID_HEX']) ? $conversion_values['MEID_HEX'] : NULL,             'meid_dec' => isset($conversion_values['MEID_DEC']) ? $conversion_values['MEID_DEC'] : NULL,             'imei_hex' => isset($conversion_values['IMEI_HEX']) ? $conversion_values['IMEI_HEX'] : NULL,             'imei_dec' => isset($conversion_values['IMEI_DEC']) ? $conversion_values['IMEI_DEC'] : NULL,             'iccid_hex' => isset($conversion_values['ICCID_HEX']) ? $conversion_values['ICCID_HEX'] : NULL,             'iccid_dec' => isset($conversion_values['ICCID_DEC']) ? $conversion_values['ICCID_DEC'] : NULL,             'raw_id' => $item['device_id_wrapper']['input_id'],             );           form_set_value($element, $new_values, $form_state);         } else {           form_set_error($field_name, t('Your device ID doesn't match a valid format.  Check             the device ID, verify it's correct, and type/scan it again.'));         }       }     }   } }  /**  * Implements hook_field_validate().  *  * Pseudo-hook.  */ function device_id_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {   foreach ($items as $delta => $item) {     if (!empty($item['raw_id'])) {       $conversion = new deviceIDConversion($item['raw_id']);       $conversion_values = $conversion->calculate();       if (!$conversion_values) {         $errors[$field['field_name']][$langcode][$delta][] = array(           'error' => 'device_id_invalid_format',           'message' => t('Your device ID doesn't match a valid format.  Check             the device ID, verify it's correct, and type/scan it again.'),         );       }      }   } }   

这里是一些示例代码,我正在使用测试页面来使用此内容;当我做Entity_load()时,我可以查看自定义字段的内容,包括在hook_info()中定义的数据库列。当我在entity_metadata_wrapper()中包装它并尝试设置字段值时,没有任何反应。此外,在包装后,即使使用getPropertyInfo(),我也无法再看到字段值。

  $ent = entity_load('node', array('2955')); $new_ent = entity_metadata_wrapper('node', $ent['2955']); $new_ent->field_device_id->meid_hex = 'a1000002747883'; $new_ent->save(); dsm($new_ent->getPropertyInfo());   
英文原文

I have a simple custom module that creates a new field type. The field has multiple columns in the database; the idea is that a user (or code) will enter a single value, and then that value is converted into several different formats and saved to the database columns.

Currently, this is working by using a method from the book Drupal 7 Module Development, where the user's original value is converted using a widget validate function.

It works great when a human is filling out a form; but the problem is, when I try to create an entity in code, using entity_metadata_wrapper, there's no widget, and thus, no widget validate function runs.

It looks like I need to look at hook_field_info and specify a property_type of 'struct' with a custom setter callback, but I can't find any documentation that describes how to use the property or getter/setter callbacks.

How can I use entity metadata wrappers with custom field database columns?

/**  * Implements hook_field_info().  */ function device_id_field_info() {   return array(     'device_id' => array(       'label' => t('Device ID'),       'description' => t('Converts the input device ID and saves it to the          database in various formats.'),       'default_widget' => 'device_id_simple',       'default_formatter' => 'device_id_raw',       'default_token_formatter' => 'device_id_combined',       'property_type' => 'device_id',       'property_callback' => array('_device_id_property_callback'),       ),   ); }  /**  * Callback to alter the property info of device id fields.  *  * @see device_id_field_info().  */ function _device_id_property_callback(&$info, $entity_type, $field, $instance, $field_type) {   $name = $field['field_name'];   $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];    $property['type'] = ($field['cardinality'] != 1) ? 'list<deviceid>' : 'deviceid';   $property['getter callback'] = 'entity_metadata_field_verbatim_get';   $property['setter callback'] = 'entity_metadata_field_verbatim_set';   $property['property info'] = device_id_property_info();    unset($property['query callback']); }  /**  * Defines info for the properties of the device ID field data structure.  */ function device_id_property_info($name = NULL) {   // Build an array of basic property information for the device ID field.   $properties = array(     'raw_id' => array(       'label' => t('Raw input ID'),     ),     'esn_hex' => array(       'label' => t('Converted ESN in hexadecimal format'),     ),     'esn_dec' => array(       'label' => t('Converted ESN in decimal format'),     ),     'meid_hex' => array(       'label' => t('Converted MEID in hexadecimal format'),     ),     'meid_dec' => array(       'label' => t('Converted MEID in decimal format'),     ),     'imei_hex' => array(       'label' => t('Converted IMEI in hexadecimal format'),     ),     'imei_dec' => array(       'label' => t('Converted IMEI in decimal format'),     ),     'iccid_hex' => array(       'label' => t('Converted ICCID in hexadecimal format'),     ),     'iccid_dec' => array(       'label' => t('Converted ICCID in decimal format'),     ),   ); }  /**  * Implements hook_field_is_empty().  *  * Pseudo-hook.  */ function device_id_field_is_empty($item, $field) {   if ($field['type'] == 'device_id') {     if (       empty($item['raw_id']) &&       empty($item['cap_dec']) &&        empty($item['cap_hex']) &&        empty($item['meid_dec']) &&        empty($item['meid_hex']) &&        empty($item['imei_dec']) &&        empty($item['imei_hex']) &&        empty($item['iccid_dec']) &&        empty($item['iccid_hex'])) {        return TRUE;     }   }   return FALSE; }  /**  * Implements hook_field_widget_info().  */ function device_id_field_widget_info() {   return array(     'device_id_simple' => array(       'label' => t('Device ID text field'),       'description' => t(         'Allow the user to enter the device ID, and display it in          whatever format it was entered'),       'field types' => array('device_id'),       'behaviors' => array(         'multiple values' => FIELD_BEHAVIOR_DEFAULT,         'default value' => FIELD_BEHAVIOR_DEFAULT,         ),       ),     ); }  /**  * Implements hook_field_widget_form().  *  * Pseudo hook  **/ function device_id_field_widget_form(   &$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {    switch ($instance['widget']['type'] == 'device_id_simple') {      case 'device_id_simple':       $element += array(         '#element_validate' => array('_device_id_wrapper_validate'),         'device_id_wrapper' => array(           'input_id' => array(             '#title' => t('Device ID'),             '#type' => 'textfield',             '#default_value' => isset($items[$delta]['raw_id']) ?                $items[$delta]['raw_id'] : '',           ),         )       );     break;   }   return $element; }  function _device_id_wrapper_validate($element, &$form_state) {   //This function is also called when submitting the field   //configuration form.  If so, skip validation since it    //won't work anyway   if ($form_state['complete form']['#form_id'] == 'field_ui_field_edit_form') {     return;   }    $values = $form_state['values'];   $language = $element['#language'];   $field_name = $element['#field_name'];   $item = $values[$field_name][$language][$element['#delta']]['device_id_wrapper'];    foreach ($values[$field_name][$language] as $delta => $item) {     if (is_array($item)) {       if (array_key_exists('device_id_wrapper', $item)) {         $conversion = new deviceIDConversion($item['device_id_wrapper']['input_id']);         $conversion_values = $conversion->calculate();         if ($conversion_values) {           $new_values = array(             'esn_hex' => isset($conversion_values['ESN_HEX']) ? $conversion_values['ESN_HEX'] : NULL,             'esn_dec' => isset($conversion_values['ESN_DEC']) ? $conversion_values['ESN_DEC'] : NULL,             'meid_hex' => isset($conversion_values['MEID_HEX']) ? $conversion_values['MEID_HEX'] : NULL,             'meid_dec' => isset($conversion_values['MEID_DEC']) ? $conversion_values['MEID_DEC'] : NULL,             'imei_hex' => isset($conversion_values['IMEI_HEX']) ? $conversion_values['IMEI_HEX'] : NULL,             'imei_dec' => isset($conversion_values['IMEI_DEC']) ? $conversion_values['IMEI_DEC'] : NULL,             'iccid_hex' => isset($conversion_values['ICCID_HEX']) ? $conversion_values['ICCID_HEX'] : NULL,             'iccid_dec' => isset($conversion_values['ICCID_DEC']) ? $conversion_values['ICCID_DEC'] : NULL,             'raw_id' => $item['device_id_wrapper']['input_id'],             );           form_set_value($element, $new_values, $form_state);         } else {           form_set_error($field_name, t('Your device ID doesn\'t match a valid format.  Check             the device ID, verify it\'s correct, and type/scan it again.'));         }       }     }   } }  /**  * Implements hook_field_validate().  *  * Pseudo-hook.  */ function device_id_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {   foreach ($items as $delta => $item) {     if (!empty($item['raw_id'])) {       $conversion = new deviceIDConversion($item['raw_id']);       $conversion_values = $conversion->calculate();       if (!$conversion_values) {         $errors[$field['field_name']][$langcode][$delta][] = array(           'error' => 'device_id_invalid_format',           'message' => t('Your device ID doesn\'t match a valid format.  Check             the device ID, verify it\'s correct, and type/scan it again.'),         );       }      }   } } 

Here is some example code I'm using in a test page to work with this content; when I do entity_load(), I can view the contents of the custom field, including the database columns I defined in hook_info(). When I wrap this in entity_metadata_wrapper() and try setting the field value, nothing happens. Also, after wrapping, I can no longer see the field values, even with getPropertyInfo().

$ent = entity_load('node', array('2955')); $new_ent = entity_metadata_wrapper('node', $ent['2955']); $new_ent->field_device_id->meid_hex = 'a1000002747883'; $new_ent->save(); dsm($new_ent->getPropertyInfo()); 
  
       
       

回答列表

0
 
vote

要从包装器中访问字段值,请尝试:

$ new_ent-&gt; field_device_id-&gt; meid_hex-&gt; value();

或整个实体: $ entity_object = $ new_ent-&gt; value();

 

To access a field value from the wrapper try:

$new_ent->field_device_id->meid_hex->value();

or for the whole entity: $entity_object = $new_ent->value();

 
 
0
 
vote

您可以尝试以下操作:

 $ node = node_load($ nid); $ wrapper = entity_metadata_wrapper('node',$ node); //  - 设置郎 $ wrapper-&gt;语言 - &gt; set('en'); //  - 设置标题 $ wrapper-&gt; title-&gt; set('test'); //  - 设置体重 $ wrapper-&gt; body-&gt; set(array'=&gt;'某些文本','format'=&gt;'full_html')); //  - 设置自定义字段 $ wrapper-&gt; your_custom_field_name-&gt; set('字段值'); $ wrapper-&gt; save(); 
 

You can try the following:

 $node = node_load($nid); $wrapper = entity_metadata_wrapper('node', $node); //- Set Lang $wrapper->language->set('en'); //- Set Title $wrapper->title->set('test'); //- Set Body Value $wrapper->body->set(array('value' => 'Some text', 'format' => 'full_html')); //- Set Custom field  $wrapper->your_custom_field_name->set('field value'); $wrapper->save(); 
 
 

相关问题

1  在安装配置文件中更改字段上的值数  ( Changing number of values on a field in installation profile ) 
我正在创建具有多个字段的安装配置文件。对于"文件" 字段,我要更改值的数量。我有两个关于这个问题。 是此字段设置还是实例设置? 更改此设置的正确方法是什么我尝试过的: 'number_values' => '2', 'max_value' => '2', 'max_values' => '2', 'values...

1  如何将文本注入文本字段的开头?  ( How to inject text into the beginning of a textfield ) 
我有一个多语言网站,只有3种语言,只有1个字段(描述)真的是多语言,其他一切都是翻译的界面和字符串。 对于描述字段,我的目标是复制WordPress的"qtranslate" 插件的功能,以便UI看起来像这样: 我几乎设法使用 fieldgroup 模块,3说明字段和语言部分模块(因为我发现没有更好的方法将每个...

0  访问视图但不是节点  ( Access the view but not the node ) 
我有一个显示项目列表的视图。如何使匿名用户看到此项目列表,但在访问节点时,它必须被记录?任何想法? 我使用最新版本的drupal ...

0  如何让用户在节点中创建自定义菜单?  ( How do i let the user create a custom menu in a node ) 
在所有页面上,有一个侧栏菜单作为节点/页面特定菜单。通常,我将创建一个实体参考字段,让用户选择菜单项。然后我使用一个视图来显示用户创建的列表。但是,此列表每页是唯一的,用户可能不希望它才能顺序我的标题或日期,它们可能需要其特定顺序。 是否有一个模块,可以允许用户选择x页数并指定所选项目的顺序? ...

1  主题多列字段的单个列  ( Theming individual column of multicolumn field ) 
我有一个多色字段,我能够将所有列作为表格显示为表格,这与魅力一样。当我想在视图中使用一个列值时,我重写字段的输出,我选择列的原始值,我可以将其显示为单个值。 我显示的单个值是一个日期字段,因此原始值是yyyy-mm-dd,我想将其格式化为mm / dd / yyyy。我尝试在没有任何运气的情况下撰写自定义格式化器。 ...

3  使用ajax以字段窗口小部件表单更新值  ( Update values using ajax in field widget form ) 
类似问题: ajax包装器替换在字段小部件表单 如何创建一个ajax字段窗口小部件 问题: get FIELD_NAME 和 DELTA 在ajax回调函数中? (见下文) 完成的内容: textfield < / code> 以窗口小部件表单(请参阅这里)在价值变化时(jQuery事...

0  如何在视图中围绕一个领域的括号放置?  ( How can i place brackets around a field in a view ) 
我想在括号之间的视图中放置一个字段的值。让我们说有2个字段"名称" 和"国家" 。如何在视图中将这些显示为 name(country)?我知道如何终止字段,但我不知道如何将括号放在第二个字段周围。 如何这样做? ...

0  排除从加载中的节点字段  ( Exclude a node field from loading ) 
我想在查看节点时从加载中排除一些节点字段。 我可以隐藏目前的字段,但我想从加载完全排除它。 我有多个字段有大约2000个记录,我不需要在节点页面上加载它。 ...

0  显示账户设置的新增字段值  ( Display newly added field value of account settings ) 
我在Configuration&amp下的帐户设置中添加了一个新的字段(名字);它的机器名称是'field_first_name' 我正在尝试在像这样的主页中加载这个值 <?php print $user->field_first_name ?> 但上面的代码不起作用。请帮忙。我调试$用户,发现此值不存...

1  如何将数据写入自定义字段  ( How to write data to a custom field ) 
我在保存数据使用Entity_Metadata_Wrapper 以及 https://drupal.org/node/2110161 ,没有人能够弄清楚。 由于Entity_Metadata_Wrapper无法编写自定义字段值,我如何手动执行此操作?我尝试过以下代码,但是当我之后查看节点时,字段值是空白的。 $f...

3  内容类型中的条件字段  ( Conditional field in content type ) 
我正在寻找一个模块或在Drupal 7中的方法,可以实现以下内容: 我的内容类型中有一个字段,称为例如。 "梯子附着" 。 它有一个选择列表,是或否。 当用户选择是的,那么我希望它填充它旁边的另一个字段,它在它"没有危险" 旁边。 当用户选择否然后我希望它填充它在它旁边的另一个字段说"危险" 。 如何完成?我尝试了条...

0  如何移动“添加新评论”链接  ( How to move add new comment link ) 
如何在我的内容类型显示中移动"添加新注释" 链接在某些项目上方移动?这是一个例子: http://www.jcpenney.com/women/fall-trend-shop/boyfriendsin-boyfriency- cartigan- / prod.jump?ppid = pp5002961049&amp;...

0  基于作者节点显示的自定义字段  ( Custom field displayed based on author node ) 
我有一个网站的广告。此外,用户将有机会将他的广告作为VIP广告。 当用户创建一个新广告时,向下波纹管将显示一个字段"制作广告vip" ,然后单击该按钮后,它将弹出描述。 此字段是用显示套件的自定义字段创建,但我希望仅在节点作者上可见。 这个想法是只有用户的创意,节点的作者可以看到该字段"使您的广告vip" 。 模...

0  在hook_field_formatter_view中使用哪些设置?  ( Which settings to use in hook field formatter view ) 
查看 hook_field_formatter_view , $display 的说明是: 要使用的显示设置,在"显示" 输入中找到的实例定义。该阵列显着包含以下键和值; 但我刚刚发现 $display 变量没有准确的信息。 这是我的 $instance (正确设置) 这是我的 $display (设置...

1  EntityForm提交处理程序与预览  ( Entityform submit handler with preview ) 
我有一个简单的实体表单并添加了一个自定义提交处理程序: $form['actions']['submit']['#submit'] = array('custom_submit','entityform_edit_form_submit'); 很好。问题是在提交之前启用表单预览时。我的 custom_sub...

1  创建以编程的字段编程方式创建节点  ( Create a node programmatically having composed field ) 
我有一个组成文件的内容类型(使用已编写的字段模块)。 如何以编组的字段值以编程方式创建节点? ...

4  是否可以在单个组件中添加多个字段?  ( Is it possible to add multiple fields within a single component ) 
$form['value'] = array( '#type' => 'textfield', '#title' => t('Webservice URL'), '#default_value' => $component['value'], ...

1  用于将特殊类型的节点安排到表中的Drupal模块|图表[关闭]  ( Drupal module for arranging nodes of special type into a tablechart ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

1  当我的模块处于活动状态时,添加自定义线项类型  ( Add a custom line item type with custom fields when my module is active ) 
我正在开发一个模块,该模块将需要自定义线项类型(点亮)以及灯光上的其他字段。使用此挂钩,我可以添加点亮。 function package_designer_commerce_line_item_type_info_alter(&$line_item_types) { $lineItemType = a...

1  如何以编程方式从现场收集中删除字段?  ( How to delete a field from field collection programmatically ) 
我正在使用drupal 7.2。我必须以编程方式从现场收集中删除一个字段。 是否有任何功能可用于删除它? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.