Subversion Repositories web.active

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
1 mjordaan 1
<?php namespace ProcessWire;
2
 
3
/**
4
 * ProcessWire PagesSortfields
5
 *
6
 * Manages the table for the sortfield property for Page children.
7
 * 
22 mjordaan 8
 * ProcessWire 3.x, Copyright 2021 by Ryan Cramer
1 mjordaan 9
 * https://processwire.com
10
 *
11
 */
12
 
13
class PagesSortfields extends Wire {
14
 
15
	/**
22 mjordaan 16
	 * Get sortfield for given Page from DB
17
	 * 
18
	 * @param int|Page $page Page or page ID
19
	 * @return string
20
	 * @since 3.0.172
21
	 * 
22
	 */
23
	public function get($page) {
24
		$pageId = $page instanceof Page ? $page->id : (int) $page;
25
		$sql = 'SELECT sortfield FROM pages_sortfields WHERE pages_id=:id';
26
		$query = $this->wire()->database->prepare($sql);
27
		$query->bindValue(':id', $pageId, \PDO::PARAM_INT);
28
		$query->execute();
29
		if($query->rowCount()) {
30
			$sortfield = $query->fetchColumn();
31
			$sortfield = $this->decode($sortfield); 
32
		} else {
33
			$sortfield = '';
34
		}
35
		$query->closeCursor();
36
		return $sortfield;
37
	}
38
 
39
	/**
1 mjordaan 40
	 * Save the sortfield for a given Page
41
	 *
42
	 * @param Page
43
	 * @return bool
44
	 *
45
	 */
46
	public function save(Page $page) {
47
 
48
		if(!$page->id) return false; 
49
		if(!$page->isChanged('sortfield')) return true; 
50
 
51
		$page_id = (int) $page->id; 
52
		$database = $this->wire('database');
53
		$sortfield = $this->encode($page->sortfield); 
54
 
55
		if($sortfield == 'sort' || !$sortfield) return $this->delete($page); 
56
 
57
		$sql = 	"INSERT INTO pages_sortfields (pages_id, sortfield) " .
58
				"VALUES(:page_id, :sortfield) " .
59
				"ON DUPLICATE KEY UPDATE sortfield=VALUES(sortfield)";
60
 
61
		$query = $database->prepare($sql);
62
		$query->bindValue(":page_id", $page_id, \PDO::PARAM_INT);
63
		$query->bindValue(":sortfield", $sortfield, \PDO::PARAM_STR);
64
		$result = $query->execute();
65
 
66
		return $result;
67
	}
68
 
69
	/**
70
	 * Delete the sortfield for a given Page
71
	 *
72
	 * @param Page
73
	 * @return bool
74
	 *
75
	 */
76
	public function delete(Page $page) {
77
		$database = $this->wire('database');
78
		$query = $database->prepare("DELETE FROM pages_sortfields WHERE pages_id=:page_id"); // QA
79
		$query->bindValue(":page_id", $page->id, \PDO::PARAM_INT); 
80
		$result = $query->execute();
81
		return $result;
82
	}
83
 
84
	/**
85
	 * Decodes a sortfield from a signed integer or string to a field name 
86
	 *
87
	 * The returned fieldname is preceded with a dash if the sortfield is reversed. 
88
	 *
89
	 * @param string|int $sortfield
90
	 * @param string $default Default sortfield name (default='sort')
91
	 * @return string
92
	 *
93
	 */
94
	public function decode($sortfield, $default = 'sort') {
95
 
96
		$reverse = false;
22 mjordaan 97
		$sortfield = (string) $sortfield;
1 mjordaan 98
 
99
		if(substr($sortfield, 0, 1) == '-') {
100
			$sortfield = substr($sortfield, 1); 
101
			$reverse = true; 	
102
		}
103
 
104
		if(ctype_digit("$sortfield") || !Fields::isNativeName($sortfield)) {
22 mjordaan 105
			$field = $this->wire()->fields->get(ctype_digit($sortfield) ? (int) $sortfield : $sortfield);
106
			$sortfield = $field ? $field->name : '';
1 mjordaan 107
		}
108
 
22 mjordaan 109
		if(!$sortfield) {
110
			$sortfield = $default;
111
		} else if($reverse) {
112
			$sortfield = "-$sortfield";
113
		}
1 mjordaan 114
 
115
		return $sortfield; 
116
	}
117
 
118
	/**
119
	 * Encodes a sortfield from a fieldname to a signed integer (ID) representing a custom field, or native field name
120
	 *
121
	 * The returned value will be a negative value (or string preceded by a dash) if the sortfield is reversed. 
122
	 *
123
	 * @param string $sortfield
124
	 * @param string $default Default sortfield name (default='sort')
125
	 * @return string|int
126
	 *
127
	 */
128
	public function encode($sortfield, $default = 'sort') {
129
 
130
		$reverse = false; 
131
 
132
		if(substr($sortfield, 0, 1) == '-') {	
133
			$reverse = true; 
134
			$sortfield = substr($sortfield, 1); 
135
		}
136
 
137
		if($sortfield && !Fields::isNativeName($sortfield)) { 
138
			if($field = $this->wire('fields')->get($sortfield)) $sortfield = $field->id; 
139
				else $sortfield = '';
140
		}
141
 
142
		if($sortfield) {
143
			if($reverse) $sortfield = "-$sortfield";
144
		} else {
145
			$sortfield = $default;
146
		}
147
 
148
		return $sortfield; 
149
	}
150
}