/** * Get the value of a Multiple Column List field for a specific column. * * @since 1.14 * * @see GF_Field_List::get_value_entry_detail() * * @param GF_Field_List $field Gravity Forms field * @param string|array $field_value Serialized or unserialized array value for the field * @param int|string $column_id The numeric key of the column (0-index) or the label of the column * @param string $format If set to 'raw', return an array of values for the column. Otherwise, allow Gravity Forms to render using `html` or `text` * * @return array|string|null Returns null if the $field_value passed wasn't an array or serialized array */ public static function column_value(GF_Field_List $field, $field_value, $column_id = 0, $format = 'html') { $list_rows = maybe_unserialize($field_value); if (!is_array($list_rows)) { do_action('gravityview_log_error', __METHOD__ . ' - $field_value did not unserialize', $field_value); return null; } $column_values = array(); // Each list row foreach ($list_rows as $list_row) { $current_column = 0; foreach ($list_row as $column_key => $column_value) { // If the label of the column matches $column_id, or the numeric key value matches, add the value if ((string) $column_key === (string) $column_id || is_numeric($column_id) && (int) $column_id === $current_column) { $column_values[] = $column_value; } $current_column++; } } // Return the array of values if ('raw' === $format) { return $column_values; } else { return $field->get_value_entry_detail(serialize($column_values), '', false, $format); } }
public function get_field_input($form, $value = '', $entry = null) { $form_id = $form['id']; $is_entry_detail = $this->is_entry_detail(); $is_form_editor = $this->is_form_editor(); $disabled_text = $is_form_editor ? 'disabled="disabled"' : ''; if (!empty($value)) { $value = maybe_unserialize($value); } if (!is_array($value)) { $value = array(array()); } $has_columns = is_array($this->choices); $columns = $has_columns ? $this->choices : array(array()); $shim_style = is_rtl() ? 'position:absolute;left:999em;' : 'position:absolute;left:-999em;'; $label_target_shim = sprintf('<input type=\'text\' id=\'input_%1$s_%2$s_shim\' style=\'%3$s\' onfocus=\'jQuery( "#field_%1$s_%2$s table tr td:first-child input" ).focus();\' />', $form_id, $this->id, $shim_style); $list = ''; if (!self::$_style_block_printed) { //This style block needs to be inline so that the list field continues to work even if the option to turn off CSS output is activated $list .= '<style type="text/css"> body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons { vertical-align: middle !important; } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item, body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item { background-color: transparent !important; background-position: 0 0; background-size: 16px 16px !important; background-repeat: no-repeat; border: none !important; width: 16px !important; height: 16px !important; opacity: 0.5; transition: opacity .5s ease-out; -moz-transition: opacity .5s ease-out; -webkit-transition: opacity .5s ease-out; -o-transition: opacity .5s ease-out; } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item:hover, body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item:hover { opacity: 1.0; } </style>'; self::$_style_block_printed = true; } $list .= "<div class='ginput_container ginput_container_list ginput_list'>" . $label_target_shim . "<table class='gfield_list gfield_list_container'>"; $class_attr = ''; if ($has_columns) { $list .= '<colgroup>'; for ($colnum = 1; $colnum <= count($columns) + 1; $colnum++) { $odd_even = $colnum % 2 == 0 ? 'even' : 'odd'; $list .= sprintf("<col id='gfield_list_%d_col_%d' class='gfield_list_col_%s' />", $this->id, $colnum, $odd_even); } $list .= '</colgroup>'; $list .= '<thead><tr>'; foreach ($columns as $column) { $list .= '<th>' . esc_html($column['text']) . '</th>'; } $list .= '<th> </th></tr></thead>'; } else { $list .= '<colgroup>' . "<col id='gfield_list_{$this->id}_col1' class='gfield_list_col_odd' />" . "<col id='gfield_list_{$this->id}_col2' class='gfield_list_col_even' />" . '</colgroup>'; } $delete_display = count($value) == 1 ? 'visibility:hidden;' : ''; $maxRow = intval($this->maxRows); $disabled_icon_class = !empty($maxRow) && count($value) >= $maxRow ? 'gfield_icon_disabled' : ''; $add_icon = !empty($this->addIconUrl) ? $this->addIconUrl : GFCommon::get_base_url() . '/images/list-add.svg'; $delete_icon = !empty($this->deleteIconUrl) ? $this->deleteIconUrl : GFCommon::get_base_url() . '/images/list-remove.svg'; $add_events = $is_form_editor ? '' : "onclick='gformAddListItem(this, {$maxRow})' onkeypress='gformAddListItem(this, {$maxRow})'"; $delete_events = $is_form_editor ? '' : "onclick='gformDeleteListItem(this, {$maxRow})' onkeypress='gformDeleteListItem(this, {$maxRow})'"; $list .= '<tbody>'; $rownum = 1; foreach ($value as $item) { $odd_even = $rownum % 2 == 0 ? 'even' : 'odd'; $list .= "<tr class='gfield_list_row_{$odd_even} gfield_list_group'>"; $colnum = 1; foreach ($columns as $column) { $data_label = ''; //getting value. taking into account columns being added/removed from form meta if (is_array($item)) { if ($has_columns) { $val = rgar($item, $column['text']); $data_label = "data-label='" . esc_attr($column['text']) . "'"; } else { $vals = array_values($item); $val = rgar($vals, 0); } } else { $val = $colnum == 1 ? $item : ''; } $list .= "<td class='gfield_list_cell gfield_list_{$this->id}_cell{$colnum}' {$data_label}>" . $this->get_list_input($has_columns, $column, $val, $form_id) . '</td>'; $colnum++; } if ($this->maxRows != 1) { // can't replace these icons with the webfont versions since they appear on the front end. $list .= "<td class='gfield_list_icons'>"; $list .= " <img src='{$add_icon}' class='add_list_item {$disabled_icon_class}' {$disabled_text} title='" . esc_attr__('Add another row', 'gravityforms') . "' alt='" . esc_attr__('Add a new row', 'gravityforms') . "' {$add_events} style='cursor:pointer;' " . $this->get_tabindex() . "/>" . " <img src='{$delete_icon}' class='delete_list_item' {$disabled_text} title='" . esc_attr__('Remove this row', 'gravityforms') . "' alt='" . esc_attr__('Remove this row', 'gravityforms') . "' {$delete_events} style='cursor:pointer; {$delete_display}' " . $this->get_tabindex() . "/>"; $list .= '</td>'; } $list .= '</tr>'; if (!empty($maxRow) && $rownum >= $maxRow) { break; } $rownum++; } $list .= '</tbody>'; $list .= '</table></div>'; return $list; }
public function get_field_input($form, $value = '', $entry = null) { $form_id = $form['id']; $is_entry_detail = $this->is_entry_detail(); $is_form_editor = $this->is_form_editor(); $disabled_text = $is_form_editor ? 'disabled="disabled"' : ''; if (!empty($value)) { $value = maybe_unserialize($value); } if (!is_array($value)) { $value = array(array()); } $has_columns = is_array($this->choices); $columns = $has_columns ? $this->choices : array(array()); $shim_style = is_rtl() ? 'position:absolute;left:999em;' : 'position:absolute;left:-999em;'; $label_target_shim = sprintf('<input type=\'text\' id=\'input_%1$s_%2$s_shim\' style=\'%3$s\' onfocus=\'jQuery( "#field_%1$s_%2$s table tr td:first-child input" ).focus();\' />', $form_id, $this->id, $shim_style); $list = ''; if (!self::$_style_block_printed) { //This style block needs to be inline so that the list field continues to work even if the option to turn off CSS output is activated $list .= '<style type="text/css"> body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item[src$="plugins/gravityforms/images/blankspace.png"], body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item[src$="plugins/gravityforms/images/blankspace.png"] { background-color: transparent !important; background-position: 0 0; background-size: 16px 16px !important; background-repeat: no-repeat; border: none !important; width: 16px !important; height: 16px !important; vertical-align: middle !important; opacity: 0.5; } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item, body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item { width: 16px; height: 16px; vertical-align: middle !important; opacity: 0.5; } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item[src$="plugins/gravityforms/images/blankspace.png"] { background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxnIGlkPSJpY29tb29uLWlnbm9yZSI+PC9nPjxwYXRoIGQ9Ik0yNTYgNTEyYy0xNDEuMzc1IDAtMjU2LTExNC42MDktMjU2LTI1NnMxMTQuNjI1LTI1NiAyNTYtMjU2YzE0MS4zOTEgMCAyNTYgMTE0LjYwOSAyNTYgMjU2cy0xMTQuNjA5IDI1Ni0yNTYgMjU2ek0yNTYgNjRjLTEwNi4wMzEgMC0xOTIgODUuOTY5LTE5MiAxOTJzODUuOTY5IDE5MiAxOTIgMTkyYzEwNi4wNDcgMCAxOTItODUuOTY5IDE5Mi0xOTJzLTg1Ljk1My0xOTItMTkyLTE5MnpNMjg4IDM4NGgtNjR2LTk2aC05NnYtNjRoOTZ2LTk2aDY0djk2aDk2djY0aC05NnY5NnoiPjwvcGF0aD48L3N2Zz4="); } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item[src$="plugins/gravityforms/images/blankspace.png"] { background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxnIGlkPSJpY29tb29uLWlnbm9yZSI+PC9nPjxwYXRoIGQ9Ik0yNTYgMGMtMTQxLjM3NSAwLTI1NiAxMTQuNjI1LTI1NiAyNTYgMCAxNDEuMzkxIDExNC42MjUgMjU2IDI1NiAyNTYgMTQxLjM5MSAwIDI1Ni0xMTQuNjA5IDI1Ni0yNTYgMC0xNDEuMzc1LTExNC42MDktMjU2LTI1Ni0yNTZ6TTI1NiA0NDhjLTEwNi4wMzEgMC0xOTItODUuOTY5LTE5Mi0xOTJzODUuOTY5LTE5MiAxOTItMTkyYzEwNi4wNDcgMCAxOTIgODUuOTY5IDE5MiAxOTJzLTg1Ljk1MyAxOTItMTkyIDE5MnpNMTI4IDI4OGgyNTZ2LTY0aC0yNTZ2NjR6Ij48L3BhdGg+PC9zdmc+"); } body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.add_list_item:hover, body .ginput_container_list table.gfield_list tbody tr td.gfield_list_icons img.delete_list_item:hover { opacity: 1.0; } </style>'; self::$_style_block_printed = true; } $list .= "<div class='ginput_container ginput_container_list ginput_list'>" . $label_target_shim . "<table class='gfield_list gfield_list_container'>"; $class_attr = ''; if ($has_columns) { $list .= '<colgroup>'; for ($colnum = 1; $colnum <= count($columns) + 1; $colnum++) { $odd_even = $colnum % 2 == 0 ? 'even' : 'odd'; $list .= sprintf("<col id='gfield_list_%d_col_%d' class='gfield_list_col_%s' />", $this->id, $colnum, $odd_even); } $list .= '</colgroup>'; $list .= '<thead><tr>'; foreach ($columns as $column) { $list .= '<th>' . esc_html($column['text']) . '</th>'; } $list .= '<th> </th></tr></thead>'; } else { $list .= '<colgroup>' . "<col id='gfield_list_{$this->id}_col1' class='gfield_list_col_odd' />" . "<col id='gfield_list_{$this->id}_col2' class='gfield_list_col_even' />" . '</colgroup>'; } $delete_display = count($value) == 1 ? 'visibility:hidden;' : ''; $maxRow = intval($this->maxRows); $disabled_icon_class = !empty($maxRow) && count($value) >= $maxRow ? 'gfield_icon_disabled' : ''; $add_icon = !empty($this->addIconUrl) ? $this->addIconUrl : GFCommon::get_base_url() . '/images/blankspace.png'; $delete_icon = !empty($this->deleteIconUrl) ? $this->deleteIconUrl : GFCommon::get_base_url() . '/images/blankspace.png'; $add_events = $is_form_editor ? '' : "onclick='gformAddListItem(this, {$maxRow})' onkeypress='gformAddListItem(this, {$maxRow})'"; $delete_events = $is_form_editor ? '' : "onclick='gformDeleteListItem(this, {$maxRow})' onkeypress='gformDeleteListItem(this, {$maxRow})'"; $list .= '<tbody>'; $rownum = 1; foreach ($value as $item) { $odd_even = $rownum % 2 == 0 ? 'even' : 'odd'; $list .= "<tr class='gfield_list_row_{$odd_even} gfield_list_group'>"; $colnum = 1; foreach ($columns as $column) { $data_label = ''; //getting value. taking into account columns being added/removed from form meta if (is_array($item)) { if ($has_columns) { $val = rgar($item, $column['text']); $data_label = "data-label='" . esc_attr($column['text']) . "'"; } else { $vals = array_values($item); $val = rgar($vals, 0); } } else { $val = $colnum == 1 ? $item : ''; } $list .= "<td class='gfield_list_cell gfield_list_{$this->id}_cell{$colnum}' {$data_label}>" . $this->get_list_input($has_columns, $column, $val, $form_id) . '</td>'; $colnum++; } if ($this->maxRows != 1) { // can't replace these icons with the webfont versions since they appear on the front end. $list .= "<td class='gfield_list_icons'>"; $list .= " <img src='{$add_icon}' class='add_list_item {$disabled_icon_class}' {$disabled_text} title='" . esc_attr__('Add another row', 'gravityforms') . "' alt='" . esc_attr__('Add a row', 'gravityforms') . "' {$add_events} style='cursor:pointer; margin:0 3px;' " . $this->get_tabindex() . "/>" . " <img src='{$delete_icon}' class='delete_list_item' {$disabled_text} title='" . esc_attr__('Remove this row', 'gravityforms') . "' alt='" . esc_attr__('Remove this row', 'gravityforms') . "' {$delete_events} style='cursor:pointer; {$delete_display}' " . $this->get_tabindex() . "/>"; $list .= '</td>'; } $list .= '</tr>'; if (!empty($maxRow) && $rownum >= $maxRow) { break; } $rownum++; } $list .= '</tbody>'; $list .= '</table></div>'; return $list; }