Source

i18d-galleryManager / GalleryBehavior.php

<?php
/**
 * Behavior for adding gallery to any model.
 *
 * @author Bogdan Savluk <savluk.bogdan@gmail.com>
 */
class GalleryBehavior extends CActiveRecordBehavior
{
    /** @var string Model attribute name to store created gallery id */
    public $idAttribute;
    /**
     * @var array Settings for image auto-generation
     * @example
     *  array(
     *       'small' => array(
     *              'resize' => array(200, null),
     *       ),
     *      'medium' => array(
     *              'resize' => array(800, null),
     *      )
     *  );
     */
    public $versions;
    /** @var boolean does images in gallery need names */
    public $name=true;
    /** @var boolean does images in gallery need descriptions */
    public $description=true;
    /** @var boolean does images in gallery need links */
    public $link=false;

    private $_gallery;

    /** Will create new gallery after save if no associated gallery exists */
    public function beforeSave($event)
    {
        parent::beforeSave($event);
        if ($event->isValid) {
            if (empty($this->getOwner()->{$this->idAttribute}) || $this->getGallery()===null) {
                $gallery = new Gallery();
                $gallery->name = $this->name;
                $gallery->description = $this->description;
                $gallery->link = $this->link;
                $gallery->versions = $this->versions;
                $gallery->save();

                $this->getOwner()->{$this->idAttribute} = $gallery->id;
            }
        }
    }

    /** Will remove associated Gallery before object removal */
    public function beforeDelete($event)
    {
        if (!empty($this->getOwner()->{$this->idAttribute})) {
            /** @var $gallery Gallery */
            $gallery = Gallery::model()->findByPk($this->getOwner()->{$this->idAttribute});
            $gallery->delete();
        }
        parent::beforeDelete($event);
    }

    /** Method for changing gallery configuration and regeneration of images versions */
    public function changeConfig($force=false)
    {
        /** @var $gallery Gallery */
        $gallery = $this->getGallery();
        if ($gallery === null) return;
        $changed = false;
        if ($gallery->name != $this->name) {
            $changed = true;
        }
        if ($gallery->description != $this->description) {
            $changed = true;
        }
        if ($gallery->link != $this->link) {
            $changed = true;
        }
        if ($gallery->versions_data != serialize($this->versions)) {
            $changed = true;
        }
        if ($force||$changed) {
            foreach ($gallery->galleryPhotos as $photo) {
                $photo->removeImages();
            }

            $gallery->name = $this->name;
            $gallery->description = $this->description;
            $gallery->link = $this->link;
            $gallery->versions = $this->versions;
            $gallery->save();

            foreach ($gallery->galleryPhotos as $photo) {
                $photo->updateImages();
            }
        }
        $this->getOwner()->{$this->idAttribute} = $gallery->id;
        $this->getOwner()->saveAttributes($this->getOwner()->getAttributes());
    }

    /** @return Gallery Returns gallery associated with model */
    public function getGallery()
    {
        if (empty($this->_gallery)) {
            $this->_gallery = Gallery::model()->findByPk($this->getOwner()->{$this->idAttribute});
        }
        return $this->_gallery;
    }

    /** @return GalleryPhoto[] Photos from associated gallery */
    public function getGalleryPhotos()
    {
        $criteria = new CDbCriteria();
        $criteria->condition = 'gallery_id = :gallery_id';
        $criteria->params[':gallery_id'] = $this->getOwner()->{$this->idAttribute};
        $criteria->order = '`rank` asc';
        return GalleryPhoto::model()->findAll($criteria);
    }

    /** @return int from associated gallery */
    public function getGalleryPhotoCount()
    {
        $criteria = new CDbCriteria();
        $criteria->condition = 'gallery_id = :gallery_id';
        $criteria->params[':gallery_id'] = $this->getOwner()->{$this->idAttribute};
        return GalleryPhoto::model()->count($criteria);
    }
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.