Merge branch '2015.11-develop' into 2016.11
[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         if (is_array($_data)) {
67             $record->setFromArray($_data);
68         } else if (is_string($_data)) {
69             if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . '::'
70                 . __LINE__ . ' Did not get an array to set keyfield config. Got this: ' . $_data);
71         }
72         return $record;
73     }
74     
75     /**
76      * (non-PHPdoc)
77      * @see tine20/Tinebase/Record/Abstract::setFromArray()
78      */
79     public function setFromArray(array $_data)
80     {
81         if (isset($_data['records']) && is_array($_data['records'])) {
82             $_data['records'] = new Tinebase_Record_RecordSet($this->_keyFieldRecordModel, $_data['records'], TRUE);
83         }
84         
85         parent::setFromArray($_data);
86     }
87     
88     /**
89      * set key field record model
90      * 
91      * @param  string $_keyFieldRecordModel
92      * @return Tinebase_Config_KeyField $this
93      */
94     public function setKeyFieldRecordModel($_keyFieldRecordModel) {
95         $this->_keyFieldRecordModel = $_keyFieldRecordModel;
96
97         return $this;
98     }
99
100     /**
101      * set appName
102      *
103      * @param  string $_appName
104      * @return Tinebase_Config_KeyField $this
105      */
106     public function setAppName($_appName) {
107         $this->_appName = $_appName;
108
109         return $this;
110     }
111     
112     /**
113      * get KeyfieldRecord by value
114      *
115      * @param string $_value
116      * @return array
117      */
118     public function getKeyfieldRecordByValue($_value) {
119         $record = $this->records->filter('value', $_value);
120         return $record->getFirstRecord();
121     }
122     
123     /**
124      * get default KeyfieldRecord
125      *
126      * @param string $_value
127      * @return array
128      */
129     public function getKeyfieldDefault() {
130         if (!empty($this->default)) {
131             $record = $this->records->filter('id', $this->default);
132             return $record->getFirstRecord();
133         }
134         return '';
135     }
136
137     /**
138      * get value of given id
139      *
140      * @param $id
141      * @return string
142      */
143     public function getValue($id)
144     {
145         if (! $this->records instanceof Tinebase_Record_RecordSet) {
146             return '';
147         }
148
149         $record = $this->records->filter('id', $id)->getFirstRecord();
150         if (! $record) {
151             $record = $this->getKeyfieldDefault();
152         }
153
154         return $record ? $record->value : '';
155     }
156
157     /**
158      * get translated value of given id
159      *
160      * @param $id
161      * @return string
162      */
163     public function getTranslatedValue($id)
164     {
165         $value = $this->getValue($id);
166         if ($value) {
167             $translate = Tinebase_Translation::getTranslation($this->_appName);
168             return $translate->_($value);
169         }
170
171         return '';
172     }
173
174     /**
175      * get keyfield record id for given translated value
176      *
177      * @TODO try all locales
178      *
179      * @param $translatedValue
180      * @return string|null
181      */
182     public function getIdByTranslatedValue($translatedValue)
183     {
184         $translate = Tinebase_Translation::getTranslation($this->_appName);
185         $originRecord = null;
186
187         foreach ($this->records as $record) {
188             // check id & translated value
189             if (in_array($translatedValue, array($translate->_($record->value), $record->getId()))) {
190                 $originRecord = $record;
191                 break;
192             }
193         }
194
195         return $originRecord ? $originRecord->getId() : null;
196     }
197 }