Author: ornicar2
Date: 2010-01-28 20:52:10 +0100 (Thu, 28 Jan 2010)
New Revision: 27286

Added:
   plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminPing.js
   
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLock.class.php
   
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLockTable.class.php
   plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCorePing.js
Modified:
   plugins/diemPlugin/trunk/dmAdminPlugin/config/dm/assets.yml
   
plugins/diemPlugin/trunk/dmAdminPlugin/data/generator/dmAdminDoctrineModule/dmAdmin/template/templates/_form.php
   plugins/diemPlugin/trunk/dmAdminPlugin/lib/filter/dmAdminInitFilter.php
   
plugins/diemPlugin/trunk/dmAdminPlugin/lib/response/asset/dmAdminAssetConfig.php
   
plugins/diemPlugin/trunk/dmAdminPlugin/lib/view/html/layout/dmAdminLayoutHelper.php
   
plugins/diemPlugin/trunk/dmAdminPlugin/modules/dmInterface/templates/_toolBar.php
   plugins/diemPlugin/trunk/dmAdminPlugin/web/css/bars.css
   plugins/diemPlugin/trunk/dmAdminPlugin/web/css/flash.css
   plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminCtrl.js
   plugins/diemPlugin/trunk/dmCorePlugin/config/dm/assets.yml
   plugins/diemPlugin/trunk/dmCorePlugin/config/dm/config.yml
   plugins/diemPlugin/trunk/dmCorePlugin/config/doctrine/schema.yml
   plugins/diemPlugin/trunk/dmCorePlugin/data/dm/i18n/en_fr.yml
   plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmFilter.php
   plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmInitFilter.php
   
plugins/diemPlugin/trunk/dmCorePlugin/lib/view/html/layout/dmCoreLayoutHelper.php
   plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/config/security.yml
   
plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/lib/BasedmCoreActions.class.php
   plugins/diemPlugin/trunk/dmCorePlugin/web/css/mediaBar.css
   plugins/diemPlugin/trunk/dmCorePlugin/web/css/pageBar.css
   plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCoreEditCtrl.js
   plugins/diemPlugin/trunk/dmFrontPlugin/lib/filter/dmFrontInitFilter.php
   plugins/diemPlugin/trunk/dmFrontPlugin/web/css/toolBar.css
Log:
[Diem]
- implemented real-time resource locks [NEED DOCTRINE MIGRATION]
- fixed editing style for webkit based browsers
- updated french translations
- cleaned init filters

Modified: plugins/diemPlugin/trunk/dmAdminPlugin/config/dm/assets.yml
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/config/dm/assets.yml 2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/config/dm/assets.yml 2010-01-28 
19:52:10 UTC (rev 27286)
@@ -21,6 +21,7 @@
     history:          dmAdminHistoryCtrl
     sitemap:          dmAdminSitemap
     diagram:          dmAdminDiagram
+    ping:             dmAdminPing
 
 css:
 

Modified: 
plugins/diemPlugin/trunk/dmAdminPlugin/data/generator/dmAdminDoctrineModule/dmAdmin/template/templates/_form.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmAdminPlugin/data/generator/dmAdminDoctrineModule/dmAdmin/template/templates/_form.php
    2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmAdminPlugin/data/generator/dmAdminDoctrineModule/dmAdmin/template/templates/_form.php
    2010-01-28 19:52:10 UTC (rev 27286)
@@ -3,6 +3,8 @@
 
 <div class="sf_admin_form">
 
