XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
seo.controller.php
Go to the documentation of this file.
1 <?php
2 class seoController extends seo
3 {
4  function getBrowserTitle($document_title = null)
5  {
6  $site_module_info = Context::get('site_module_info');
7  if ($site_module_info->site_srl != 0) return Context::getBrowserTitle();
8 
9  $config = $this->getConfig();
10  if ($config->use_optimize_title != 'Y') return Context::getBrowserTitle();
11 
12  $current_module_info = Context::get('current_module_info');
13  $is_index = ($current_module_info->module_srl == $site_module_info->module_srl) ? true : false;
14 
15  $piece = array();
16  $piece['[:site_name:]'] = $config->site_name;
17  $piece['[:site_slogan:]'] = $config->site_slogan;
18  $piece['[:module_title:]'] = $current_module_info->browser_title;
19  if ($document_title) $piece['[:document_title:]'] = $document_title;
20 
21  if ($config->use_optimize_title == 'Y') {
22  $title = array();
23  if ($piece['[:document_title:]']) {
24  $title[] = $piece['[:document_title:]'];
25  $title[] = $piece['[:module_title:]'];
26  $title[] = $piece['[:site_name:]'];
27  } else {
28  if ($is_index) {
29  $title[] = $piece['[:site_name:]'];
30  if ($piece['[:site_slogan:]']) $title[] = $piece['[:site_slogan:]'];
31  } else {
32  $title[] = $piece['[:module_title:]'];
33  $title[] = $piece['[:site_name:]'];
34  }
35  }
36  $title = implode(' - ', $title);
37  }
38 
39  return $title;
40  }
41 
42  function triggerBeforeDisplay(&$output_content)
43  {
44  if (Context::getResponseMethod() != 'HTML') return;
45  if (Context::get('module') == 'admin') return;
46 
47  require_once(_XE_PATH_ . 'libs/idna_convert/idna_convert.class.php');
48 
49  $oCacheHandler = CacheHandler::getInstance('object', NULL, TRUE);
50 
51  $locales = array(
52  'de' => 'de_DE',
53  'en' => 'en_US',
54  'es' => 'es_ES',
55  'fr' => 'fr_FR',
56  'ja' => 'ja_JP',
57  'jp' => 'ja_JP',
58  'ko' => 'ko_KR',
59  'mn' => 'mn_MN',
60  'ru' => 'ru_RU',
61  'tr' => 'tr_TR',
62  'vi' => 'vi_VN',
63  'zh-CN' => 'zh_CN',
64  'zh-TW' => 'zh_TW',
65  );
66 
67  $oModuleModel = getModel('module');
68  $config = $this->getConfig();
69  $IDN = new idna_convert(array('idn_version' => 2008));
70  $request_uri = $IDN->encode(Context::get('request_uri'));
71 
72  $logged_info = Context::get('logged_info');
73  $current_module_info = Context::get('current_module_info');
74  $site_module_info = Context::get('site_module_info');
75  $document_srl = Context::get('document_srl');
76  $is_article = false;
77  $single_image = false;
78  $is_index = ($current_module_info->module_srl == $site_module_info->module_srl) ? true : false;
79 
80  $piece = new stdClass;
81  $piece->document_title = null;
82  $piece->type = 'website';
83  $piece->url = getFullUrl('');
84  $piece->title = Context::getBrowserTitle();
85  $piece->description = $config->site_description;
86  $piece->keywords = $config->site_keywords;
87  $piece->tags = array();
88  $piece->image = array();
89  $piece->author = null;
90 
91  if(stristr($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') != FALSE) {
92  $single_image = true;
93  }
94 
95 
96  if($current_module_info->module_srl !== $site_module_info->module_srl) {
97  $mdoulePartConfig = $oModuleModel->getModulePartConfig('seo', $current_module_info->module_srl);
98  if($mdoulePartConfig && isset($mdoulePartConfig->meta_description) && trim($mdoulePartConfig->meta_description)) {
99  $piece->description = trim($mdoulePartConfig->meta_description);
100  }
101  }
102 
103  if ($document_srl) {
104  $oDocument = Context::get('oDocument');
105  if (!is_a($oDocument, 'documentItem')) {
106  $oDocumentModel = getModel('document');
107  $oDocument = $oDocumentModel->getDocument($document_srl);
108  }
109 
110  if (is_a($oDocument, 'documentItem') && $document_srl == $oDocument->document_srl) {
111  $is_article = true;
112  }
113  }
114 
115  // 문서 데이터 수집
116  if ($is_article) {
117  if (!$oDocument->isSecret()) {
118  $piece->document_title = $oDocument->getTitleText();
119  $piece->url = getFullUrl('', 'mid', $current_module_info->mid, 'document_srl',$document_srl);
120  $piece->type = 'article';
121  $piece->description = trim(str_replace('&nbsp;', ' ', $oDocument->getContentText(400)));
122  $piece->author = $oDocument->getNickName();
123  $tags = $oDocument->get('tag_list');
124  if (count($tags)) $piece->tags = $tags;
125 
126  $document_images = false;
127  if($oCacheHandler->isSupport()) {
128  $cache_key_document_images = 'seo:document_images:' . $document_srl;
129  $document_images = $oCacheHandler->get($cache_key_document_images);
130  }
131 
132  if($document_images === false && $oDocument->hasUploadedFiles()) {
133  $image_ext = array('bmp', 'gif', 'jpg', 'jpeg', 'png');
134  $document_images = array();
135 
136  foreach ($oDocument->getUploadedFiles() as $file) {
137  if ($file->isvalid != 'Y') continue;
138 
139  $ext = array_pop(explode('.', $file->uploaded_filename));
140 
141  if (!in_array(strtolower($ext), $image_ext)) continue;
142  list($width, $height) = @getimagesize($file->uploaded_filename);
143  if($width < 100 && $height < 100) continue;
144 
145  $image = array(
146  'filepath' => $file->uploaded_filename,
147  'width' => $width,
148  'height' => $height
149  );
150 
151  if($file->cover_image === 'Y') {
152  array_unshift($document_images, $image);
153  } else {
154  $document_images[] = $image;
155  }
156  }
157 
158  if($oCacheHandler->isSupport()) {
159  $oCacheHandler->put($cache_key_document_images, $document_images);
160  }
161  }
162 
163  if($document_images) $piece->image = $document_images;
164  } else {
165  $piece->url = getFullUrl('', 'mid', $current_module_info->mid);
166  }
167  } else {
168  if (!$is_index) {
169  $page = (Context::get('page') > 1) ? Context::get('page') : null;
170  $piece->url = getNotEncodedFullUrl('mid', $current_module_info->mid, 'page',$page);
171  }
172  }
173 
174  $piece->title = $this->getBrowserTitle($piece->document_title);
175 
176  if($oCacheHandler->isSupport()) {
177  $cache_key = 'seo:site_image';
178  $site_image = $oCacheHandler->get($cache_key);
179  if($site_image) {
180  $site_image['url'] = $config->site_image_url;
181  }
182  $piece->image[] = $site_image;
183  }
184 
185  $this->addLink('canonical', $piece->url);
186  $this->addMeta('keywords', $piece->keywords, 'name');
187  $this->addMeta('description', $piece->description, 'name');
188 
189  // Open Graph
190  $this->addMeta('og:locale', $locales[Context::getLangType()]);
191  $this->addMeta('og:type', $piece->type);
192  $this->addMeta('og:url', $piece->url);
193  $this->addMeta('og:site_name', $config->site_name);
194  $this->addMeta('og:title', $piece->title);
195  $this->addMeta('og:description', $piece->description);
196  if($is_article) {
197  if(Context::getLangType() !== $oDocument->getLangCode()) {
198  $this->addMeta('og:locale:alternate', $locales[$oDocument->getLangCode()]);
199  }
200  $this->addMeta('article:published_time', $oDocument->getRegdate('c'));
201  $this->addMeta('article:modified_time', $oDocument->getUpdate('c'));
202  foreach ($piece->tags as $tag) {
203  $this->addMeta('article:tag', $tag);
204  }
205  }
206 
207  foreach ($piece->image as $img) {
208  if(!$img['url']) {
209  if(!$img['filepath']) continue;
210  $img['url'] = $request_uri . $img['filepath'];
211  }
212 
213  $this->addMeta('og:image', $img['url']);
214  $this->addMeta('og:image:width', $img['width']);
215  $this->addMeta('og:image:height', $img['height']);
216  if($single_image) break;
217  }
218 
219  $this->canonical_url = $piece->url;
220 
221  $this->applySEO();
222 
223  if ($config->use_optimize_title == 'Y') Context::setBrowserTitle($piece->title);
224  }
225 
227  {
228  $document_srl = $data->upload_target_srl;
229  if(!$document_srl) return $this->makeObject();
230 
231  $this->deleteCacheDocumentImages($document_srl);
232  }
233 
235  {
236  $document_srl = $data->document_srl;
237  $this->deleteCacheDocumentImages($document_srl);
238  }
239 
241  {
242  $document_srl = $data->document_srl;
243  $this->deleteCacheDocumentImages($document_srl);
244  }
245 
246  private function deleteCacheDocumentImages($document_srl)
247  {
248  $oCacheHandler = CacheHandler::getInstance('object', NULL, TRUE);
249  if($oCacheHandler->isSupport()) {
250  $cache_key_document_images = 'seo:document_images:' . $document_srl;
251  $oCacheHandler->delete($cache_key_document_images);
252  }
253  }
254 }
255 /* !End of file */
$oModuleModel
Definition: ko.install.php:236
getConfig()
Definition: seo.class.php:19
$IDN
Definition: example.php:7
triggerAfterDocumentDeleteDocument($data)
triggerBeforeDisplay(&$output_content)
& getInstance($target= 'object', $info=null, $always_use_file=false)
triggerAfterFileDeleteFile($data)
setBrowserTitle($site_title)
getNotEncodedFullUrl()
Definition: func.inc.php:385
makeObject($code=0, $message= 'success')
Definition: seo.class.php:181
$document_srl
Definition: ko.install.php:279
addLink($rel, $href)
Definition: seo.class.php:72
$oDocumentModel
Definition: ko.install.php:259
const _XE_PATH_
Definition: config.inc.php:49
getModel($module_name)
Definition: func.inc.php:145
applySEO()
Definition: seo.class.php:79
getBrowserTitle($document_title=null)
triggerAfterDocumentUpdateDocument($data)
Definition: seo.class.php:2
getFullUrl()
Definition: func.inc.php:361
addMeta($property, $content, $attr_name= 'property')
Definition: seo.class.php:58