ExpressionEngine Docs

Channel Entry Model

class ExpressionEngine\Model\Channel\ChannelEntry

Properties

Name Validation Type Description
site_id
entry_id
author_id required, isNatural, validateAuthorId int
channel_id required, validateMaxEntries
title required, maxLength[200], limitHtml[b,cite,code,del,em,i,ins,markspan,strong,sub,sup]
url_title required, maxLength[URL_TITLE_MAX_LENGTH], alphaDashPeriodEmoji, validateUniqueUrlTitle[channel_id] See example below for built-in methods.
status required
status_id
entry_date required int
expiration_date int
edit_date timestamp
forum_topic_id
ip_address ip_address
versioning_enabled enum[y,n] boolString
view_count_one
view_count_two
view_count_three
view_count_four
allow_comments enum[y,n] boolString
sticky enum[y,n] boolString
year
month
day
comment_expiration_date
recent_comment_date timestamp
comment_total

Relationships

Channel

The Channel the entry belongs to.

Author

The user that published the entry.

Status

The current status of the entry.

Categories

Selected categories the entry has.

Autosaves

If enabled, the entry autosaves.

Parents

Entries that are related to this entry.

Children

Entries that are related to this entry.

Versions

If enabled, previous versions of the entry.

Comments

Comments for the entry.

CommentSubscriptions

Comment subscriptions for the entry.

Site

The site the entry is apart of. Used in MSM sites.

Methods

  • validateMaxEntries
  • validateAuthorId
  • validateUrlTitle
  • validateUniqueUrlTitle
  • saveTabData
  • saveVersion
  • getStructure
  • getDisplay
  • populateAllowComments
  • populateChannels
  • populateAuthors
  • populateCommentExpiration
  • populateStatus
  • getAuthorName
  • getModChannelResultsArray
  • hasPageURI
  • getPageURI
  • getPageTemplateID
  • isLivePreviewable
  • hasLivePreview

Events

  • beforeDelete
  • beforeInsert
  • beforeSave
  • beforeUpdate
  • afterDelete
  • afterInsert
  • afterSave
  • afterUpdate

Examples

Get an Entry by ID

$entry_id = 50;

$entry_object = ee('Model')
                ->get('ChannelEntry')
                ->filter('entry_id', $entry_id)
                ->first();

Alternatively using the Entry ID as the Primary Key

$entry_id = 50;

$entry_object = ee('Model')
                ->get('ChannelEntry', $entry_id)
                ->first();

Create a new simple entry

$entry              = ee('Model')->make('ChannelEntry');
$entry->author_id   = ee()->session->userdata('member_id'); // Returns currently Logged-in user ID.
$entry->channel_id  = 1;
$entry->title       = 'An Awesome Title';
$entry->url_title   = ee('Format')->make('Text', 'An Awesome Title')->urlSlug()->compile(); // Returns an-awesome-title. Must be unique.
$entry->status      = ee('Model')->get('Status', 1)->first()->status; // Returns 'open';
$entry->entry_date  = ee()->localize->now; // Returns time in seconds from epoch: 1623945317

// Validate and Save.
$result = $entry->validate();

if ($result->isValid()) {
    $entry->save();
}

$entry->entry_id; // Will now return the new Entry ID.

Edit a Status

$entry_id = 3;

// Get the entry object.
$entry = ee('Model')->get('ChannelEntry', $entry_id)->first();

// Returns 'closed'.
$entry->status = ee('Model')->get('Status', 2)->first()->status;

// Validate and Save.
$result = $entry->validate();

if ($result->isValid())
{
  $entry->save();
}

Get an Entry’s Children

// The parent entry.
$entry_id = 1;

// Get the Entry's object.
$entry = ee('Model')->get('ChannelEntry', $entry_id)->first();

// Get the children relationship, and returns entry objects.
$children = $entry->Children;

$children_ids = $children->pluck('entry_id');
// Output array(2, 3, 4...etc);

Or as One Line:

$children_ids = ee('Model')->get('ChannelEntry', 1)->first()->Children->pluck('entry_id');

Standard Custom Fields

Get an Entry’s Custom Field

// Get a Channel Entry object.
$entry = ee('Model')->get('ChannelEntry', 5)->first();

// Get the field data.
$field_data = $entry->field_id_5;

// Using Variables.
$field_id = 5;
$field_data = $entry->{'field_id_'.$field_id};

Set a Standard Custom Field

// Get a Channel Entry object.
$entry = ee('Model')->get('ChannelEntry', 5)->first();

// Set the field data.
$entry->field_id_5 = 'New Data';

// Validate and Save.
$result = $entry->validate();

if ($result->isValid())
{
  $entry->save();
}

Advanced Custom Fields

Grid, Fluid and Relationship fieldtypes take additional handling. We will cover just the basics to recall and save data here.

Grid

The Grid fieldtype was created before the newer EE Model Service. If you tried to recall a Grid field with $entry->field_id_8 the result will be null, so we have to use a Grid-specific process.

To start, the Grid fieldtype has a legacy model that must be loaded once per class to use the helper methods.

ee()->load->model('grid_model');

Grid fields contains an array of rows with arrays of the columns for each row.

Rows

New rows are created by using the prefix new_row_ and then the zero-indexed row ID for that instance. For example, the 2nd row would be new_row_1. If the page is reloaded then the ID returns to zero. The ID is not actually required, but recommended, especially if row order is important.

