save()
save(object  $obj) : object
                Save handler, because DRY
Parameters
| object | $obj | Model to be saved  | 
                            
Throws
- \Ceo\Core\Managers\Exception
 Json encoded string of validation errors
Returns
object —Model
Core content manager
Managers provide a service layer in front of models. Managers implement domain specific logic, checks and initialization that would normally live in multiple controllers.
getPaginator(integer $page = 1, integer $limit = 50) : \Ceo\Core\Managers\Ceo\Core\ModelHelpers\Paginator
Helps paginate models using the query bulder. Bit more complicated than the native array method, but works better for larger data sets
Because it's based on Phalcon's QueryBuilder, it supports a fluent filtering interface:
    $manager = $this->foo_manager;
    $items = $manager->getPaginator(1, 20)
        ->orderBy('created_at desc')
        ->where('name = :name:', array('name' => $name))
        ->andWhere('type = :type:', array('type' => $type))
        ->paginate();
    echo json_encode($items);
                                    | integer | $page | Current page  | 
                            
| integer | $limit | Per page limit  | 
                            
findFirstByUrl(mixed  $url) : object
                Find first content item by given URL.
URL can either be a full URL slug or URL object. For example both of the following are valid:
    $content = ContentManager::findFirstByUrl('some/path');
    $url = UrlModel::findFirstBySlug('another/path');
    $content = ContentManager::findFirstByUrl($url);
                                    | mixed | $url | URL  | 
                            
Content item
findFirstBySrn(string  $srn) : \Ceo\Core\Models\Content
                Find first instance by SRN
| string | $srn | SRN  | 
                            
create( $input, mixed $user = false, boolean $nopush = false) : object
Create content with given properties.
URLS can be provided either as a single string, or an array with:
For example:
$data = [
    'slug' => 'fronch-toast'.uniqid(),
    'urls' => [
        'a-test-url'.uniqid(),
        [
            'url' => 'another test url'.uniqid(),
            'is_default' => 1
        ]
    ]
];
Attachment is an array containing:
| $input | ||
| mixed | $user | Editing user, either ID or object  | 
                            
| boolean | $nopush | disable socket push on save  | 
                            
ContentModel
update(integer $id, $input, mixed $user = false, boolean $nopush = false) : object
Update content object.
Accepts the same properties as create, including Urls. Keep in mind that Url associations are permanent. You may only append new Urls, existing Urls will always be maintained.
Will also create a new version containing all of the current data, before save.
Additionally, sending an attachment will remove the original attachment and replace with the new file.
| integer | $id | Content id  | 
                            
| $input | ||
| mixed | $user | Editing user, either ID or object  | 
                            
| boolean | $nopush | disable socket push on save  | 
                            
ContentModel
attach(integer $id, array $file, array $imageMetadata = array()) : \Ceo\Core\Models\Attachment
Attach a file to a content item File is an array containing: * file - BASE64 encoded file content * name - original file name
| integer | $id | Parent content id  | 
                            
| array | $file | File data  | 
                            
| array | $imageMetadata | IPTC and EXIF data will populate this array if type is image  |