Merge branch '2015.11-develop'
[tine20] / tine20 / Tinebase / Config / KeyField.php
1 <?php
2 /**
3  * @package     Tinebase
4  * @subpackage  Config
5  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
6  * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
7  * @author      Cornelius Weiss <c.weiss@metaways.de>
8  */
9
10 /**
11  * this class represents a key field config
12  * @see http://wiki.tine20.org/Developers/Concepts/KeyFields
13  * 
14  * @package     Tinebase
15  * @subpackage  Config
16  */
17 class Tinebase_Config_KeyField extends Tinebase_Record_Abstract
18 {
19     /**
20      * appname this keyfield belongs to
21      *
22      * @var string
23      */
24     protected $_appName = null;
25
26     /**
27      * classname of the key fields record model
28      * 
29      * @var string
30      */
31     protected $_keyFieldRecordModel = 'Tinebase_Config_KeyFieldRecord';
32
33     /**
34      * (non-PHPdoc)
35      * @see tine20/Tinebase/Record/Abstract::$_identifier
36      */
37     protected $_identifier = 'name';
38     
39     /**
40      * (non-PHPdoc)
41      * @see tine20/Tinebase/Record/Abstract::$_validators
42      */
43     protected $_validators = array(
44         'name'                   => array('allowEmpty' => true),
45         'records'                => array('allowEmpty' => true),
46         'default'                => array('allowEmpty' => true),
47     );
48     
49     /**
50      * create a new instance
51      * 
52      * @param mixed     $_data
53      * @param string    $_keyFieldRecordModel
54      * @return          Tinebase_Config_KeyField 
55      */
56     public static function create($_data, array $_options = array())
57     {
58         $record = new self();
59         if (isset($_options['appName'])) {
60             $record->setAppName($_options['appName']);
61         }
62         if (isset($_options['recordModel'])) {
63             $record->setKeyFieldRecordModel($_options['recordModel']);
64         }
65
66         $record->setFromArray($_data);
67         return $record;
68     }
69     
70     /**
71      * (non-PHPdoc)
72      * @see tine20/Tinebase/Record/Abstract::setFromArray()
73      */
74     public function setFromArray(array $_data)
75     {
76         if (isset($_data['records']) && is_array($_data['records'])) {
77             $_data['records'] = new Tinebase_Record_RecordSet($this->_keyFieldRecordModel, $_data['records'], TRUE);
78         }
79         
80         parent::setFromArray($_data);
81     }
82     
83     /**
84      * set key field record model
85      * 
86      * @param  string $_keyFieldRecordModel
87      * @return Tinebase_Config_KeyField $this
88      */
89     public function setKeyFieldRecordModel($_keyFieldRecordModel) {
90         $this->_keyFieldRecordModel = $_keyFieldRecordModel;
91
92         return $this;
93     }
94
95     /**
96      * set appName
97      *
98      * @param  string $_appName
99      * @return Tinebase_Config_KeyField $this
100      */
101     public function setAppName($_appName) {
102         $this->_appName = $_appName;
103
104         return $this;
105     }
106     
107     /**
108      * get KeyfieldRecord by value
109      *
110      * @param string $_value
111      * @return array
112      */
113     public function getKeyfieldRecordByValue($_value) {
114         $record = $this->records->filter('value', $_value);
115         return $record->getFirstRecord();
116     }
117     
118     /**
119      * get default KeyfieldRecord
120      *
121      * @param string $_value
122      * @return array
123      */
124     public function getKeyfieldDefault() {
125         if (!empty($this->default)) {
126             $record = $this->records->filter('id', $this->default);
127             return $record->getFirstRecord();
128         }
129         return '';
130     }
131
132     /**
133      * get value of given id
134      *
135      * @param $id
136      * @return string
137      */
138     public function getValue($id)
139     {
140         $record = $this->records->filter('id', $id)->getFirstRecord();
141         if (! $record) {
142             $record = $this->getKeyfieldDefault();
143         }
144
145         return $record ? $record->value : '';
146     }
147
148     /**
149      * get translated value of given id
150      *
151      * @param $id
152      * @return string
153      */
154     public function getTranslatedValue($id)
155     {
156         $value = $this->getValue($id);
157         if ($value) {
158             $translate = Tinebase_Translation::getTranslation($this->_appName);
159             return $translate->_($value);
160         }
161
162         return '';
163     }
164
165     /**
166      * get keyfield record id for given translated value
167      *
168      * @TODO try all locales
169      *
170      * @param $translatedValue
171      * @return string|null
172      */
173     public function getIdByTranslatedValue($translatedValue)
174     {
175         $translate = Tinebase_Translation::getTranslation($this->_appName);
176         $originRecord = null;
177
178         foreach ($this->records as $record) {
179             // check id & translated value
180             if (in_array($translatedValue, array($translate->_($record->value), $record->getId()))) {
181                 $originRecord = $record;
182                 break;
183             }
184         }
185
186         return $originRecord ? $originRecord->getId() : null;
187     }
188 }