Skip to content

Instantly share code, notes, and snippets.

@dougblackjr
Created December 9, 2021 16:24
Show Gist options
  • Save dougblackjr/fdabd044c203cb7fb7cf746b7b7fe10a to your computer and use it in GitHub Desktop.
Save dougblackjr/fdabd044c203cb7fb7cf746b7b7fe10a to your computer and use it in GitHub Desktop.

Revisions

  1. dougblackjr created this gist Dec 9, 2021.
    252 changes: 252 additions & 0 deletions datagrab_file_grid.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,252 @@
    <?php

    /**
    * DataGrab File Grid fieldtype class
    *
    * @package DataGrab
    * @author Andrew Weaver <[email protected]>
    * @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;
    }
    }