first draft of custom materio showroom location, recording values DOESN'T WORK
This commit is contained in:
parent
b26db27098
commit
597e6c9159
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Install, update, and uninstall functions for the field_example module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_schema().
|
||||||
|
*
|
||||||
|
* Defines the database schema of the field, using the format used by the
|
||||||
|
* Schema API.
|
||||||
|
*
|
||||||
|
* The data we will store here is just one 7-character element, even
|
||||||
|
* though the widget presents the three portions separately.
|
||||||
|
*
|
||||||
|
* All implementations of hook_field_schema() must be in the module's
|
||||||
|
* .install file.
|
||||||
|
*
|
||||||
|
* @see http://drupal.org/node/146939
|
||||||
|
* @see schemaapi
|
||||||
|
* @see hook_field_schema()
|
||||||
|
* @ingroup field_example
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_schema($field) {
|
||||||
|
$columns = array(
|
||||||
|
'showroom_tid' => array('type' => 'int', 'not null' => FALSE),
|
||||||
|
'location' => array('type' => 'varchar', 'length' => 10, 'not null' => TRUE),
|
||||||
|
);
|
||||||
|
$indexes = array(
|
||||||
|
'location' => array('location'),
|
||||||
|
);
|
||||||
|
return array(
|
||||||
|
'columns' => $columns,
|
||||||
|
'indexes' => $indexes,
|
||||||
|
);
|
||||||
|
}
|
@ -1,28 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements hook_init().
|
|
||||||
*/
|
|
||||||
// function materio_showroom_init() {
|
|
||||||
// drupal_add_js(drupal_get_path('module', 'materio_showroom').'/js/materio_showroom.js');
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements hook_permission().
|
|
||||||
*/
|
|
||||||
// function materio_showroom_permission() {
|
|
||||||
// $perms = array(
|
|
||||||
// 'add showroom localisation' => array(
|
|
||||||
// 'title' => t('add showroom localisation'),
|
|
||||||
// 'description' => t('add showroom localisation'),
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// return $perms;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Acts on a field collection item being inserted or updated.
|
* Acts on a field collection item being inserted or updated.
|
||||||
*
|
*
|
||||||
@ -46,13 +23,14 @@ function materio_showroom_entity_presave($entity, $type) {
|
|||||||
$user_showroom = $user->field_showroom[LANGUAGE_NONE][0]['tid'];
|
$user_showroom = $user->field_showroom[LANGUAGE_NONE][0]['tid'];
|
||||||
// dsm($user_showroom);
|
// dsm($user_showroom);
|
||||||
|
|
||||||
foreach ($entity->field_showroom_localisation_loca[LANGUAGE_NONE] as $i => $loca) {
|
|
||||||
if(empty($entity->field_showroom_localisation_show)){
|
if(empty($entity->field_showroom_localisation_show)){
|
||||||
$entity->field_showroom_localisation_show[LANGUAGE_NONE] = [];
|
$entity->field_showroom_localisation_show[LANGUAGE_NONE] = [];
|
||||||
}
|
}
|
||||||
if(empty($entity->field_showroom_localisation_show[LANGUAGE_NONE])){
|
|
||||||
$entity->field_showroom_localisation_show[LANGUAGE_NONE][] = [];
|
foreach ($entity->field_showroom_localisation_loca[LANGUAGE_NONE] as $i => $loca) {
|
||||||
}
|
// if(empty($entity->field_showroom_localisation_show[LANGUAGE_NONE])){
|
||||||
|
$entity->field_showroom_localisation_show[LANGUAGE_NONE][] = array('tid'=>'');
|
||||||
|
// }
|
||||||
dsm($entity->field_showroom_localisation_show);
|
dsm($entity->field_showroom_localisation_show);
|
||||||
|
|
||||||
if(!isset($entity->original->field_showroom_localisation_show[LANGUAGE_NONE][$i]['tid'])){
|
if(!isset($entity->original->field_showroom_localisation_show[LANGUAGE_NONE][$i]['tid'])){
|
||||||
@ -68,19 +46,318 @@ function materio_showroom_entity_presave($entity, $type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// function materio_showroom_entity_load($entities, $type) {
|
||||||
|
// dsm($type);
|
||||||
|
// if($type == 'node'){
|
||||||
|
// dsm($entities);
|
||||||
|
// }
|
||||||
|
// foreach ($entities as $entity) {
|
||||||
|
// $entity->foo = mymodule_add_something($entity, $type);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO: alter entity translation field permission with field_permission
|
||||||
|
|
||||||
|
// __ __ _ _______ __ __
|
||||||
|
// / / ____ _________ _/ /_(_)___ ____ / ____(_)__ / /___/ /
|
||||||
|
// / / / __ \/ ___/ __ `/ __/ / __ \/ __ \ / /_ / / _ \/ / __ /
|
||||||
|
// / /___/ /_/ / /__/ /_/ / /_/ / /_/ / / / / / __/ / / __/ / /_/ /
|
||||||
|
// /_____/\____/\___/\__,_/\__/_/\____/_/ /_/ /_/ /_/\___/_/\__,_/
|
||||||
|
|
||||||
|
// TODO: create own location field
|
||||||
|
/**
|
||||||
|
* Implements hook_field_info().
|
||||||
|
*
|
||||||
|
* Provides the description of the field.
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_info() {
|
||||||
|
return array(
|
||||||
|
// We name our field as the associative name of the array.
|
||||||
|
'field_materio_showroom_location' => array(
|
||||||
|
'label' => t('Showroom Location'),
|
||||||
|
'description' => t('Define material location by showroom'),
|
||||||
|
'default_widget' => 'materio_showroom_location_text',
|
||||||
|
'default_formatter' => 'materio_showroom_location_simple_text',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: define in settings wich vocabulary is for showrooms
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements hook_form_alter().
|
* Implements hook_field_validate().
|
||||||
|
*
|
||||||
|
* This hook gives us a chance to validate content that's in our
|
||||||
|
* field. We're really only interested in the $items parameter, since
|
||||||
|
* it holds arrays representing content in the field we've defined.
|
||||||
|
* We want to verify that the items only contain RGB hex values like
|
||||||
|
* this: #RRGGBB. If the item validates, we do nothing. If it doesn't
|
||||||
|
* validate, we add our own error notification to the $errors parameter.
|
||||||
|
*
|
||||||
|
* @see field_example_field_widget_error()
|
||||||
*/
|
*/
|
||||||
// function materio_showroom_form_alter(&$form, &$form_state, $form_id) {
|
function materio_showroom_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
|
||||||
// // dsm($form_id);
|
foreach ($items as $delta => $item) {
|
||||||
// if( $form_id == "materiau_node_form" ){
|
// if (!empty($item['rgb'])) {
|
||||||
// dsm($form);
|
// if (!preg_match('@^#[0-9a-f]{6}$@', $item['rgb'])) {
|
||||||
// // $form['account']['pass']['#type'] = 'password';
|
// $errors[$field['field_name']][$langcode][$delta][] = array(
|
||||||
// // $form['account']['pass']['#title'] = t('Password');
|
// 'error' => 'field_example_invalid',
|
||||||
// //
|
// 'message' => t('Color must be in the HTML format #abcdef.'),
|
||||||
// // $form['actions']['#type'] = "container";
|
// );
|
||||||
// // $form['actions']['submit']['#value'] = t('Join');
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_is_empty().
|
||||||
|
*
|
||||||
|
* hook_field_is_empty() is where Drupal asks us if this field is empty.
|
||||||
|
* Return TRUE if it does not contain data, FALSE if it does. This lets
|
||||||
|
* the form API flag an error when required fields are empty.
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_is_empty($item, $field) {
|
||||||
|
return empty($item['location']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ______ __
|
||||||
|
// / ____/___ _________ ___ ____ _/ /____ __________
|
||||||
|
// / /_ / __ \/ ___/ __ `__ \/ __ `/ __/ _ \/ ___/ ___/
|
||||||
|
// / __/ / /_/ / / / / / / / / /_/ / /_/ __/ / (__ )
|
||||||
|
// /_/ \____/_/ /_/ /_/ /_/\__,_/\__/\___/_/ /____/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_formatter_info().
|
||||||
|
*
|
||||||
|
* We need to tell Drupal that we have two different types of formatters
|
||||||
|
* for this field. One will change the text color, and the other will
|
||||||
|
* change the background color.
|
||||||
|
*
|
||||||
|
* @see field_example_field_formatter_view()
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_formatter_info() {
|
||||||
|
return array(
|
||||||
|
// This formatter just displays the hex value in the color indicated.
|
||||||
|
'materio_showroom_location_simple_text' => array(
|
||||||
|
'label' => t('Simple text-based formatter'),
|
||||||
|
'field types' => array('field_example_rgb'),
|
||||||
|
),
|
||||||
|
// This formatter changes the background color of the content region.
|
||||||
|
// 'field_example_color_background' => array(
|
||||||
|
// 'label' => t('Change the background of the output text'),
|
||||||
|
// 'field types' => array('field_example_rgb'),
|
||||||
|
// ),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_formatter_view().
|
||||||
|
*
|
||||||
|
* Two formatters are implemented.
|
||||||
|
* - field_example_simple_text just outputs markup indicating the color that
|
||||||
|
* was entered and uses an inline style to set the text color to that value.
|
||||||
|
* - field_example_color_background does the same but also changes the
|
||||||
|
* background color of div.region-content.
|
||||||
|
*
|
||||||
|
* @see field_example_field_formatter_info()
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
|
||||||
|
$element = array();
|
||||||
|
|
||||||
|
switch ($display['type']) {
|
||||||
|
// This formatter simply outputs the field as text and with a color.
|
||||||
|
case 'materio_showroom_location_simple_text':
|
||||||
|
foreach ($items as $delta => $item) {
|
||||||
|
$element[$delta] = array(
|
||||||
|
// We create a render array to produce the desired markup,
|
||||||
|
// "<p style="color: #hexcolor">The color code ... #hexcolor</p>".
|
||||||
|
// See theme_html_tag().
|
||||||
|
'#type' => 'html_tag',
|
||||||
|
'#tag' => 'p',
|
||||||
|
// '#attributes' => array(
|
||||||
|
// 'style' => 'color: ' . $item['rgb'],
|
||||||
|
// ),
|
||||||
|
'#value' => t('@loc', array('@loc' => $item['location'])),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// This formatter adds css to the page changing the '.region-content' area's
|
||||||
|
// background color. If there are many fields, the last one will win.
|
||||||
|
// case 'field_example_color_background':
|
||||||
|
// foreach ($items as $delta => $item) {
|
||||||
|
// $element[$delta] = array(
|
||||||
|
// '#type' => 'html_tag',
|
||||||
|
// '#tag' => 'p',
|
||||||
|
// '#value' => t('The content area color has been changed to @code', array('@code' => $item['rgb'])),
|
||||||
|
// '#attached' => array(
|
||||||
|
// 'css' => array(
|
||||||
|
// array(
|
||||||
|
// 'data' => 'div.region-content { background-color:' . $item['rgb'] . ';}',
|
||||||
|
// 'type' => 'inline',
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
// _ ___ __ __
|
||||||
|
// | | / (_)___/ /___ ____ / /______
|
||||||
|
// | | /| / / / __ / __ `/ _ \/ __/ ___/
|
||||||
|
// | |/ |/ / / /_/ / /_/ / __/ /_(__ )
|
||||||
|
// |__/|__/_/\__,_/\__, /\___/\__/____/
|
||||||
|
// /____/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_widget_info().
|
||||||
|
*
|
||||||
|
* Three widgets are provided.
|
||||||
|
* - A simple text-only widget where the user enters the '#ffffff'.
|
||||||
|
* - A 3-textfield widget that gathers the red, green, and blue values
|
||||||
|
* separately.
|
||||||
|
* - A farbtastic colorpicker widget that chooses the value graphically.
|
||||||
|
*
|
||||||
|
* These widget types will eventually show up in hook_field_widget_form,
|
||||||
|
* where we will have to flesh them out.
|
||||||
|
*
|
||||||
|
* @see field_example_field_widget_form()
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_widget_info() {
|
||||||
|
return array(
|
||||||
|
'materio_showroom_location_text' => array(
|
||||||
|
'label' => t('Location as text'),
|
||||||
|
'field types' => array('field_materio_showroom_location'),
|
||||||
|
),
|
||||||
|
// 'field_example_3text' => array(
|
||||||
|
// 'label' => t('RGB text field'),
|
||||||
|
// 'field types' => array('field_example_rgb'),
|
||||||
|
// ),
|
||||||
|
// 'field_example_colorpicker' => array(
|
||||||
|
// 'label' => t('Color Picker'),
|
||||||
|
// 'field types' => array('field_example_rgb'),
|
||||||
|
// ),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_widget_form().
|
||||||
|
*
|
||||||
|
* hook_widget_form() is where Drupal tells us to create form elements for
|
||||||
|
* our field's widget.
|
||||||
|
*
|
||||||
|
* We provide one of three different forms, depending on the widget type of
|
||||||
|
* the Form API item provided.
|
||||||
|
*
|
||||||
|
* The 'field_example_colorpicker' and 'field_example_text' are essentially
|
||||||
|
* the same, but field_example_colorpicker adds a javascript colorpicker
|
||||||
|
* helper.
|
||||||
|
*
|
||||||
|
* field_example_3text displays three text fields, one each for red, green,
|
||||||
|
* and blue. However, the field type defines a single text column,
|
||||||
|
* rgb, which needs an HTML color spec. Define an element validate
|
||||||
|
* handler that converts our r, g, and b fields into a simulated single
|
||||||
|
* 'rgb' form element.
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
|
||||||
|
$locval = isset($items[$delta]['location']) ? $items[$delta]['location'] : '';
|
||||||
|
|
||||||
|
global $user;
|
||||||
|
$user = user_load($user->uid); // Make sure the user object is fully loaded
|
||||||
|
// dsm($user, 'user');
|
||||||
|
|
||||||
|
$showroom_tid = $user->field_showroom[LANGUAGE_NONE][0]['tid'];
|
||||||
|
// dsm($user_showroom);
|
||||||
|
$showroom_term = taxonomy_term_load($showroom_tid);
|
||||||
|
// dsm($showroom_term);
|
||||||
|
|
||||||
|
$widget = $element;
|
||||||
|
$widget['#delta'] = $delta;
|
||||||
|
|
||||||
|
|
||||||
|
switch ($instance['widget']['type']) {
|
||||||
|
// TODO: loop through showrooms and don't allow more than one field by show room
|
||||||
|
|
||||||
|
case 'materio_showroom_location_text':
|
||||||
|
|
||||||
|
$widget['showroom_tid'] = array(
|
||||||
|
'#type' => 'hidden',
|
||||||
|
'#default_value' => $showroom_tid,
|
||||||
|
// Allow a slightly larger size that the field length to allow for some
|
||||||
|
// configurations where all characters won't fit in input field.
|
||||||
|
'#size' => 10,
|
||||||
|
'#maxlength' => 10,
|
||||||
|
);
|
||||||
|
|
||||||
|
$widget['location'] = array(
|
||||||
|
'#type' => 'textfield',
|
||||||
|
'#title' => $showroom_term->name,
|
||||||
|
'#default_value' => $locval,
|
||||||
|
// Allow a slightly larger size that the field length to allow for some
|
||||||
|
// configurations where all characters won't fit in input field.
|
||||||
|
'#size' => 10,
|
||||||
|
'#maxlength' => 10,
|
||||||
|
);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$element['location'] = $widget;
|
||||||
|
return $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the individual fields and then convert to RGB string.
|
||||||
|
*/
|
||||||
|
function materio_showroom_location_text_validate($element, &$form_state) {
|
||||||
|
// @todo: Isn't there a better way to find out which element?
|
||||||
|
// $delta = $element['#delta'];
|
||||||
|
// $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
|
||||||
|
// $field_name = $field['field_name'];
|
||||||
|
// if (isset($form_state['values'][$field_name][$element['#language']][$delta]['rgb'])) {
|
||||||
|
// $values = $form_state['values'][$field_name][$element['#language']][$delta]['rgb'];
|
||||||
|
// foreach (array('r', 'g', 'b') as $colorfield) {
|
||||||
|
// $colorfield_value = hexdec($values[$colorfield]);
|
||||||
|
// // If they left any empty, we'll set the value empty and quit.
|
||||||
|
// if (strlen($values[$colorfield]) == 0) {
|
||||||
|
// form_set_value($element, '', $form_state);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// // If they gave us anything that's not hex, reject it.
|
||||||
|
// if ((strlen($values[$colorfield]) != 2) || $colorfield_value < 0 || $colorfield_value > 255) {
|
||||||
|
// form_error($element[$colorfield], t("Saturation value must be a 2-digit hexadecimal value between 00 and ff."));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// $value = sprintf('#%02s%02s%02s', $values['r'], $values['g'], $values['b']);
|
||||||
|
// form_set_value($element, $value, $form_state);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_field_widget_error().
|
||||||
|
*
|
||||||
|
* hook_field_widget_error() lets us figure out what to do with errors
|
||||||
|
* we might have generated in hook_field_validate(). Generally, we'll just
|
||||||
|
* call form_error().
|
||||||
|
*
|
||||||
|
* @see field_example_field_validate()
|
||||||
|
* @see form_error()
|
||||||
|
*/
|
||||||
|
function materio_showroom_field_widget_error($element, $error, $form, &$form_state) {
|
||||||
|
switch ($error['error']) {
|
||||||
|
case 'materio_showroom_invalid':
|
||||||
|
form_error($element, $error['message']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user