+  <div class="dm_active_locks"></div>
+
   [?php $formActions = get_partial('<?php echo $this->getModuleName() 
?>/form_action_bar', array('<?php echo $this->getSingularName() ?>' => $<?php 
echo $this->getSingularName() ?>, 'form' => $form, 'configuration' => 
$configuration, 'helper' => $helper, 'nearRecords' => $nearRecords)); ?]
 
   [?php echo $form->renderFormTag(url_for(

Modified: 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/filter/dmAdminInitFilter.php
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/lib/filter/dmAdminInitFilter.php     
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/lib/filter/dmAdminInitFilter.php     
2010-01-28 19:52:10 UTC (rev 27286)
@@ -16,20 +16,20 @@
 
     $this->loadAssetConfig();
 
+    $this->updateLock();
+
     $filterChain->execute();
-    
-    $response = $this->context->getResponse();
 
     // If response has no title, generate one with the H1
-    if ($response->isHtmlForHuman() && !$response->getTitle())
+    if ($this->response->isHtmlForHuman() && !$this->response->getTitle())
     {
-      preg_match('|<h1[^>]*>(.*)</h1>|iuUx', $response->getContent(), 
$matches);
+      preg_match('|<h1[^>]*>(.*)</h1>|iuUx', $this->response->getContent(), 
$matches);
         
       if (isset($matches[1]))
       {
         $title = 'Admin : '.strip_tags($matches[1]).' - 
'.dmConfig::get('site_name');
       
-        $response->setContent(str_replace('<title></title>', 
'<title>'.$title.'</title>', $response->getContent()));
+        $this->response->setContent(str_replace('<title></title>', 
'<title>'.$title.'</title>', $this->response->getContent()));
       }
     }
   }

Modified: 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/response/asset/dmAdminAssetConfig.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/response/asset/dmAdminAssetConfig.php
    2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/response/asset/dmAdminAssetConfig.php
    2010-01-28 19:52:10 UTC (rev 27286)
@@ -49,10 +49,12 @@
       'core.toolBar',
       'core.pageBar',
       'core.mediaBar',
+      'core.ping',
       'admin.ctrl',
       'admin.toolBar',
       'admin.pageBar',
-      'admin.mediaBar'
+      'admin.mediaBar',
+      'admin.ping'
     );
   }
 }
\ No newline at end of file

Modified: 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/view/html/layout/dmAdminLayoutHelper.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/view/html/layout/dmAdminLayoutHelper.php
 2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmAdminPlugin/lib/view/html/layout/dmAdminLayoutHelper.php
 2010-01-28 19:52:10 UTC (rev 27286)
@@ -48,5 +48,13 @@
     return $html;
   }
 
+  protected function getJavascriptConfig()
+  {
+    $config = parent::getJavascriptConfig();
+    
+    $config['record_id'] = 
$this->serviceContainer->getService('request')->getParameter('pk', 0);
 
+    return $config;
+  }
+
 }
\ No newline at end of file

Modified: 
plugins/diemPlugin/trunk/dmAdminPlugin/modules/dmInterface/templates/_toolBar.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmAdminPlugin/modules/dmInterface/templates/_toolBar.php
   2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmAdminPlugin/modules/dmInterface/templates/_toolBar.php
   2010-01-28 19:52:10 UTC (rev 27286)
@@ -4,15 +4,11 @@
 
   echo £link('dmAuth/signout')->textTitle($sf_user->getUsername().' : 
'.__('Logout'))->set('.widget16.s16block.s16_signout');
 
-//  echo £link()->textTitle(__('Home'))->set('.widget16.s16block.s16_home');
-
   if ($sf_user->can('clear_cache'))
   {
     echo £link('dmCore/refresh')->textTitle(__('Update 
project'))->set('.dm_refresh_link.widget16.s16block.s16_clear');
   }
   
-//  echo £link('dmCodeEditor/index')->textTitle(__('Code 
Editor'))->set('.widget16.s16block.s16_code_editor');
-
   echo £('div.dm_menu.widget16', $menu->render());
 
   if (isset($cultureSelect))
@@ -30,6 +26,8 @@
   }
 
   echo £link('app:front')->textTitle(__('Go to site'))->set('.widget16.ml10');
+
+  echo £('div.dm_active_users');
   
   if (sfConfig::get('sf_web_debug'))
   {

Modified: plugins/diemPlugin/trunk/dmAdminPlugin/web/css/bars.css
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/web/css/bars.css     2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/web/css/bars.css     2010-01-28 
19:52:10 UTC (rev 27286)
@@ -1,6 +1,7 @@
 #dm_tool_bar {
   top: 0;
   -moz-box-shadow: 0 4px 4px #888;
+  -webkit-box-shadow: 0 4px 4px #888;
 }
 
 #dm_media_bar {
@@ -65,6 +66,7 @@
   overflow: auto;
   background: #fff;
   -moz-box-shadow: 4px 4px 4px #888;
+  -webkit-box-shadow: 4px 4px 4px #888;
 }
 
 #dm_tool_bar ul.level0 > li.ui-state-active ul.level1 {
@@ -132,4 +134,20 @@
   bottom: 0;
   background: url(../../core/images/monitor_bar_bg.png) bottom left no-repeat;
   width: 100%;
+}
+
+#dm_tool_bar div.dm_active_users {
+  margin-left: 5px;
+}
+
+#dm_tool_bar div.dm_active_users span {
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  background: #FFFFFF;
+  color: #000000;
+  float: left;
+  margin-top: 5px;
+  margin-left: 5px;
+  opacity: 0.7;
+  padding: 2px 5px;
 }
