source: contrib/ProjectManager/inc/class.soconstraints.inc.php @ 3594

Revision 3594, 7.9 KB checked in by afernandes, 13 years ago (diff)

Ticket #1416 - Disponibilizado o módulo ProjectManager? para a comunidade

  • Property svn:executable set to *
Line 
1<?php
2/**
3 * ProjectManager - Constraints storage object
4 *
5 * @link http://www.egroupware.org
6 * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
7 * @package projectmanager
8 * @copyright (c) 2005 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
9 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
10 * @version $Id: class.soconstraints.inc.php 22355 2006-08-26 16:30:45Z ralfbecker $
11 */
12
13include_once(PHPGW_INCLUDE_ROOT.'/etemplate/inc/class.so_sql.inc.php');
14
15/**
16 * Constraints storage object of the projectmanager
17 *
18 * There are 3 constraint-types:
19 * - start:     PE has to start after an other PE (own pe_id is in pe_id_start)
20 * - end:       PE has to end before the start an other PE (own pe_id is in pe_id_end)
21 * - milestone: PE has to end before a milestone (own pe_id is in pe_id_end)
22 *
23 * Tables: phpgw_pm_constraints
24 */
25class soconstraints extends so_sql
26{
27        /**
28         * Constructor, calls the constructor of the extended class
29         *
30         * @param int $pm_id pm_id of the project to use, default null
31         */
32        function soconstraints($pm_id=null)
33        {
34                $this->so_sql('projectmanager','phpgw_pm_constraints');
35
36                if ((int) $pm_id)
37                {
38                        $this->pm_id = (int) $pm_id;
39                }
40        }
41
42        /**
43         * searches db for rows matching searchcriteria, reimplemented to automatic add $this->pm_id
44         *
45         * '*' and '?' are replaced with sql-wildcards '%' and '_'
46         *
47         * @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
48         * @param boolean $only_keys=true True returns only keys, False returns all cols
49         * @param string $order_by='' fieldnames + {ASC|DESC} separated by colons ',', can also contain a GROUP BY (if it contains ORDER BY)
50         * @param string/array $extra_cols='' string or array of strings to be added to the SELECT, eg. "count(*) as num"
51         * @param string $wildcard='' appended befor and after each criteria
52         * @param boolean $empty=false False=empty criteria are ignored in query, True=empty have to be empty in row
53         * @param string $op='AND' defaults to 'AND', can be set to 'OR' too, then criteria's are OR'ed together
54         * @param mixed $start=false if != false, return only maxmatch rows begining with start, or array($start,$num)
55         * @param array $filter=null if set (!=null) col-data pairs, to be and-ed (!) into the query without wildcards
56         * @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
57         *      "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
58         * @return array of matching rows (the row is an array of the cols) or False
59         */
60        function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='')
61        {
62                if (!$this->pm_id && !isset($criteria['pm_id']) && !isset($filter['pm_id']))
63                {
64                        $filter['pm_id'] = $this->pm_id;
65                }
66                if (isset($criteria['pe_id']) && (int)$criteria['pe_id'])
67                {
68                        $pe_id = (int) $criteria['pe_id'];
69                        unset($criteria['pe_id']);
70                }
71                if (isset($filter['pe_id']) && (int)$filter['pe_id'])
72                {
73                        $pe_id = (int) $filter['pe_id'];
74                        unset($filter['pe_id']);
75                }
76                if ($pe_id)
77                {
78                        $filter[] = "(pe_id_end=$pe_id OR pe_id_start=$pe_id)";
79
80                        if ($extra_cols && !is_array($extra_cols)) $extra_cols = explode(',',$extra_cols);
81                        // defines 3 constrain-types: milestone, start and end
82                        $extra_cols[] = "CASE WHEN ms_id != 0 THEN 'milestone' WHEN pe_id_start=$pe_id THEN 'start' ELSE 'end' END AS constraint_type";
83                        if (!$order_by) $order_by = 'constraint_type';
84                }
85                return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join);
86        }
87       
88        /**
89         * reads all constraints of a milestone (ms_id given), an element (pe_id given) or a project (pm_id given)
90         *
91         * It calls allways search to retrive the data. The form of the data returned depends on the given keys!
92         *
93         * @param array $keys array with keys in form internalName => value, may be a scalar value if only one key
94         * @param string/array $extra_cols string or array of strings to be added to the SELECT, eg. "count(*) as num"
95         * @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
96         * @return array/boolean milestones: array with pe_id's, element: array with subarrays for start, end, milestone,
97         *      or same as search($keys) would return
98        */
99        function read($keys,$extra_cols='',$join='')
100        {
101                if (!$search =& $this->search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$keys))
102                {
103                        return false;
104                }
105                $ret = array();
106
107                if ((int) $keys['ms_id'])
108                {
109                        foreach($search as $row)
110                        {
111                                $ret[] = $row['pe_id_end'];
112                        }
113                }
114                elseif ((int) $keys['pe_id'])
115                {
116                        foreach($search as $row)
117                        {
118                                switch($row['constraint_type'])
119                                {
120                                        case 'milestone':
121                                                $ret['milestone'][] = $row['ms_id'];
122                                                break;
123                                        case 'start':
124                                                $ret['start'][] = $row['pe_id_end'];
125                                                break;
126                                        case 'end':
127                                                $ret['end'][] = $row['pe_id_start'];
128                                                break;
129                                }
130                        }
131                }
132                else
133                {
134                        $ret =& $search;
135                }
136                if ($this->debug)
137                {
138                        echo "<p>soconstraints::read(".print_r($keys,true).",'$extra_cols','$join')</p>\n";
139                        _debug_array($ret);
140                }
141                return $ret;
142        }
143
144        /**
145         * saves the given data to the db
146         *
147         * @param array $data with either data for one row or null, or
148         *      for the constraints of an elements the keys pe_id, start, end, milestone, or
149         *      for the constraints of a milestone the keys ms_id, pe_id (pm_id can be given or is taken from $this->pm_id)
150         * @return int 0 on success and errno != 0 else
151         */
152        function save($data=null)
153        {
154                if ($this->debug) { echo "<p>soconstraints::save:"; _debug_array($data); }
155
156                // constraints of an element?
157                if ($data['pe_id'])
158                {
159                        $pm_id = $data['pm_id'] ? $data['pm_id'] : $this->pm_id;
160                        unset($data['pm_id']);
161                        $pe_id = $data['pe_id'];
162                        unset($data['pe_id']);
163
164                        $this->delete(array(
165                                'pm_id' => $pm_id,
166                                'pe_id' => $pe_id,
167                        ));
168                        foreach($data as $type => $ids)
169                        {
170                                foreach(is_array($ids) ? $ids : explode(',',$ids) as $id)
171                                {
172                                        if (!$id) continue;
173
174                                        switch($type)
175                                        {
176                                                case 'milestone':
177                                                        $row = array(
178                                                                'pe_id_end'   => $pe_id,
179                                                                'pe_id_start' => 0,
180                                                                'ms_id'       => $id,
181                                                        );
182                                                        break;
183                                                case 'start':
184                                                        $row = array(
185                                                                'pe_id_end'   => $id,
186                                                                'pe_id_start' => $pe_id,
187                                                                'ms_id'       => 0,
188                                                        );
189                                                        break;
190                                                case 'end':
191                                                        $row = array(
192                                                                'pe_id_end'   => $pe_id,
193                                                                'pe_id_start' => $id,
194                                                                'ms_id'       => 0,
195                                                        );
196                                                        break;
197                                        }
198                                        $row['pm_id'] = $pm_id;
199
200                                        if (($err = parent::save($row)))
201                                        {
202                                                return $err;
203                                        }
204                                }
205                        }
206                        return 0;
207                }
208                // constraints of a milestone
209                if ($data['ms_id'] && is_array($data['pe_id']))
210                {
211                        $keys = array(
212                                'pm_id'       => $data['pm_id'] ? $data['pm_id'] : $this->pm_id,
213                                'pe_id_start' => 0,
214                                'ms_id'       => $data['ms_id'],
215                        );
216                        $this->delete($keys);
217
218                        foreach($data['pe_id'] as $pe_id);
219                        {
220                                $keys['pe_id_end'] = $pe_id;
221                               
222                                if (($err = parent::save($keys)))
223                                {
224                                        return $err;
225                                }
226                        }
227                        return 0;
228                }
229                return parent::save($data);
230        }               
231               
232        /**
233         * reimplented to delete all constraints from a project-element if a pe_id is given
234         *
235         * @param array/int $keys if given array with col => value pairs to characterise the rows to delete or pe_id
236         * @return int affected rows, should be 1 if ok, 0 if an error
237         */
238        function delete($keys=null)
239        {
240                if ($this->debug) echo "<p>soconstraints::delete(".print_r($keys,true).")</p>\n";
241
242                if (is_numeric($keys) || is_array($keys) && (int) $keys['pe_id'])
243                {
244                        if (is_array($keys))
245                        {
246                                $pe_id = (int) $keys['pe_id'];
247                                unset($keys['pe_id']);
248                        }
249                        else
250                        {
251                                $pe_id = (int) $keys;
252                                $keys = array();
253                        }
254                        $keys[] = "(pe_id_end=$pe_id OR pe_id_start=$pe_id)";           
255                        return $this->db->delete($this->table_name,$keys,__LINE__,__FILE__);
256                }
257                return parent::delete($keys);
258        }
259}
Note: See TracBrowser for help on using the repository browser.