rsanchez / json

Output ExpressionEngine data in JSON format.
http://devot-ee.com/add-ons/json/
100 stars 236 forks source link

add relationships support for grids #65

Open ahebrank opened 5 years ago

ahebrank commented 5 years ago

Relationship fields within grids aren't followed down the rabbit hole to fetch the child_id out of the separate relationship table. This adds that relationship lookup (with caching like the existing lookups).

Zignature commented 2 years ago

Fixed some bugs:

protected function entries_grid_relationship($grid_col_id, $grid_row_id, $entry_id)
{
  $query = ee()->db->select('parent_id, child_id, grid_field_id, grid_col_id, grid_row_id, field_id, fluid_field_data_id')
                   ->where_in('parent_id', $this->entries_entry_ids)
                   ->where('grid_col_id', $grid_col_id)
                   ->order_by('order', 'asc')
                   ->get('relationships');

  foreach ($query->result_array() as $row)
  {
    if ( ! isset($this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']]))
    {
      $this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']] = array();
    }

    $this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']][] = (int) $row['child_id'];
  }

  $query->free_result();

  if (isset($this->entries_grid_relationship_data[$grid_col_id][$entry_id][$grid_row_id]))
  {
    return $this->entries_grid_relationship_data[$grid_col_id][$entry_id][$grid_row_id];
  }

  return array();
}
Zignature commented 2 years ago

Fixed some bugs:

  • This doesn't work when multiple grid fields with a relationships column exist in the channel entry. Only the first grid field will get relationships returned. Took out lines 513, 514 and 537 to fix this.
  • Lines 523 - 526 are duplicated on lines 528 - 531. Removed duplicate lines 528 - 531
protected function entries_grid_relationship($grid_col_id, $grid_row_id, $entry_id)
{
  $query = ee()->db->select('parent_id, child_id, grid_field_id, grid_col_id, grid_row_id, field_id, fluid_field_data_id')
                   ->where_in('parent_id', $this->entries_entry_ids)
                   ->where('grid_col_id', $grid_col_id)
                   ->order_by('order', 'asc')
                   ->get('relationships');

  foreach ($query->result_array() as $row)
  {
    if ( ! isset($this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']]))
    {
      $this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']] = array();
    }

    $this->entries_grid_relationship_data[$grid_col_id][$row['parent_id']][$row['grid_row_id']][] = (int) $row['child_id'];
  }

  $query->free_result();

  if (isset($this->entries_grid_relationship_data[$grid_col_id][$entry_id][$grid_row_id]))
  {
    return $this->entries_grid_relationship_data[$grid_col_id][$entry_id][$grid_row_id];
  }

  return array();
}

This doesn't seem to work either... :(