\ No newline at end of file

Modified: plugins/diemPlugin/trunk/dmAdminPlugin/web/css/flash.css
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/web/css/flash.css    2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/web/css/flash.css    2010-01-28 
19:52:10 UTC (rev 27286)
@@ -1,13 +1,17 @@
-#flash {
+#flash, div.dm_active_locks {
   margin-bottom: 5px;
   cursor: pointer;
 }
 
-#flash li.flash {
+#flash li.flash,
+div.dm_active_locks span {
   border: 1px solid;
   padding: 5px;
   margin-top: 5px;
   color: #333;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  display: block;
 }
 
 #flash li.info {
@@ -15,7 +19,8 @@
   border-color: #CAD3A6;
 }
 
-#flash li.alert {
+#flash li.alert,
+div.dm_active_locks span {
   background: #F8F2B7 url(../images/flash/yellow.gif) repeat-x top left;
   border-color: #DBD6A1;
 }

Modified: plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminCtrl.js
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminCtrl.js        
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminCtrl.js        
2010-01-28 19:52:10 UTC (rev 27286)
@@ -30,6 +30,8 @@
                        this.autoLoading();
 
       this.checkVersion();
+
+      this.launchPing();
     },
 
     checkVersion: function()

Added: plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminPing.js
===================================================================
--- plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminPing.js                
                (rev 0)
