source: OWR/Model/News/Tags.php @ 47c42d

Revision 47c42d, 9.3 KB checked in by pierre-alain <pierre-alain@…>, 3 years ago (diff)

adding support for plugin calls

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Model for 'news_tags' object
4 *
5 * PHP 5
6 *
7 * OWR - OpenWebReader
8 *
9 * Copyright (c) 2009, Pierre-Alain Mignot
10 *
11 * Home page: http://openwebreader.org
12 *
13 * E-Mail: contact@openwebreader.org
14 *
15 * All Rights Reserved
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 *
31 * @author Pierre-Alain Mignot <contact@openwebreader.org>
32 * @copyright Copyright (c) 2009, Pierre-Alain Mignot
33 * @license http://www.gnu.org/copyleft/gpl.html
34 * @package OWR
35 * @subpackage Model
36 */
37namespace OWR\Model\News;
38use OWR\Model,
39    OWR\Request,
40    OWR\Exception,
41    OWR\DAO,
42    OWR\Model\Response,
43    OWR\Config,
44    OWR\Plugins;
45/**
46 * This class is used to add/edit/delete tags
47 * @package OWR
48 * @subpackage Model
49 * @uses OWR\Model extends the base class
50 * @uses OWR\Request the request
51 * @uses OWR\Exception the exception handler
52 * @uses OWR\DAO the DAO
53 * @uses OWR\Plugins Plugins manager
54 * @subpackage Model
55 */
56class Tags extends Model
57{
58    /**
59     * Adds/Edits a tag
60     *
61     * @access public
62     * @param mixed $request the Request instance
63     * @return $this
64     */
65    public function edit(Request $request)
66    {
67        Plugins::pretrigger($request);
68        if(empty($request->name))
69        {
70            $request->setResponse(new Response(array(
71                'do'        => 'error',
72                'error'     => 'Missing name',
73                'status'    => Exception::E_OWR_BAD_REQUEST
74            )));
75
76            return $this;
77        }
78
79        if(empty($request->id))
80        {
81            $tag = $this->_dao->get(array('name' => $request->name), 'id');
82            if(empty($tag))
83            {
84                $request->new = true;
85                $tag = DAO::getDAO('news_tags');
86            }
87        }
88        else
89        {
90            $tag = $this->_dao->get($request->id, 'id'); // check
91            if(empty($tag))
92            {
93                $request->setResponse(new Response(array(
94                    'do'        => 'error',
95                    'error'     => 'Invalid id',
96                    'status'    => Exception::E_OWR_BAD_REQUEST
97                )));
98                return $this;
99            }
100        }
101
102        $tag->name = $request->name;
103        $request->id = $tag->save();
104        unset($tag);
105        Plugins::trigger($request);
106        $request->setResponse(new Response(array(
107            'status'    => $request->new ? 201 : 200,
108            'datas'     => array('id' => $request->id)
109        )));
110        Plugins::posttrigger($request);
111        return $this;
112    }
113
114    /**
115     * Deletes a tag and all contained news
116     *
117     * @access public
118     * @param int $id the id of the group to delete
119     * @return $this
120     */
121    public function delete(Request $request)
122    {
123        Plugins::pretrigger($request);
124        if(empty($request->id))
125        {
126            $request->setResponse(new Response(array(
127                'do'        => 'error',
128                'error'     => 'Missing id',
129                'status'    => Exception::E_OWR_BAD_REQUEST
130            )));
131            return $this;
132        }
133
134        $type = DAO::getType($request->id);
135        if('news_tags' !== $type)
136        {
137            $request->setResponse(new Response(array(
138                'do'        => 'error',
139                'error'     => 'Invalid id',
140                'status'    => Exception::E_OWR_BAD_REQUEST
141            )));
142            return $this;
143        }
144
145        $this->_db->beginTransaction();
146        try
147        {
148            DAO::getCachedDAO('objects')->delete($request->id);
149        }
150        catch(Exception $e)
151        {
152            $this->_db->rollback();
153            throw new Exception($e->getContent(), $e->getCode());
154        }
155
156        $this->_db->commit();
157        Plugins::trigger($request);
158        $request->setResponse(new Response);
159        Plugins::posttrigger($request);
160        return $this;
161    }
162
163    /**
164     * Gets datas to render a group
165     *
166     * @access public
167     * @author Pierre-Alain Mignot <contact@openwebreader.org>
168     * @param mixed $request the Request instance
169     * @param array $args additional arguments, optionnal
170     * @param string $order the order clause
171     * @param string $tagby the groupby clause
172     * @param string $limit the limit clause
173     * @return $this
174     */
175    public function view(Request $request, array $args = array(), $order = '', $tagby = '', $limit = '')
176    {
177        Plugins::pretrigger($request);
178        $args['FETCH_TYPE'] = 'assoc';
179
180        if(!empty($request->ids))
181        {
182            $args['id'] = $request->ids;
183            $limit = count($request->ids);
184        }
185        elseif(!empty($request->id))
186        {
187            $args['id'] = $request->id;
188            $limit = 1;
189        }
190
191        $datas = $this->_dao->get($args, 'id,name', $order, $tagby, $limit);
192        if(empty($datas))
193        {
194            $request->setResponse(new Response(array(
195                'status'    => 204
196            )));
197            return $this;
198        }
199
200        $this->_setUserTimestamp($datas);
201        Plugins::trigger($request);
202        $request->setResponse(new Response(array(
203            'datas'        => $datas,
204            'multiple'     => !isset($datas['id'])
205        )));
206        Plugins::posttrigger($request);
207        return $this;
208    }
209
210    /**
211     * Renames a tag
212     *
213     * @author Pierre-Alain Mignot <contact@openwebreader.org>
214     * @access public
215     * @param mixed $request the Request instance
216     */
217    public function rename(Request $request)
218    {
219        Plugins::pretrigger($request);
220        if(empty($request->name))
221        {
222            $request->setResponse(new Response(array(
223                'do'        => 'error',
224                'error'     => 'Missing name',
225                'status'    => Exception::E_OWR_BAD_REQUEST
226            )));
227            return $this;
228        }
229
230        $tag = $this->_dao->get(array('id'=>$request->id), 'id, uid');
231        if(empty($tag))
232        {
233            $request->setResponse(new Response(array(
234                'do'        => 'error',
235                'error'     => 'Invalid id',
236                'status'    => Exception::E_OWR_BAD_REQUEST
237            )));
238            return $this;
239        }
240
241        $tag->name = $request->name;
242        $tag->save();
243        Plugins::trigger($request);
244        $request->setResponse(new Response);
245        Plugins::posttrigger($request);
246        return $this;
247    }
248
249    /**
250     * Edits tags and news relations
251     *
252     * @author Pierre-Alain Mignot <contact@openwebreader.org>
253     * @access public
254     * @param mixed $request the Request instance
255     */
256    public function editRelations(Request $request)
257    {
258        Plugins::pretrigger($request);
259        if(empty($request->ids))
260        {
261            $request->setResponse(new Response(array(
262                'do'        => 'error',
263                'error'     => 'Missing ids of news',
264                'status'    => Exception::E_OWR_BAD_REQUEST
265            )));
266            return $this;
267        }
268
269        $daoRelations = DAO::getCachedDAO('news_relations_tags');
270        $tags = array_filter(array_map('trim', explode(',', $request->name)));
271
272        // reset all tags for the id(s)
273        if(is_array($request->ids))
274        {
275            foreach($request->ids as $id)
276            {
277                $daoRelations->delete(array('newsid' => $id));
278            }
279        }
280        else
281        {
282            $daoRelations->delete(array('newsid' => $request->ids));
283        }
284
285        if(empty($tags))
286        { // ok we are done, no tags to add
287            $request->setResponse(new Response);
288
289            return $this;
290        }
291
292        $ids = array();
293        $dao = DAO::getCachedDAO('news_tags');
294
295        foreach($tags as $tag)
296        {
297            $exists = $this->_dao->get(array('name'=>$tag), 'id');
298            if(!$exists)
299            {
300                $dao->name = $tag;
301                $daoRelations->tid = $dao->save();
302                $ids[] = $daoRelations->tid;
303                $dao->id = null;
304            }
305            else $daoRelations->tid = $exists->id;
306
307            if(is_array($request->ids))
308            {
309                foreach($request->ids as $id)
310                {
311                    $daoRelations->newsid = (int) $id;
312                    $daoRelations->save();
313                }
314            }
315            else
316            {
317                $daoRelations->newsid = (int) $request->ids;
318                $daoRelations->save();
319            }
320        }
321        Plugins::trigger($request);
322        $request->setResponse(new Response(empty($ids) ? array() : array(
323            'datas'     => array('ids' => $ids),
324            'status'    => 201,
325            'tpl'       => 'tag'
326        )));
327        Plugins::posttrigger($request);
328        return $this;
329    }
330}
Note: See TracBrowser for help on using the repository browser.