'new_row_0' => array(
    'col_id_1' => 'data for column 1',
    'col_id_2' => 'data for column 2',
    'col_id_3' => 'data for column 3',
),

Existing rows start with the prefix row_id_ and then the unique row ID. When a row is saved for the first time it is given a unique ID across all of the grid rows in your ExpressionEngine site.

Columns

In each row is an array of columns. Columns start with col_id_ and then the row ID such as col_id_1, col_id_2. Data for each column can be any fieldtype compatible with Grid and is set in the same way as if it were out of a Grid field.

It is important to note that columns have to be set ahead time, and their IDs are also global to the ExpressionEngine site. In other words, when saving data if a column does not exist in the array, the saving process will not automatically create a new column. Depending on the method used to save the data, EE may also throw an error if a column is missing.

Get Grid Data

To get Grid data for a specific entry ID and field ID, use the get_entry method:


$grid_data = ee()->grid_model->get_entry($entry_id, $grid_field_id, 'channel');

Returns an array similar to this:

array(

    // First row.
    array(
        'row_id' => 3, // Unique ID to all Grid rows in EE.
        'entry_id' => 8, // Entry ID this is linked to.
        'row_order' => 0, // Order of the row in the entry. Zero-index.
        'fluid_field_data_id' => 0,
        'col_id_9' => 'field data from the first column', // Each column's data.
        'col_id_10' => 'more field data from the second column', // Each column's data.
    ),

    // Second row.
    array(
        'row_id' => 4,
        'entry_id' => 8,
        'row_order' => 1,
        'fluid_field_data_id' => 0,
        'col_id_9' => 'field data from the first column',
        'col_id_10' => 'more field data from the second column',
    ),
)

To Save New Grid Data:


ee()->load->model('grid_model');

$entry_id = 5;
$grid_field_id = 1;

$new_grid_data =  array(

    'new_row_0' => array(
        'col_id_1' => 'data for column 1',
        'col_id_2' => 'data for column 2',
        'col_id_3' => 'data for column 3',
    ),

    'new_row_1' => array(
        'col_id_1' => 'data for column 1',
        'col_id_2' => 'data for column 2',
        'col_id_3' => 'data for column 3',
    ),
);

// Option 1, save to the Object (recommended)
$entry = ee('Model')->get('ChannelEntry', $entry_id)->first();
$entry->{$entry->getCustomFieldPrefix() . $grid_field_id} = $new_grid_data;
$entry->save();

// Option 2, save using the Grid method.
ee()->grid_model->save_field_data($new_grid_data, $grid_field_id, 'channel', $entry_id);

Edit Grid Data:


ee()->load->model('grid_model');

$entry_id = 5;
$grid_field_id = 1;

$new_grid_data =  array(

    'row_id_5' => array(
        'col_id_1' => 'new data for column 1',
        'col_id_2' => 'new data for column 2',
        'col_id_3' => 'new data for column 3',
    ),

    'row_id_6' => array(
        //...etc
    ),
);

// Option 1, save to the Object (recommended)
$entry = ee('Model')->get('ChannelEntry', $entry_id)->first();
$entry->{$entry->getCustomFieldPrefix() . $grid_field_id} = $new_grid_data;
$entry->save();

// Option 2, save using the Grid method.
ee()->grid_model->save_field_data($new_grid_data, $grid_field_id, $entry->getContentType(), $entry_id);

Fluid

Fluid has its own model to fetch fields. Fluid fields are existing fields that are grouped into a Fluid field.

Get data from an entry’s fluid field


$field_objects = ee('Model')
                    ->get('fluid_field:FluidField')
                    ->filter('entry_id', $entry_id) // The Entry ID
                    ->filter('fluid_field_id', $fluid_field_id) // The fluid field in the entry.
                    ->order('order') // Important to maintain the field order within the fluid field.
                    ->all(); // Get all the individual fields within the fluid field.

// Get an array of field IDs
$field_objects->pluck('field_id'); // array(3, 45, 2, 5);

// Get an array of data from each field within a Fluid fieldtype:
$field_objects->fetchFieldData();

// Example Return:
array(
    array(
        'id'         => 2
        'entry_id'   => 4,
        'field_id_1' => 'your field data',
        'field_ft_1' => 'none',
    ),
    array(
        'id'          => 5
        'entry_id'    => 4,
        'field_id_5'  => 'your field data',
        'field_ft_5'  => 'xhtml',
    ),
)

The next two examples assumes a text field with and ID of 5 has already been created, and added to this fluid field as an option to use.

Edit and replace exiting data

Note this will overwrite the entire fluid field.

$entry->{$entry->getCustomFieldPrefix() . $fluid_field_id} = array(
    'fields' => array(

        // Replace/edit data
        // The ID in the Fluid Field table, $fluid->id.
        'field_7' => array(

            // The existing field ID.
            'field_id_5' => 'Field data'
        ),
    )
);

Add a new field in the fluid grid

// $entry->field_id_x
$entry->{$entry->getCustomFieldPrefix() . $fluid_field_id} = array(
    'fields' => array(

        // Adding a new field.
        // Each is appended with a number, starting with 1.
        'new_field_1' => array(
            'field_id_5' => 'New field data'
        )
    )
);

Relationship

Relationships are set by passing an array of entry IDs.

$entry_id = 8;

$entry = ee('Model')->get('ChannelEntry', $entry_id)->first();

$related_entry_ids = array( 'data' => array('9', '10', '11') )

$entry->field_id_10 = $related_entry_ids;

$entry->save();