Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Listener which cascade CRUD action on the model to the File's relations.
- */
- class FileableListener extends Doctrine_Record_Listener
- {
- protected $_options = array();
- public function __construct($options = null)
- {
- $this->_options = $options;
- }
- public function preDqlSelect(Doctrine_Event $event)
- {
- $query = $event->getQuery();
- $components = $this->_getDqlCallbackComponents($query);
- foreach ($components as $alias => $component)
- {
- if (isset($component['relation']))
- {
- $query->addWhere($alias.'.object_type = ?', get_class($event->getInvoker()));
- }
- }
- }
- /**
- * Cascade delete to FileRelation
- * @param Doctrine_Event $event
- */
- public function postDelete(Doctrine_Event $event)
- {
- $record = $event->getInvoker();
- FileRelationTable::getInstance()
- ->createQuery('f')
- ->delete()
- ->where('f.object_type = ?', get_class($record))
- ->andWhere('f.object_id = ?', $record->getPrimaryKey())
- ->execute();
- }
- /**
- * Cascade update to FileRelation
- * @param Doctrine_Event $event
- */
- public function preUpdate(Doctrine_Event $event)
- {
- $record = $event->getInvoker();
- $modified = $record->getModified();
- if(isset($modified['id']))
- {
- FileRelationTable::getInstance()
- ->createQuery('f')
- ->update()
- ->set('object_id',$record->getId())
- ->where('object_type = ?', get_class($record))
- ->andWhere('object_id = ?', $record->getPrimaryKey())
- ->execute();
- }
- }
- protected function _getDqlCallbackComponents($query)
- {
- $params = $query->getParams();
- $componentsBefore = array();
- if ($query->isSubquery())
- {
- $componentsBefore = $query->getQueryComponents();
- }
- $copy = $query->copy();
- $copy->getSqlQuery($params);
- $componentsAfter = $copy->getQueryComponents();
- if ($componentsBefore !== $componentsAfter)
- {
- return array_diff($componentsAfter, $componentsBefore);
- }
- else
- {
- return $componentsAfter;
- }
- }
- }
Add Comment
Please, Sign In to add comment