1 <?php
2
3 class FindCyrillic_Controller extends Controller {
4
5 public static $allowed_actions = array(
6 'index',
7 );
8
9 public function __construct(){
10 parent::__construct();
11 }
12
13
14 public function index(SS_HTTPRequest $request){
15 if(Director::isDev()){
16 $task = new FindCyrillic();
17 $task->process();
18 }
19 Director::redirectBack();
20 }
21 }
22
23
24
25 class FindCyrillic extends ScheduledTask {
26
27 static $skipDirs = array(
28 'node_modules',
29 'assets',
30 'import',
31 'offers',
32 'css',
33 'css-styl',
34 'js',
35 'js-dev',
36 '.svn',
37 'lang',
38 'dicts',
39 'javascript',
40 'sapphire',
41 'thirdparty',
42 'img',
43 'threejs',
44 'silverstripe-cache'
45 );
46 protected $body = '';
47
48 function process(){
49 $siteRoot = trim(Director::absoluteBaseURL(),'/');
50
51
52 $path = BASE_PATH . '/';
53 $this->body .= "<details>";
54 $this->body .= "<summary>Файлы с кириллицей</summary>";
55 $this->body .= "<ol>";
56 $this->fetchDir($path);
57 $this->body .= "</ol>";
58 $this->body .= "</details>";
59
60 if(!in_array("SubsiteAdmin", get_declared_classes())){
61 die('doge');
62 }
63
64 Subsite::$disable_subsite_filter = true;
65 $subsites = array();
66 $items = DataObject::get('Subsite');
67 foreach ($items as $subsite) {
68 if($subsite->Language != 'ru_RU'){
69 $subsites[$subsite->ID] = $subsite->getPrimaryDomain();
70 }
71 }
72
73 $tables = DB::query('SHOW TABLES');
74 $tables = $tables->column();
75
76
77 $this->body .= "Кириллица в контенте";
78 $this->body .= "<ol>";
79
80 foreach ($subsites as $ID => $domain) {
81 $pages = Versioned::get_by_stage('SiteTree', 'Live', "Status = 'Published' AND SubsiteID = {$ID}");
82 if(!$pages || !$pages->Count()){
83 continue;
84 }
85
86
87
88
89
90
91
92
93 foreach ($pages as $page) {
94
95 $fields = array();
96
97 $fieldLabels = $page->fieldLabels();
98 $has_one = $page->has_one();
99 $has_many = $page->has_many();
100 $many_many = $page->many_many();
101 $belongs_to = $page->belongs_to();
102 $data = array();
103 $data[] = $has_one;
104 $data[] = $has_many;
105 $data[] = $many_many;
106 $data[] = $belongs_to;
107
108 foreach ($data as $item) {
109 foreach ($item as $key => $value) {
110 if(in_array($value, array('SiteTree', 'Subsite', 'Group', 'Folder'))){
111 continue;
112 }
113 foreach ($page->$key() as $relatedObject) {
114 $t = $relatedObject->fieldLabels();
115 foreach ($t as $relatedKey => $relatedValue) {
116 if($relatedKey == 'Title' && $relatedObject->ClassName == 'Image'){
117 continue;
118 }
119 if($this->isCyrillic($relatedObject->$relatedKey)){
120 $fields[$page->Title.'----'.$page->ClassName]['Related'][] = $relatedObject->ClassName . ":" . $relatedValue . ':' . $relatedObject->ID;
121
122 }
123 }
124 }
125 }
126 }
127 foreach ($fieldLabels as $key => $value) {
128 if($this->isCyrillic($page->$key)){
129
130 $fields[$page->Title.'----'.$page->ClassName]['Fields'][] = $value;
131 }
132 }
133 if(!empty($fields)){
134
135
136 foreach ($fields as $key => $value) {
137 $exploded = explode('----', $key);
138 $title = $exploded[0];
139 $type = $exploded[1];
140 $this->body .= "
141 <li><strong>{$title}</strong> - {$type} - <a target='_blank' href='{$siteRoot}{$domain}/{$page->URLSegment}'>Ссылка на страницу</a> (<a target='_blank' href='{$siteRoot}/admin/show/{$page->ID}'>Админка</a>)";
142 if(isset($value['Fields']) && !empty($value['Fields'])){
143
144 $fieldsList = implode("</li><li>", $value['Fields']);
145 $this->body .= "<ul>
146 <u>Название поля на странице</u>
147 <li>
148 {$fieldsList}
149 </li>
150 </ul>";
151 }
152 if(isset($value['Related']) && !empty($value['Related'])){
153 $related = implode("</li><li>", $value['Related']);
154 $this->body .= "
155 <ul>
156 <u>Связанные обьекты (Тип:Поле:ID обьекта)</u>
157 <li>
158 {$related}
159 </li>
160 </ul>
161 </li>
162 ";
163 }
164 }
165
166 }
167
168 }
169 }
170 $this->body .= "</ol>";
171
172
173 $sc = SiteConfig::current_site_config();
174 if(isset($sc->EmailForReports) && !empty($sc->EmailForReports)){
175 $to = $sc->EmailForReports;
176 }else{
177 $to = 'test@mediaweb.ru';
178 }
179 $mail = new Email();
180 $mail->setFrom('FindCyrillic@mediaweb.ru');
181 $mail->setSubject("Кириллица на сайте");
182 $mail->setTo($to);
183
184 $mail->setBody($this->body);
185 $mail->send();
186 }
187
188 function fetchDir($path){
189 $files = scandir($path);
190 unset($files[array_search(".", $files)]);
191 unset($files[array_search("..", $files)]);
192 foreach ($files as $file) {
193
194 if(in_array($file, self::$skipDirs) || is_link($path.$file)){
195 continue;
196 }
197
198 if(is_dir($path.$file)){
199 $this->fetchDir($path.$file.'/');
200 }else{
201 $i = 0;
202 $filename = $path.$file;
203 $fp = fopen($filename, 'r');
204 while(!feof($fp)){
205
206 $i++;
207
208 $line = trim(fgets($fp));
209 if(strpos($line,'//') === 0){
210 continue;
211 }
212
213 if(strpos($line,'#') === 0){
214 continue;
215 }
216
217 if(strpos($line,'<%--') === 0){
218 continue;
219 }
220
221 if(strpos($line,'*') === 0){
222 continue;
223 }
224
225 if($this->isCyrillic($line)){
226
227
228
229
230 $this->body .= "<li>{$filename}:{$i}</li>";
231
232 }
233 }
234 fclose($fp);
235 }
236 }
237 }
238
239 function isCyrillic($line){
240
241 if(preg_match( "/[\#|\/\/].*[а-яё]{2,}/iu", $line)){
242 return false;
243 }
244
245 if(preg_match( "/_t\(.*[а-яё]{2,}/iu", $line)){
246 return false;
247 }
248
249 if(preg_match( "/[а-яё]{2,}/iu", $line)){
250 return true;
251 }
252 return false;
253 }
254 }
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-