/
TagTimeBehavior.php
91 lines (78 loc) · 2.42 KB
/
TagTimeBehavior.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
<?php
/*
* Concept of Tag Time Plugin Behaviour adapted from Teknoid
* From the HABTM tutorial http://nuts-and-bolts-of-cakephp.com/tag/saving-habtm/
*/
class TagTimeBehavior extends ModelBehavior {
function setup(&$Model, $settings = array()) {
$default = array(
'assoc_classname' => 'Tag',
'tag_field' => 'tag',
'separator' => ',',
'clear_model' => false,
);
if (empty($settings)) {
$settings = $default;
}
$this->settings = array_merge($default, $settings);
}
function afterFind(&$Model, $results, $primary = false) {
extract($this->settings);
if (!empty($results)) {
foreach ($results as $key => &$result) {
foreach ($Model->hasAndBelongsToMany as $assoc_key => $assoc_model) {
if ($assoc_key == $assoc_classname && !empty($result[$assoc_key])) {
$tags = Set::extract('{n}.'.$tag_field, $result[$assoc_key]);
if (!empty($tags)) {
if ($clear_model === true) {
unset($results[$key][$assoc_key]);
}
$result[$assoc_key][Inflector::pluralize($tag_field)] = implode(',', $tags);
}
}
}
}
}
return $results;
}
function beforeValidate(&$Model) {
extract($this->settings);
foreach ($Model->hasAndBelongsToMany as $assoc_key => $assoc_model) {
$tagIds = array();
if ($assoc_model['className'] == $assoc_classname) {
if (!empty($Model->data[$assoc_key])) {
$tagIds = $this->_getTagIds($assoc_key, $assoc_model, $Model);
}
if (!empty($tagIds)) {
foreach($tagIds as $key => $tagId) {
$Model->data[$assoc_key][][$assoc_model['with']][$assoc_model['associationForeignKey']] = $tagId;
unset($Model->data[$assoc_key][$assoc_key]);
}
}
}
}
return parent::beforeValidate($Model);
}
function _getTagIds($assoc_key, $assoc_model, &$Model) {
extract($this->settings);
$tags = explode($separator, $Model->data[$assoc_key][Inflector::pluralize($tag_field)]);
if (Set::filter($tags)) {
$tagIds = array();
foreach ($tags as $tag) {
$tag = strtolower(trim($tag));
$existingTag = $Model->{$assoc_key}->find('first', array(
'conditions' => array($assoc_key.'.'.$tag_field => $tag),
'recursive' => -1
));
if (empty($existingTag)) {
$Model->{$assoc_key}->id = null;
$Model->{$assoc_key}->saveField($tag_field, $tag);
$tagIds[] = $Model->{$assoc_key}->id;
} else {
$tagIds[] = $existingTag[$assoc_key]['id'];
}
}
return array_unique($tagIds);
}
}
}