-
Notifications
You must be signed in to change notification settings - Fork 418
/
SortableRelationBehavior.php
102 lines (84 loc) · 2.88 KB
/
SortableRelationBehavior.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
* This file is part of the Propel package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
/**
* Moves objects to the end of null scope of related table
*
* @author rozwell
* @version $Revision$
* @package propel.generator.behavior.sortable
*/
class SortableRelationBehavior extends Behavior
{
protected $builder;
protected $name = 'sortable_relation';
// default parameters value
protected $parameters = array(
'foreign_table' => '',
'foreign_scope_column' => '',
'foreign_rank_column' => '',
);
public function objectMethods($builder)
{
$script = '';
$this->addObjectMoveRelatedToNullScope($script);
return $script;
}
public function preDelete($builder)
{
$this->builder = $builder;
$script = "\$this->{$this->getObjectMoveRelatedToNullScopeMethodName()}(\$con);
";
return $script;
}
protected function getForeignTable()
{
return $this->getTable()->getDatabase()->getTable($this->getParameter('foreign_table'));
}
protected function getForeignColumnForParameter($param)
{
return $this->getForeignTable()->getColumn($this->getParameter($param));
}
protected function getRelatedClassPluralForm()
{
$relatedClass = $this->getForeignTable()->getPhpName();
return $this->builder->getPluralizer()->getPluralForm($relatedClass);
}
protected function getObjectMoveRelatedToNullScopeMethodName()
{
return "moveRelated{$this->getRelatedClassPluralForm()}ToNullScope";
}
protected function addObjectMoveRelatedToNullScope(&$script)
{
$database = $this->getTable()->getDatabase();
$tableName = $database->getTablePrefix() . $this->getParameter('foreign_table');
$peer = $this->builder->getNewStubPeerBuilder($this->getForeignTable())->getClassname();
$maxSql = sprintf('SELECT MAX(%s) FROM %s WHERE %s IS NULL',
$this->getForeignColumnForParameter('foreign_rank_column')->getName(),
$database->getPlatform()->quoteIdentifier($tableName),
$this->getForeignColumnForParameter('foreign_scope_column')->getFullyQualifiedName()
);
$script .= "
/**
* Moves related {$this->getRelatedClassPluralForm()} to null scope
* @param PropelPDO \$con A connection object
*/
public function {$this->getObjectMoveRelatedToNullScopeMethodName()}(PropelPDO \$con = null)
{
if (\$con === null) {
\$con = Propel::getConnection($peer::DATABASE_NAME, Propel::CONNECTION_WRITE);
}
\$stmt = \$con->prepare('$maxSql');
\$stmt->execute();
\$maxRank = (int)\$stmt->fetchColumn();
$peer::shiftRank(\$maxRank, null, null, \$this->getPrimaryKey(), \$con);
}
";
return $script;
}
}