+++ plugins/diemPlugin/trunk/dmAdminPlugin/web/js/dmAdminPing.js        
2010-01-28 19:52:10 UTC (rev 27286)
@@ -0,0 +1,49 @@
+(function($)
+{
+
+  $.dm.ping = $.extend($.dm.corePing, {
+
+    users: '',
+    locks: '',
+
+    init: function(options)
+    {
+      self = this;
+
+      self.initCore(options);
+    },
+
+    pong: function(data)
+    {
+      var self = $.dm.ping;
+
+      if(data.users != self.users)
+      {
+        self.renderUsers(data.users.split('|'));
+        self.users = data.users;
+      }
+
+      if(data.locks != self.locks)
+      {
+        self.renderLocks(data.locks.split('|'));
+        self.locks = data.locks;
+      }
+      
+      setTimeout(self.ping, self.options.delay);
+    },
+
+    renderUsers: function(users)
+    {
+      $('#dm_tool_bar 
div.dm_active_users').html('<span>'+users.join('</span><span>')+'</span>');
+    },
+
+    renderLocks: function(locks)
+    {
+      if($locks = $('#dm_admin_content div.dm_active_locks').orNot())
+      {
+        $locks.html(locks[0] ? '<span>'+locks.join('</span><span>')+'</span>' 
: '');
+      }
+    }
+  });
+  
+})(jQuery);

Modified: plugins/diemPlugin/trunk/dmCorePlugin/config/dm/assets.yml
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/config/dm/assets.yml  2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/config/dm/assets.yml  2010-01-28 
19:52:10 UTC (rev 27286)
@@ -14,6 +14,7 @@
     mediaBar:         dmCoreMediaBar
     auth:             dmCoreAuth
     codeArea:         dmCoreCodeArea
+    ping:             dmCorePing
     
   lib:
     symfony_debug:    symfony/debug

Modified: plugins/diemPlugin/trunk/dmCorePlugin/config/dm/config.yml
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/config/dm/config.yml  2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/config/dm/config.yml  2010-01-28 
19:52:10 UTC (rev 27286)
@@ -50,6 +50,7 @@
   security:
     remember_cookie_name:               # defaults to 
"dm_remember_%project_name%"
     remember_key_expiration_age:        # defaults to 15 days
+    active_user_timeout:  10            # time in seconds to consider a user 
is no more active
  
 ###### dm internal config ######
   

Modified: plugins/diemPlugin/trunk/dmCorePlugin/config/doctrine/schema.yml
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/config/doctrine/schema.yml    
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/config/doctrine/schema.yml    
2010-01-28 19:52:10 UTC (rev 27286)
@@ -168,6 +168,27 @@
     header:                 { type: string(60000) }
     description:            { type: string(60000) }
 
+DmLock:
+  columns:
+    user_id:                { type: integer, notnull: true }
+    user_name:              { type: string(255), notnull: true }
+    module:                 { type: string(127), notnull: true }
+    action:                 { type: string(127), notnull: true }
+    record_id:              { type: integer, unsigned: true, notnull: true, 
default: 0 }
+    time:                   { type: integer, notnull: true }
+    app:                    { type: string(127), notnull: true }
+    url:                    { type: string(255), notnull: true }
+    culture:                { type: string(15), notnull: true }
+  indexes:
+    dmLockIndex:
+      fields:               [ user_id, module, action, record_id ]
+      type:                 unique
+  relations:
+    User:
+      class:                DmUser
+      local:                user_id
+      onDelete:             CASCADE
+
 # SEO SCHEMA
 
 DmAutoSeo:

Modified: plugins/diemPlugin/trunk/dmCorePlugin/data/dm/i18n/en_fr.yml
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/data/dm/i18n/en_fr.yml        
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/data/dm/i18n/en_fr.yml        
2010-01-28 19:52:10 UTC (rev 27286)
@@ -400,4 +400,5 @@
 "Paste": "Coller"
 "Drag & drop links here from the left PAGE panel": "Glisser-déposer une page 
ici depuis le panneau PAGES"
 "Click to edit": "Cliquer pour modifier"
-"Code generation": "Génération du code"
\ No newline at end of file
+"Code generation": "Génération du code"
+"%user% is browsing this page, you should not modify it now.": "%user% est 
déjà sur cette page, vous ne devriez pas la modifier maintenant."
\ No newline at end of file

Modified: plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmFilter.php
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmFilter.php       
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmFilter.php       
2010-01-28 19:52:10 UTC (rev 27286)
@@ -3,7 +3,9 @@
 abstract class dmFilter extends sfFilter
 {
   protected
-  $request;
+  $request,
+  $response,
+  $user;
 
   /**
    * Initializes this Filter.
@@ -16,6 +18,8 @@
   public function initialize($context, $parameters = array())
   {
     $this->request = $context->getRequest();
+    $this->response = $context->getResponse();
+    $this->user = $context->getUser();
 
     return parent::initialize($context, $parameters);
   }

Modified: plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmInitFilter.php
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmInitFilter.php   
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/lib/filter/dmInitFilter.php   
2010-01-28 19:52:10 UTC (rev 27286)
@@ -3,11 +3,29 @@
 abstract class dmInitFilter extends dmFilter
 {
 
+  protected function updateLock()
+  {
+    if(class_exists('DmLock') && $this->user->can('admin') && 
$this->response->isHtmlForHuman())
+    {
+      dmDb::table('DmLock')->update(array(
+        'user_id'   => $this->user->getUserId(),
+        'user_name' => $this->user->getUser()->get('username'),
+        'time'      => $_SERVER['REQUEST_TIME'],
+        'app'       => sfConfig::get('sf_app'),
+        'module'    => $this->request->getParameter('module'),
+        'action'    => $this->request->getParameter('action'),
+        'record_id' => $this->request->getParameter('pk', 0),
+        'culture'   => $this->user->getCulture(),
+        'url'       => str_replace($this->request->getAbsoluteUrlRoot(), '', 
$this->request->getUri())
+      ));
+    }
+  }
+
   protected function loadAssetConfig()
   {
-    if ($this->context->getResponse()->isHtmlForHuman())
+    if ($this->response->isHtmlForHuman())
     {
-      
$this->context->getResponse()->setAssetConfig($this->context->get('asset_config'));
+      $this->response->setAssetConfig($this->context->get('asset_config'));
     }
   }
   
@@ -27,7 +45,7 @@
     
     $appUrlKey = implode('-', array(sfConfig::get('sf_app'), 
sfConfig::get('sf_environment')));
     
-    $appUrl    = 
$this->request->getUriPrefix().$this->context->getRequest()->getScriptName();
+    $appUrl    = 
$this->request->getUriPrefix().$this->request->getScriptName();
       
     if (!isset($knownBaseUrls[$appUrlKey]) || $knownBaseUrls[$appUrlKey] !== 
$appUrl)
     {

Added: 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLock.class.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLock.class.php 
                            (rev 0)
+++ 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLock.class.php 
    2010-01-28 19:52:10 UTC (rev 27286)
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * PluginDmLock
+ * 
+ * This class has been auto-generated by the Doctrine ORM Framework
+ * 
+ * @package    ##PACKAGE##
+ * @subpackage ##SUBPACKAGE##
+ * @author     ##NAME## <##EMAIL##>
+ * @version    SVN: $Id: Builder.php 7021 2010-01-12 20:39:49Z lsmith $
+ */
+abstract class PluginDmLock extends BaseDmLock
+{
+
+}
\ No newline at end of file

Added: 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLockTable.class.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLockTable.class.php
                                (rev 0)
+++ 
plugins/diemPlugin/trunk/dmCorePlugin/lib/model/doctrine/PluginDmLockTable.class.php
        2010-01-28 19:52:10 UTC (rev 27286)
@@ -0,0 +1,100 @@
+<?php
+/**
+ */
+class PluginDmLockTable extends myDoctrineTable
+{
+
+  /*
+   * @return array usernames of current active users on the same page
+   */
+  public function getLocks(array $data)
+  {
+    $locks = dmDb::pdo(
+      sprintf(
+        'SELECT DISTINCT a.user_name FROM %s a WHERE a.user_id != ? AND 
a.module = ? AND a.action = ? AND a.record_id = ? ORDER BY a.user_name ASC',
+        $this->getTableName()
+      ),
+      array($data['user_id'], $data['module'], $data['action'], 
$data['record_id'])
+    )->fetchAll(PDO::FETCH_NUM);
+
+    return $this->toUsernames($locks);
+  }
+
+  /*
+   * @return array usernames of current active users
+   */
+  public function getUserNames()
+  {
+    $locks = dmDb::pdo(
+      sprintf('SELECT DISTINCT a.user_name FROM %s a ORDER BY a.user_name 
ASC', $this->getTableName()),
+      array()
+    )->fetchAll(PDO::FETCH_NUM);
+
+    return $this->toUsernames($locks);
+  }
+
+  protected function toUsernames(array $locks)
+  {
+    $usernames = array();
+    foreach($locks as $lock)
+    {
+      $usernames[] = $lock[0];
+    }
+
+    return $usernames;
+  }
+
+  /*
+   * When a user displays a page
+   */
+  public function update(array $data)
+  {
+    $lock = $this->findOneByData($data);
+
+    if(!$lock)
+    {
+      $lock = $this->create($data)->saveGet();
+    }
+    else
+    {
+      $lock->merge($data)->save();
+    }
+
+    $this->removeOldLocks();
+  }
+
+  /*
+   * When receiving an ajax ping
+   */
+  public function ping(array $data)
+  {
+    $lock = $this->findOneByData($data);
+
+    if(!$lock)
+    {
+      throw new dmException('No lock for '.implode(', ', $data));
+    }
+    
+    $lock->merge($data)->save();
+
+    $this->removeOldLocks();
+  }
+
+  public function removeOldLocks()
+  {
+    dmDb::pdo(
+      sprintf('DELETE FROM %s WHERE time < ?', $this->getTableName()),
+      array($_SERVER['REQUEST_TIME'] - 
sfConfig::get('dm_security_active_user_timeout', 10))
+    );
+  }
+
+  public function findOneByData(array $data)
+  {
+    return $this->createQuery('a')
+    ->where('a.user_id = ?', $data['user_id'])
+    ->andWhere('a.module = ?', $data['module'])
+    ->andWhere('a.action = ?', $data['action'])
+    ->andWhere('a.record_id = ?', $data['record_id'])
+    ->fetchRecord();
+  }
+}
\ No newline at end of file

Modified: 
plugins/diemPlugin/trunk/dmCorePlugin/lib/view/html/layout/dmCoreLayoutHelper.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmCorePlugin/lib/view/html/layout/dmCoreLayoutHelper.php
   2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmCorePlugin/lib/view/html/layout/dmCoreLayoutHelper.php
   2010-01-28 19:52:10 UTC (rev 27286)
@@ -217,7 +217,8 @@
       'script_name'        => sfConfig::get('sf_no_script_name') ? 
trim($requestContext['relative_url_root'], '/').'/' : 
$requestContext['script_name'].'/',
       'debug'              => sfConfig::get('sf_debug') ? true : false,
       'culture'            => 
$this->serviceContainer->getParameter('user.culture'),
-      'module'             => 
$this->serviceContainer->getParameter('controller.module')
+      'module'             => 
$this->serviceContainer->getParameter('controller.module'),
+      'action'             => 
$this->serviceContainer->getParameter('controller.action')
     ));
   }
   

Modified: 
plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/config/security.yml
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/config/security.yml    
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/config/security.yml    
2010-01-28 19:52:10 UTC (rev 27286)
@@ -12,4 +12,8 @@
 
 thumbnail:
   is_secure:    true
+  credential:   admin
+
+ping:
+  is_secure:    true
   credential:   admin
\ No newline at end of file

Modified: 
plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/lib/BasedmCoreActions.class.php
===================================================================
--- 
plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/lib/BasedmCoreActions.class.php
        2010-01-28 19:44:36 UTC (rev 27285)
+++ 
plugins/diemPlugin/trunk/dmCorePlugin/modules/dmCore/lib/BasedmCoreActions.class.php
        2010-01-28 19:52:10 UTC (rev 27286)
@@ -2,6 +2,42 @@
 
 class BasedmCoreActions extends dmBaseActions
 {
+  
+  public function executePing(dmWebRequest $request)
+  {
+    $recordId = $this->request->getParameter('record_id', 0);
+    
+    $data = array(
+      'user_id'   => $this->getUser()->getUserId(),
+      'time'      => $_SERVER['REQUEST_TIME'],
+      'app'       => sfConfig::get('sf_app'),
+      'module'    => $this->request->getParameter('sf_module'),
+      'action'    => $this->request->getParameter('sf_action'),
+      'record_id' => $recordId,
+      'culture'   => $this->getUser()->getCulture()
+    );
+    
+    dmDb::table('DmLock')->ping($data);
+
+    $users = dmDb::table('DmLock')->getUserNames();
+    $locks = $recordId ? dmDb::table('DmLock')->getLocks($data) : array();
+
+    if(!empty($locks))
+    {
+      foreach($locks as $index => $lock)
+      {
+        $locks[$index] = $this->getService('i18n')->__('%user% is browsing 
this page, you should not modify it now.', array(
+          '%user%' => '<strong>'.$lock.'</strong>'
+          ));
+      }
+    }
+
+    return $this->renderJson(array(
+      'users' => implode('|', $users),
+      'locks' => implode('|', $locks)
+    ));
+  }
+  
   public function executeThumbnail(dmWebRequest $request)
   {
     $tag = $this->getHelper()->£media($request->getParameter('source'));

Modified: plugins/diemPlugin/trunk/dmCorePlugin/web/css/mediaBar.css
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/web/css/mediaBar.css  2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/web/css/mediaBar.css  2010-01-28 
19:52:10 UTC (rev 27286)
@@ -21,6 +21,7 @@
   overflow: hidden;
   font-size: 11px;
   -moz-box-shadow: -3px 0 4px #888;
+  -webkit-box-shadow: -3px 0 4px #888;
 }
 
 #dm_media_bar_toggler {

