Skip to content

Instantly share code, notes, and snippets.

@dougblackjr
Created December 9, 2021 16:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dougblackjr/fdabd044c203cb7fb7cf746b7b7fe10a to your computer and use it in GitHub Desktop.
Save dougblackjr/fdabd044c203cb7fb7cf746b7b7fe10a to your computer and use it in GitHub Desktop.
<?php
/**
* DataGrab File Grid fieldtype class
*
* @package DataGrab
* @author Andrew Weaver <aweaver@brandnewbox.co.uk>
* @copyright Copyright (c) Andrew Weaver
*/
class Datagrab_file_grid extends Datagrab_fieldtype
{
/**
* Register a setting so it can be saved
*
* @param string $field_name
* @return void
*/
public function register_setting($field_name)
{
return array(
$field_name . "_columns",
$field_name . "_unique",
$field_name . "_extra1",
$field_name . "_extra2",
);
}
/**
* Create the form elements to map matrix fields
*
* @param string $field_name
* @param string $field_label
* @param string $field_type
* @param string $data
* @return void
* @author Andrew Weaver
*/
public function display_configuration($field_name, $field_label, $field_type, $field_required, $data)
{
$config = array();
$config["label"] = form_label($field_label);
if ($field_required) {
$config["label"] .= ' <span class="ajw_datagrab_required">*</span>';
}
$config["label"] .= '<div class="ajw_datagrab_subtext">' . $field_type . "</div>";
$config["value"] = "";
$config["value"] .= form_hidden($field_name, "1");
// Get current saved setting
if (isset($data["default_settings"]["cf"][ $field_name."_columns" ])) {
$default = $data["default_settings"]["cf"][ $field_name."_columns" ];
} else {
$default = array();
}
// Find columns for this grid
ee()->db->select("col_id, col_type, col_label");
ee()->db->from("exp_grid_columns g");
ee()->db->join("exp_channel_fields c", "g.field_id = c.field_id");
ee()->db->where("c.field_name", $field_name);
ee()->db->order_by("col_order ASC");
$query = ee()->db->get();
// Build ui
$grid_columns = $query->result_array();
foreach ($query->result_array() as $row) {
$config["value"] .= "<p>" . $row["col_label"] . NBS . ":" . NBS;
$config["value"] .= form_dropdown(
$field_name . "_columns[" . $row["col_id"] . "]",
$data["data_fields"],
isset($default[$row["col_id"]]) ? $default[$row["col_id"]] : ''
);
if ($row["col_type"] == "file") {
$config["value"] .= NBS . NBS . "Upload folder: " . NBS;
// Get upload folders
if (!isset($folders)) {
ee()->db->select("id, name");
ee()->db->from("exp_upload_prefs");
ee()->db->order_by("id");
$query = ee()->db->get();
$folders = array();
foreach ($query->result_array() as $folder) {
$folders[ $folder["id"] ] = $folder["name"];
}
}
$config["value"] .= form_dropdown(
$field_name . "_extra1[" . $row["col_id"] . "]",
$folders,
isset($data["default_settings"]["cf"][ $field_name . "_extra1" ][$row["col_id"]]) ? $data["default_settings"]["cf"][ $field_name . "_extra1" ][$row["col_id"]] : ''
);
$config["value"] .= NBS . NBS . "Fetch?: " . NBS;
$config["value"] .= form_dropdown(
$field_name . "_extra2[" . $row["col_id"] . "]",
array("No", "Yes"),
isset($data["default_settings"]["cf"][ $field_name . "_extra2" ][$row["col_id"]]) ? $data["default_settings"]["cf"][ $field_name . "_extra2" ][$row["col_id"]] : ''
);
}
$config["value"] .= "</p>";
}
$column_options = array();
$column_options["0"] = "Keep existing rows and append new";
$column_options["-1"] = "Delete all existing rows";
$sub_options = array();
foreach ($grid_columns as $row) {
$sub_options[ $row["col_id"] ] = $row[ "col_label" ];
}
$column_options["Update the row if this column matches:"] = $sub_options;
$config["value"] .= "<p>" .
"Action to take when an entry is updated: " .
form_dropdown(
$field_name . "_unique",
$column_options,
(isset($data["default_settings"]["cf"][$field_name . "_unique"]) ?
$data["default_settings"]["cf"][$field_name . "_unique" ]: '' )
) .
"</p>";
return $config;
}
public function prepare_post_data($DG, $item, $field_id, $field, &$data, $update = false)
{
}
public function final_post_data($DG, $item, $field_id, $field, &$data, $update = false)
{
// Find columns for this grid
ee()->db->select("col_id, col_type, col_label");
ee()->db->from("exp_grid_columns g");
ee()->db->where("field_id", $field_id);
$query = ee()->db->get();
$grid_columns = $query->result_array();
// $fields contains a list of grid columns mapped to data elements
// eg, $fields[3] => 5 means map data element 5 to grid column 3
$fields = $DG->settings["cf"][ $field . "_columns" ];
$grid = array();
$col_num = 0;
// Loop over columns
foreach ($grid_columns as $column) {
$col_id = $column["col_id"];
// Loop over data items
if (isset($fields[$col_id])) {
if ($DG->datatype->initialise_sub_item($item, $fields[$col_id], $DG->settings, $field)) {
$subitem = $DG->datatype->get_sub_item($item, $fields[$col_id], $DG->settings, $field);
$row_num = 1;
$row_idx = "new_row_".$row_num;
while ($subitem !== false) {
if (!isset($grid[$row_idx])) {
$grid[ $row_idx ] = array();
}
if ($column["col_type"] == "file") {
if ($subitem && $subitem != "") {
$subitem = $DG->_get_file(
$subitem,
$DG->settings["cf"][ $field . "_extra1" ][ $col_id ],
$DG->settings["cf"][ $field . "_extra2" ][ $col_id ] == 1 ? true : false
);
}
}
$grid[$row_idx]["col_id_" . $col_id] = $subitem;
$subitem = $DG->datatype->get_sub_item($item, $fields[ $col_id ], $DG->settings, $field);
$row_num++;
$row_idx = "new_row_".$row_num;
}
}
}
}
// Remove empty rows
$newgrid = array();
foreach ($grid as $idx => $row) {
$empty = true;
foreach ($row as $col) {
if ($col && $col != "") {
$empty = false;
continue;
}
}
if (!$empty) {
$newgrid[$idx] = $row;
}
}
$grid = $newgrid;
if ($update) {
// Find out what to do with existing data (delete or keep?)
$unique = 0;
if (isset($DG->settings["cf"][ $field . "_unique" ])) {
$unique = $DG->settings["cf"][ $field . "_unique" ];
}
// Is this the first time this entry has been updated during this import?
if (!in_array($update, $DG->entries)) {
// This is the first import, so delete existing rows if required
if ($unique == -1) {
// Delete existing rows
$old = array();
} else {
// Keep existing rows
// Fetch existing data
$old = $this->_rebuild_grid_data($update, $DG, $field_id);
}
} else {
// Fetch existing data
$old = $this->_rebuild_grid_data($update, $DG, $field_id);
}
$grid = array_merge($old, $grid);
}
$data[ "field_id_" . $field_id ] = $grid;
}
public function _rebuild_grid_data($entry_id, $DG, $field_id)
{
ee()->db->select("*");
ee()->db->from("exp_channel_grid_field_".$field_id);
ee()->db->where("entry_id", $entry_id);
ee()->db->order_by("row_order ASC");
$query = ee()->db->get();
$grid = array();
foreach ($query->result_array() as $row) {
$row_id = $row["row_id"];
unset($row["row_id"]);
unset($row["entry_id"]);
unset($row["row_order"]);
$grid["row_id_" . $row_id] = $row;
}
return $grid;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment