<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.barros.ws &#187; behavior</title>
	<atom:link href="http://blog.barros.ws/tag/behavior/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.barros.ws</link>
	<description>web development tips</description>
	<lastBuildDate>Sun, 06 Jun 2010 00:34:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>sfPropelActAsSortableBehaviorPlugin group patch</title>
		<link>http://blog.barros.ws/2009/02/20/sfpropelactassortablebehaviorplugin-group-patch/</link>
		<comments>http://blog.barros.ws/2009/02/20/sfpropelactassortablebehaviorplugin-group-patch/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 14:17:33 +0000</pubDate>
		<dc:creator>Carlos Barros</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://blog.barros.ws/?p=145</guid>
		<description><![CDATA[I guess that most Symfony developers should know this Symfony plugin, but for those who not, here&#8217;s an small quote:
&#8220;The sfPropelActAsSortableBehaviorPlugin is a symfony plugin that provides a new Propel behavior.Model classes with this behavior enabled become sortable, which means that they have new methods to deal with a position attribute.&#8221;
This Symfony plugin is really [...]]]></description>
			<content:encoded><![CDATA[<p>I guess that most Symfony developers should know this Symfony plugin, but for those who not, here&#8217;s an small quote:</p>
<p><em>&#8220;The sfPropelActAsSortableBehaviorPlugin is a symfony plugin that provides a new Propel behavior.Model classes with this behavior enabled become sortable, which means that they have new methods to deal with a position attribute.&#8221;</em></p>
<p>This Symfony plugin is really useful as it can save you a lot of code if you need to sort your objects, but in a recent project I worked on, I noticed this plugin lacks one functionality: it can&#8217;t handle <em>&#8220;sorting groups&#8221;</em> within the same object. For instance, suppose you have an Product and Category tables, and that each product belongs to a single category. Then, suppose you want to be able to sort your products so you can control how they show up in your pages. Using sfPropelActAsSortableBehaviorPlugin you can only sort the <b>entire</b> Product table, and that&#8217;s not really what we want. We need to be able to sort products within each category.<br />
I guess this problem is really common, and as I had to handle this in a recent project, I decided to write a patch for this plugin, and I&#8217;d like to share it. Before one ask me why I didn&#8217;t submit it as a official ticket, the reason is that there is already a patch submitted to handle this issue, from almost a year ago, that was not released yet, and I bet most people (including me) is not aware of, so I&#8217;m writing this post to tell about this for other users, and maybe make Kris Wallsmith (current leader) release his version, that in fact seem to be more powerful than mine, as it support creating sorting groups using more than one column.</p>
<p>So, how does it work?? sfPropelActAsSortableBehaviorPlugin is really simple to use, all you need is a <b>Integer</b> column in your model, and then activate the new behavior for you class using something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">sfPropelBehavior<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Item'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'act_as_sortable'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'column'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'rank'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>After applying this patch, the only thing you need to do is to add one more element to the above array:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">sfPropelBehavior<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Item'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'act_as_sortable'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'column'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'rank'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'group'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'category_id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>And that&#8217;s it. New sfPropelActAsSortableBehaviorPlugin will use &#8220;category_id&#8221; as a <em>&#8220;sorting group&#8221;</em>. </p>
<p>You can now use all methods provided by the new behavior to sort your objects, just like you used to do without the patch. Also, if you don&#8217;t have a group category, just omit it from behavior initialization, and it will work as if u didn&#8217;t apply this patch.</p>
<p>Find below the full patch:</p>
<p><span id="more-145"></span></p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">diff -ur sfPropelActAsSortableBehaviorPlugin-0.6.1/lib/sfPropelActAsSortableBehavior.class.php sfPropelActAsSortableBehaviorPlugin-0.6.1-new/lib/sfPropelActAsSortableBehavior.class.php
<span style="color: #888822;">--- sfPropelActAsSortableBehaviorPlugin-0.6.1/lib/sfPropelActAsSortableBehavior.class.php	<span style="">2007</span>-08-07 <span style="">10</span>:<span style="">56</span>:<span style="">57.000000000</span> -0300</span>
<span style="color: #888822;">+++ sfPropelActAsSortableBehaviorPlugin-0.6.1-new/lib/sfPropelActAsSortableBehavior.class.php	<span style="">2009</span>-02-<span style="">20</span> <span style="">10</span>:<span style="">59</span>:<span style="">25.000000000</span> -0300</span>
<span style="color: #440088;">@@ -<span style="">21</span>,<span style="">14</span> +<span style="">21</span>,<span style="">18</span> @@</span>
    *
    * @return mixed sortable object
    **/
<span style="color: #991111;">-  public static function retrieveByPosition<span style="">&#40;</span>$peerClass, $position, $con = null<span style="">&#41;</span></span>
<span style="color: #00b000;">+  public static function retrieveByPosition<span style="">&#40;</span>$peerClass, $position, $con = null, $group = null<span style="">&#41;</span></span>
   <span style="">&#123;</span>
     $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_column', 'rank'<span style="">&#41;</span>;
<span style="color: #991111;">-    $rankColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_group'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $groupColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $groupColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    </span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
     $c = new Criteria;
<span style="color: #991111;">-    $c-&gt;add<span style="">&#40;</span>$rankColumnPhpName, $position<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $c-&gt;add<span style="">&#40;</span>$rankColumnPhpName, $position<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $c-&gt;add<span style="">&#40;</span>$groupColumnPhpName, $group<span style="">&#41;</span>;</span>
&nbsp;
     return call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'doSelectOne'<span style="">&#41;</span>, $c, $con<span style="">&#41;</span>; 
   <span style="">&#125;</span>
<span style="color: #440088;">@@ -<span style="">41</span>,<span style="">16</span> +<span style="">45</span>,<span style="">26</span> @@</span>
    *
    * @return integer maximum position
    **/
<span style="color: #991111;">-  public static function getMaxPosition<span style="">&#40;</span>$peerClass, $con = null<span style="">&#41;</span></span>
<span style="color: #00b000;">+  public static function getMaxPosition<span style="">&#40;</span>$peerClass, $con = null, $group = null<span style="">&#41;</span></span>
   <span style="">&#123;</span>
<span style="color: #991111;">-    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_group'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    </span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
     $sql = sprintf<span style="">&#40;</span>'SELECT MAX<span style="">&#40;</span>%s<span style="">&#41;</span> AS max FROM %s', 
       $rankColumnName,
       constant<span style="">&#40;</span>&quot;$peerClass::TABLE_NAME&quot;<span style="">&#41;</span>
<span style="color: #991111;">-    <span style="">&#41;</span>; </span>
<span style="color: #991111;">-    $rs = $con-&gt;prepareStatement<span style="">&#40;</span>$sql<span style="">&#41;</span>-&gt;executeQuery<span style="">&#40;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    <span style="">&#41;</span>; </span>
<span style="color: #00b000;">+    </span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span></span>
<span style="color: #00b000;">+    <span style="">&#123;</span></span>
<span style="color: #00b000;">+    	$sql .= sprintf<span style="">&#40;</span>&quot; WHERE %s = ?&quot;,$groupColumnName<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    	$stmt = $con-&gt;prepareStatement<span style="">&#40;</span>$sql<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    	$stmt-&gt;setString<span style="">&#40;</span><span style="">1</span>,$group<span style="">&#41;</span>;	</span>
<span style="color: #00b000;">+    <span style="">&#125;</span></span>
<span style="color: #00b000;">+    else $stmt = $con-&gt;prepareStatement<span style="">&#40;</span>$sql<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rs = $stmt-&gt;executeQuery<span style="">&#40;</span><span style="">&#41;</span>;</span>
     $rs-&gt;next<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
     return $rs-&gt;getInt<span style="">&#40;</span>'max'<span style="">&#41;</span>;
<span style="color: #440088;">@@ -<span style="">66</span>,<span style="">10</span> +<span style="">80</span>,<span style="">13</span> @@</span>
    *
    * @return array list of sortable objects
    **/
<span style="color: #991111;">-  public static function doSelectOrderByPosition<span style="">&#40;</span>$peerClass, $order = Criteria::ASC, $criteria = null, $con = null<span style="">&#41;</span></span>
<span style="color: #00b000;">+  public static function doSelectOrderByPosition<span style="">&#40;</span>$peerClass, $order = Criteria::ASC, $criteria = null, $con = null, $group = null<span style="">&#41;</span></span>
   <span style="">&#123;</span>
     $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_column', 'rank'<span style="">&#41;</span>;
<span style="color: #991111;">-    $rankColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.self::getClassFromPeerClass<span style="">&#40;</span>$peerClass<span style="">&#41;</span>.'_group'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $groupColumnPhpName = call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'translateFieldName'<span style="">&#41;</span>, $groupColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    </span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
     if <span style="">&#40;</span>$criteria === null<span style="">&#41;</span> 
<span style="color: #440088;">@@ -<span style="">90</span>,<span style="">7</span> +<span style="">107</span>,<span style="">8</span> @@</span>
     else
     <span style="">&#123;</span>
       $criteria-&gt;addDescendingOrderByColumn<span style="">&#40;</span>$rankColumnPhpName<span style="">&#41;</span>;
<span style="color: #991111;">-    <span style="">&#125;</span></span>
<span style="color: #00b000;">+    <span style="">&#125;</span></span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $c-&gt;add<span style="">&#40;</span>$groupColumnPhpName,$group<span style="">&#41;</span>;</span>
&nbsp;
     return call_user_func<span style="">&#40;</span>array<span style="">&#40;</span>$peerClass, 'doSelect'<span style="">&#41;</span>, $criteria, $con<span style="">&#41;</span>; 
   <span style="">&#125;</span>
<span style="color: #440088;">@@ -<span style="">159</span>,<span style="">6</span> +<span style="">177</span>,<span style="">32</span> @@</span>
   public function setPosition<span style="">&#40;</span>$object, $position<span style="">&#41;</span>
   <span style="">&#123;</span>
     return $object-&gt;setByName<span style="">&#40;</span>sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'_column', 'rank'<span style="">&#41;</span>, $position, BasePeer::TYPE_FIELDNAME<span style="">&#41;</span>;
<span style="color: #00b000;">+  <span style="">&#125;</span></span>
<span style="color: #00b000;">+  </span>
<span style="color: #00b000;">+  /**</span>
<span style="color: #00b000;">+   * Gets the group of a sortable object</span>
<span style="color: #00b000;">+   * </span>
<span style="color: #00b000;">+   * @param mixed sortable object</span>
<span style="color: #00b000;">+   * </span>
<span style="color: #00b000;">+   * @return mixed group of the sortable object</span>
<span style="color: #00b000;">+   */</span>
<span style="color: #00b000;">+  public function getGroup<span style="">&#40;</span>$object<span style="">&#41;</span></span>
<span style="color: #00b000;">+  <span style="">&#123;</span></span>
<span style="color: #00b000;">+   	$groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'_group'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+   	if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> return $object-&gt;getByName<span style="">&#40;</span>$groupColumnName, BasePeer::TYPE_FIELDNAME<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+   	else return null;</span>
<span style="color: #00b000;">+  <span style="">&#125;</span></span>
<span style="color: #00b000;">+  </span>
<span style="color: #00b000;">+  /**</span>
<span style="color: #00b000;">+   * Sets the group of a sortable object</span>
<span style="color: #00b000;">+   * </span>
<span style="color: #00b000;">+   * @param mixed sortable object</span>
<span style="color: #00b000;">+   * @param mixed group value</span>
<span style="color: #00b000;">+   */</span>
<span style="color: #00b000;">+  public function setGroup<span style="">&#40;</span>$object, $group<span style="">&#41;</span></span>
<span style="color: #00b000;">+  <span style="">&#123;</span></span>
<span style="color: #00b000;">+  	$groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'_group'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+  	if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> return $object-&gt;setByName<span style="">&#40;</span>$groupColumnName, $group, BasePeer::TYPE_FIELDNAME<span style="">&#41;</span>;</span>
   <span style="">&#125;</span>
&nbsp;
   /**
<span style="color: #440088;">@@ -<span style="">170</span>,<span style="">7</span> +<span style="">214</span>,<span style="">7</span> @@</span>
    **/
   public function getNext<span style="">&#40;</span>$object<span style="">&#41;</span>
   <span style="">&#123;</span>
<span style="color: #991111;">-    return self::retrieveByPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer', self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> + <span style="">1</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    return self::retrieveByPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer', self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> + <span style="">1</span>, null, self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
   <span style="">&#125;</span>
&nbsp;
   /**
<span style="color: #440088;">@@ -<span style="">182</span>,<span style="">7</span> +<span style="">226</span>,<span style="">7</span> @@</span>
    **/
   public function getPrevious<span style="">&#40;</span>$object<span style="">&#41;</span>
   <span style="">&#123;</span>
<span style="color: #991111;">-    return self::retrieveByPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer', self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> - <span style="">1</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    return self::retrieveByPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer', self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> - <span style="">1</span>, null, self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
   <span style="">&#125;</span>
&nbsp;
   /**
<span style="color: #440088;">@@ -<span style="">206</span>,<span style="">7</span> +<span style="">250</span>,<span style="">7</span> @@</span>
    **/    
   public function isLast<span style="">&#40;</span>$object<span style="">&#41;</span>
   <span style="">&#123;</span>
<span style="color: #991111;">-    return self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> == self::getMaxPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    return self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span> == self::getMaxPosition<span style="">&#40;</span>get_class<span style="">&#40;</span>$object<span style="">&#41;</span>.'Peer', null, self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
   <span style="">&#125;</span>
&nbsp;
   /**
<span style="color: #440088;">@@ -<span style="">286</span>,<span style="">31</span> +<span style="">330</span>,<span style="">36</span> @@</span>
   <span style="">&#123;</span>
     $class = get_class<span style="">&#40;</span>$object<span style="">&#41;</span>;
     $peerClass = $class.'Peer';
<span style="color: #991111;">-    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_group'<span style="">&#41;</span>;</span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
     $oldPosition = self::getPosition<span style="">&#40;</span>$object<span style="">&#41;</span>;
     if <span style="">&#40;</span>$oldPosition == $newPosition<span style="">&#41;</span> return $oldPosition;
<span style="color: #991111;">-</span>
<span style="color: #00b000;">+</span>
     try
     <span style="">&#123;</span>
       $con-&gt;begin<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
       // Move the object away
<span style="color: #991111;">-      self::setPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass<span style="">&#41;</span> + <span style="">1</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      self::setPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass,null,self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span> + <span style="">1</span><span style="">&#41;</span>;</span>
       $object-&gt;save<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
       // Shift the objects between the old and the new position
<span style="color: #991111;">-      $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s %s <span style="">1</span> WHERE %s BETWEEN ? AND ?',</span>
<span style="color: #00b000;">+      $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s %s <span style="">1</span> WHERE %s BETWEEN ? AND ?%s',</span>
         constant<span style="">&#40;</span>&quot;$peerClass::TABLE_NAME&quot;<span style="">&#41;</span>,
         $rankColumnName,
         $rankColumnName,
         <span style="">&#40;</span>$oldPosition &lt; $newPosition<span style="">&#41;</span> ? '-' : '+',
<span style="color: #991111;">-        $rankColumnName</span>
<span style="color: #991111;">-      <span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        $rankColumnName,</span>
<span style="color: #00b000;">+        $groupColumnName?&quot; AND $groupColumnName = ?&quot;:&quot;&quot;</span>
<span style="color: #00b000;">+        </span>
<span style="color: #00b000;">+      <span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      </span>
       $stmt = $con-&gt;prepareStatement<span style="">&#40;</span>$query<span style="">&#41;</span>;
       $stmt-&gt;setInt<span style="">&#40;</span><span style="">1</span>, min<span style="">&#40;</span>$oldPosition, $newPosition<span style="">&#41;</span><span style="">&#41;</span>;
<span style="color: #991111;">-      $stmt-&gt;setInt<span style="">&#40;</span><span style="">2</span>, max<span style="">&#40;</span>$oldPosition, $newPosition<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      $stmt-&gt;setInt<span style="">&#40;</span><span style="">2</span>, max<span style="">&#40;</span>$oldPosition, $newPosition<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $stmt-&gt;setString<span style="">&#40;</span><span style="">3</span>,self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
       $stmt-&gt;executeQuery<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
       // Move the object back in
<span style="color: #440088;">@@ -<span style="">357</span>,<span style="">9</span> +<span style="">406</span>,<span style="">9</span> @@</span>
   public function moveToBottom<span style="">&#40;</span>$object, $con = null<span style="">&#41;</span>
   <span style="">&#123;</span>
     $class = get_class<span style="">&#40;</span>$object<span style="">&#41;</span>;
<span style="color: #991111;">-    $peerClass = $class.'Peer';</span>
<span style="color: #991111;">-</span>
<span style="color: #991111;">-    return self::moveToPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass<span style="">&#41;</span>, $con<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $peerClass = $class.'Peer';</span>
<span style="color: #00b000;">+    </span>
<span style="color: #00b000;">+    return self::moveToPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass,null,self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>, $con<span style="">&#41;</span>;</span>
   <span style="">&#125;</span>
&nbsp;
   /**
<span style="color: #440088;">@@ -<span style="">378</span>,<span style="">7</span> +<span style="">427</span>,<span style="">8</span> @@</span>
   <span style="">&#123;</span>
     $class = get_class<span style="">&#40;</span>$object<span style="">&#41;</span>;
     $peerClass = $class.'Peer';
<span style="color: #991111;">-    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_group'<span style="">&#41;</span>;</span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
     try
<span style="color: #440088;">@@ -<span style="">386</span>,<span style="">14</span> +<span style="">436</span>,<span style="">16</span> @@</span>
       $con-&gt;begin<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
       // Shift the objects with a position higher than the given position
<span style="color: #991111;">-      $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s + <span style="">1</span> WHERE %s &gt;= ?',</span>
<span style="color: #00b000;">+      $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s + <span style="">1</span> WHERE %s &gt;= ?%s',</span>
         constant<span style="">&#40;</span>&quot;$peerClass::TABLE_NAME&quot;<span style="">&#41;</span>,
         $rankColumnName,
         $rankColumnName,
<span style="color: #991111;">-        $rankColumnName</span>
<span style="color: #00b000;">+        $rankColumnName,</span>
<span style="color: #00b000;">+        $groupColumnName?&quot; AND $groupColumnName = ?&quot;:&quot;&quot;</span>
       <span style="">&#41;</span>;
       $stmt = $con-&gt;prepareStatement<span style="">&#40;</span>$query<span style="">&#41;</span>;
<span style="color: #991111;">-      $stmt-&gt;setInt<span style="">&#40;</span><span style="">1</span>, $position<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      $stmt-&gt;setInt<span style="">&#40;</span><span style="">1</span>, $position<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $stmt-&gt;setString<span style="">&#40;</span><span style="">2</span>,self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
       $stmt-&gt;executeQuery<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
       // Move the object in the list, at the given position
<span style="color: #440088;">@@ -<span style="">427</span>,<span style="">7</span> +<span style="">479</span>,<span style="">7</span> @@</span>
     // new records need to be initialized with position = maxPosition +<span style="">1</span> unless position is already set
     if<span style="">&#40;</span>!$object-&gt;getId<span style="">&#40;</span><span style="">&#41;</span> &amp;&amp; !$object-&gt;isColumnModified<span style="">&#40;</span>$rankColumnPhpName<span style="">&#41;</span><span style="">&#41;</span>
     <span style="">&#123;</span>
<span style="color: #991111;">-      self::setPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass<span style="">&#41;</span>+<span style="">1</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      self::setPosition<span style="">&#40;</span>$object, self::getMaxPosition<span style="">&#40;</span>$peerClass,null,self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>+<span style="">1</span><span style="">&#41;</span>;</span>
     <span style="">&#125;</span>
   <span style="">&#125;</span> 
&nbsp;
<span style="color: #440088;">@@ -<span style="">442</span>,<span style="">17</span> +<span style="">494</span>,<span style="">20</span> @@</span>
   <span style="">&#123;</span>  
     $class = get_class<span style="">&#40;</span>$object<span style="">&#41;</span>;
     $peerClass = $class.'Peer';
<span style="color: #991111;">-    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $rankColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_column', 'rank'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $groupColumnName = sfConfig::get<span style="">&#40;</span>'propel_behavior_act_as_sortable_'.$class.'_group'<span style="">&#41;</span>;</span>
     if<span style="">&#40;</span>!$con<span style="">&#41;</span> $con = Propel::getConnection<span style="">&#40;</span>constant<span style="">&#40;</span>&quot;$peerClass::DATABASE_NAME&quot;<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
<span style="color: #991111;">-    $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s - <span style="">1</span> WHERE %s &gt; ?',</span>
<span style="color: #00b000;">+    $query = sprintf<span style="">&#40;</span>'UPDATE %s SET %s = %s - <span style="">1</span> WHERE %s &gt; ?%s',</span>
       constant<span style="">&#40;</span>&quot;$peerClass::TABLE_NAME&quot;<span style="">&#41;</span>,
       $rankColumnName,
       $rankColumnName,
<span style="color: #991111;">-      $rankColumnName</span>
<span style="color: #00b000;">+      $rankColumnName,</span>
<span style="color: #00b000;">+      $groupColumnName?&quot; AND $groupColumnName = ?&quot;:&quot;&quot;</span>
     <span style="">&#41;</span>;
     $stmt = $con-&gt;prepareStatement<span style="">&#40;</span>$query<span style="">&#41;</span>;
<span style="color: #991111;">-    $stmt-&gt;setInt<span style="">&#40;</span><span style="">1</span>, $object-&gt;getPosition<span style="">&#40;</span><span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $stmt-&gt;setInt<span style="">&#40;</span><span style="">1</span>, $object-&gt;getPosition<span style="">&#40;</span><span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    if<span style="">&#40;</span>$groupColumnName<span style="">&#41;</span> $stmt-&gt;setString<span style="">&#40;</span><span style="">2</span>, self::getGroup<span style="">&#40;</span>$object<span style="">&#41;</span><span style="">&#41;</span>;</span>
     $stmt-&gt;executeQuery<span style="">&#40;</span><span style="">&#41;</span>;
   <span style="">&#125;</span>
 <span style="">&#125;</span></pre></div></div>

<p>You can also <a href="/files/sfPropelActAsSortableBehaviorPlugin-0.6.1.diff">download the patch here</a>.<br />
For those who want to take a look at Kris Wallsmith&#8217;s patch, just <a href="http://trac.symfony-project.org/ticket/3240" target="_blank">click here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.barros.ws/2009/02/20/sfpropelactassortablebehaviorplugin-group-patch/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