Modified: plugins/diemPlugin/trunk/dmCorePlugin/web/css/pageBar.css
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/web/css/pageBar.css   2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/web/css/pageBar.css   2010-01-28 
19:52:10 UTC (rev 27286)
@@ -21,6 +21,7 @@
   overflow: hidden;
   font-size: 11px;
   -moz-box-shadow: 3px 0 4px #888;
+  -webkit-box-shadow: 3px 0 4px #888;
 }
 
 #dm_page_bar_toggler {

Modified: plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCoreEditCtrl.js
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCoreEditCtrl.js      
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCoreEditCtrl.js      
2010-01-28 19:52:10 UTC (rev 27286)
@@ -2,6 +2,11 @@
 {
 
   $.dm.coreEditCtrl = $.extend($.dm.coreCtrl, {
+
+    launchPing: function()
+    {
+      $.dm.ping.init(this.options);
+    },
   
     liveEvents: function()
     {
@@ -12,6 +17,8 @@
         {
           return false;
         }
+        
+        return true;
       });
                        
       $('div.ui-dialog a.close_dialog').live('click', function()

Added: plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCorePing.js
===================================================================
--- plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCorePing.js                  
        (rev 0)
+++ plugins/diemPlugin/trunk/dmCorePlugin/web/js/dmCorePing.js  2010-01-28 
19:52:10 UTC (rev 27286)
@@ -0,0 +1,52 @@
+(function($)
+{
+
+  $.dm.corePing = {
+
+    options: {},
+
+    initCore: function(options)
+    {
+      var self = $.dm.ping;
+
+      self.options = $.extend({
+        delay:    3000,
+        url:      $.dm.ctrl.getHref('+/dmCore/ping')
+      }, options || {});
+
+      self.ping();
+    },
+
+    ping: function()
+    {
+      var self = $.dm.ping;
+
+      $.ajax({
+        dataType: 'json',
+        url:      self.options.url,
+        data:     self.getPingData(),
+        success:  self.pong,
+        error:    self.pong
+      });
+    },
+
+    getPingData: function()
+    {
+      var self = $.dm.ping;
+
+      return {
+        sf_module:  self.options.module,
+        sf_action:  self.options.action,
+        record_id:  self.options.record_id
+      };
+    },
+
+    pong: function(data)
+    {
+      var self = $.dm.ping;
+
+      setTimeout(self.ping, self.options.delay);
+    }
+  };
+  
+})(jQuery);
\ No newline at end of file

Modified: 
plugins/diemPlugin/trunk/dmFrontPlugin/lib/filter/dmFrontInitFilter.php
===================================================================
--- plugins/diemPlugin/trunk/dmFrontPlugin/lib/filter/dmFrontInitFilter.php     
2010-01-28 19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmFrontPlugin/lib/filter/dmFrontInitFilter.php     
2010-01-28 19:52:10 UTC (rev 27286)
@@ -37,10 +37,10 @@
   {
     if (($page = $this->context->getPage()) && ($h1 = $page->_getI18n('h1')))
     {
-      $this->context->getResponse()->setContent(preg_replace(
+      $this->response->setContent(preg_replace(
         '|<h1(.*)>.*</h1>|iuU',
         '<h1$1>'.$h1.'</h1>',
-        $this->context->getResponse()->getContent()
+        $this->response->getContent()
       ));
     }
   }

Modified: plugins/diemPlugin/trunk/dmFrontPlugin/web/css/toolBar.css
===================================================================
--- plugins/diemPlugin/trunk/dmFrontPlugin/web/css/toolBar.css  2010-01-28 
19:44:36 UTC (rev 27285)
+++ plugins/diemPlugin/trunk/dmFrontPlugin/web/css/toolBar.css  2010-01-28 
19:52:10 UTC (rev 27286)
@@ -80,6 +80,7 @@
   overflow: auto;
   background: #fff;
   -moz-box-shadow: 4px -4px 4px #888;
+  -webkit-box-shadow: 4px -4px 4px #888;
 }
 
 #dm_tool_bar ul.level0 > li.ui-state-active ul.level1 {

-- 
You received this message because you are subscribed to the Google Groups 
"symfony SVN" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/symfony-svn?hl=en.

Reply via email to