PageRenderTime 35ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 1ms

/classes/bors/admin/engine.php

https://bitbucket.org/Balancer/bors-core
PHP | 529 lines | 392 code | 119 blank | 18 comment | 96 complexity | cb3b3464b327105176064701272f741f MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. class bors_admin_engine extends bors_object
  3. {
  4. function object() { return $this->id(); }
  5. function real_object()
  6. {
  7. $obj = $this->object();
  8. if($obj->class_name() != $obj->extends_class_name())
  9. $obj = object_property($this->object(), 'real_object', $this->object());
  10. return $obj;
  11. }
  12. function admin_object()
  13. {
  14. $obj = $this->object();
  15. return object_property($this->object(), 'admin_object', $this->object());
  16. }
  17. function url() { return $this->url_ex($this->page()); }
  18. function url_ex($page)
  19. {
  20. $url = $this->admin_url();
  21. if($page && $page != 1)
  22. $url .= "$page/";
  23. return $url;
  24. }
  25. function admin_url()
  26. {
  27. $obj = $this->real_object();
  28. if($url = $obj->get('admin_url'))
  29. return $url;
  30. if($url = $obj->get('edit_url'))
  31. return $url;
  32. if($obj->storage())
  33. return '/_bors/admin/edit-smart/?object='.$obj->internal_uri_ascii();
  34. return NULL;
  35. }
  36. function edit_url()
  37. {
  38. $obj = $this->real_object();
  39. if($url = $obj->get('edit_url'))
  40. return $url;
  41. if($url = $obj->get('admin_url'))
  42. return $url;
  43. if($obj->storage())
  44. return '/_bors/admin/edit-smart/?object='.$obj->internal_uri_ascii();
  45. return NULL;
  46. }
  47. function delete_url()
  48. {
  49. $obj = $this->admin_object();
  50. if(!$obj)
  51. return NULL;
  52. if(method_exists($obj, 'delete_url'))
  53. return $obj->delete_url();
  54. $ref = urlencode($this->parent_delete_url());
  55. //TODO: придумать лучший вариант определения. Отказаться от has_smart_field.
  56. if(method_exists($obj, 'fields') && $obj->has_smart_field('is_deleted'))
  57. return '/_bors/admin/mark/delete/?object='.$obj->internal_uri().'&ref='.$ref;
  58. else
  59. return '/_bors/admin/delete/?object='.$obj->internal_uri().'&ref='.$ref;
  60. }
  61. function parent_delete_url()
  62. {
  63. $obj = $this->real_object();
  64. $obj_admin_url = $this->url();
  65. $request_url = bors()->request()->url();
  66. // Хак для edit-smart: http://admin.aviaport.ru/_bors/admin/edit-smart/?object=aviaport_directory_airline_xref_plane__3
  67. if($x = $this->get('object'))
  68. {
  69. $obj = $x;
  70. $obj_admin_url = $this->admin()->url();
  71. $request_url = $x->get('url');
  72. }
  73. // Если ссылка главного объекта не равна ссылке на удаляемый файл
  74. // то родительской страницей (реферером для возврата) является главная страница
  75. // Тестировать на: http://ipotek-bank.wrk.ru/admin/dbpages/10
  76. // var_dump($request_url, $obj->get('url'), $obj_admin_url);
  77. if(!blib_urls::in_array($request_url, array(
  78. $obj->get('url'),
  79. $obj_admin_url,
  80. )))
  81. return bors()->request()->url();
  82. // Если у объекта есть метод admin_parent_url, то берём оттуда:
  83. if($url = $obj->get('admin_parent_url'))
  84. return $url;
  85. // Иначе берём первого родителя из ссылки (если есть)
  86. if($obj_admin_url)
  87. {
  88. if($this->url() != $obj_admin_url)
  89. $obj = bors_load_uri($obj_admin_url);
  90. else
  91. $obj = $this;
  92. $ps1 = object_property($this, 'parents');
  93. if($p1 = $ps1[0])
  94. return $p1;
  95. }
  96. //WTF?
  97. // $ps2 = object_property(bors_load_uri($p1), 'parents');
  98. // if($p2 = $ps2[0])
  99. // return $p2;
  100. // Иначе смотрим на реферер
  101. // Если он не равен текущей странице, то он нам и нужен
  102. if($ref = bors()->request()->referer())
  103. {
  104. if(!blib_urls::in_array($ref, array(
  105. $obj->url(),
  106. $obj->admin()->url(),
  107. )))
  108. return $ref;
  109. }
  110. return NULL;
  111. }
  112. function append_child_url()
  113. {
  114. if(method_exists($obj = $this->real_object(), 'admin_append_child_url'))
  115. return $obj->admin_append_child_url();
  116. return '/_bors/admin/append/child?object='.urlencode($obj->internal_uri());
  117. }
  118. function property_url()
  119. {
  120. if(method_exists($obj = $this->real_object(), 'manage_url'))
  121. return $obj->property_url();
  122. return '/_bors/admin/property?object='.urlencode($obj->internal_uri());
  123. }
  124. function imaged_titled_link($title = NULL)
  125. {
  126. $obj = $this->real_object();
  127. if(is_null($title))
  128. $title = $obj->title();
  129. if(!$title)
  130. $title = ec('[без имени]');
  131. if(object_property($obj->access(), 'can_edit'))
  132. $res = "<a rel=\"nofollow\" href=\"{$obj->admin()->url()}\">{$title}</a>";
  133. else
  134. $res = "{$title}<!-- ".object_property($obj->access(), 'debug_title', 'access is NULL')." of {$obj->debug_title()} -->";
  135. try
  136. {
  137. if($obj->url())
  138. $res .= "&nbsp;<a rel=\"nofollow\" href=\"{$obj->url()}\" target=\"_blank\"><img src=\"/_bors/i/look-16.gif\" width=\"16\" height=\"16\" alt=\"View\" title=\"".ec('Посмотреть на сайте')."\" style=\"vertical-align:middle\" /></a>";
  139. }
  140. catch(Exception $e) { }
  141. return $res;
  142. }
  143. function imaged_titled_link_ex($params=[])
  144. {
  145. if(is_array($params))
  146. $mode = popval($params, 'mode');
  147. else
  148. {
  149. $mode = $params;
  150. $params = array();
  151. }
  152. $obj = $this->real_object();
  153. if(array_key_exists('title', $params))
  154. {
  155. $title = defval($params, 'title');
  156. }
  157. else
  158. {
  159. $title = $obj->title();
  160. if(!$title)
  161. $title = ec('[без имени]');
  162. }
  163. if($title)
  164. {
  165. if($obj->access()->can_edit())
  166. $html = "<a rel=\"nofollow\" href=\"{$obj->admin()->url()}\">{$title}</a>";
  167. else
  168. $html = "{$title}";
  169. }
  170. try
  171. {
  172. if(stripos($mode, 'v') !== false && $obj->url())
  173. $html .= "&nbsp;<a rel=\"nofollow\" href=\"{$obj->url()}\" target=\"_blank\"><img src=\"/_bors/i/look-16.gif\" width=\"16\" height=\"16\" alt=\"View\" title=\"".ec('Посмотреть на сайте')."\" style=\"vertical-align:middle\" /></a>";
  174. }
  175. catch(Exception $e) { }
  176. if(stripos($mode, 'e') !== false && $obj->access()->can_delete())
  177. $html .= '&nbsp;' . $this->imaged_edit_link('');
  178. if(stripos($mode, 'd') !== false && $obj->access()->can_delete())
  179. $html .= '&nbsp;' . $this->imaged_delete_link('');
  180. if(stripos($mode, 'u') !== false && $obj->access()->can_action(NULL,NULL))
  181. $html .= '&nbsp;' . $this->imaged_action_link('unlink', $params);
  182. if(!empty($params['actions']))
  183. {
  184. require_once('inc/images.php');
  185. foreach($params['actions'] as $x)
  186. $html .= '&nbsp;' . bors_icon($x['image'], array('url' => $x['url'], 'title' => $x['title']));
  187. }
  188. return $html;
  189. }
  190. function imaged_direct_titled_link($params=[])
  191. {
  192. if(!is_array($params))
  193. {
  194. $title = $params;
  195. $params = [];
  196. }
  197. else
  198. $title = popval($params, 'title');
  199. $obj = $this->real_object();
  200. if(is_null($title))
  201. $title = $obj->title();
  202. if(!$title)
  203. $title = ec('[без имени]');
  204. $res = "<a rel=\"nofollow\" href=\"{$obj->url()}\">{$title}</a>";
  205. $popup = config('titles.imaged_direct_titled_link.popup', ec('Изменить'));
  206. try
  207. {
  208. //FIXME: подключить проверку доступа
  209. if($obj->url() && $obj->access()->can_edit())
  210. $res .= "&nbsp;<a rel=\"nofollow\" href=\"{$obj->admin()->edit_url()}\"><img src=\"/_bors/i16/edit.png\" width=\"16\" height=\"16\" alt=\"View\" title=\"".htmlspecialchars($popup)."\" style=\"vertical-align:middle\" /></a>";
  211. }
  212. catch(Exception $e) { }
  213. return $res;
  214. }
  215. function imaged_link($type, $image, $title=NULL)
  216. {
  217. require_once('inc/images.php');
  218. $url = $this->object()->urls($type);
  219. return bors_icon($image, array('url' => $url, 'title' => $title));
  220. }
  221. function imaged_action_link($action, $params=[])
  222. {
  223. require_once('inc/images.php');
  224. $url = defval($params, 'url');
  225. if(!$url)
  226. $url = $this->admin_object()->url().'?act='.htmlspecialchars($action);
  227. return bors_icon(defval($params, 'image', $action), ['url' => $url, 'title' => defval($params, 'title')]);
  228. }
  229. function titled_link($title = NULL)
  230. {
  231. $obj = $this->real_object();
  232. if(is_null($title))
  233. $title = $obj->title();
  234. return "<a rel=\"nofollow\" href=\"{$obj->admin()->url()}\">{$title}</a>\n";
  235. }
  236. function imaged_nav_named_link()
  237. {
  238. $obj = $this->real_object();
  239. return "<a rel=\"nofollow\" href=\"{$obj->admin()->url()}\">{$obj->nav_name()}</a>&nbsp;<a rel=\"nofollow\" href=\"{$obj->url()}\" target=\"_blank\"><img src=\"/_bors/i/look-16.gif\" width=\"16\" height=\"16\" alt=\"View\" title=\"".ec('Посмотреть на сайте')."\" style=\"vertical-align:middle\" /></a>";
  240. }
  241. function imaged_edit_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  242. {
  243. $obj = $this->real_object();
  244. if(is_null($title))
  245. $title = ec('Редактировать ')
  246. .bors_lower($obj->class_title_vp())
  247. .ec(' «').$obj->title().ec('»');
  248. $x = $title ? '&nbsp;' : '';
  249. $url = $this->edit_url();
  250. if(is_null($popup))
  251. $popup = $title;
  252. if(!bors()->main_object() || $unlink_in_admin && preg_match('!'.preg_quote($obj->admin()->admin_url(), '!').'!', bors()->main_object()->url()))
  253. $url = '';
  254. if($url)
  255. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/edit-16.png\" width=\"16\" height=\"16\" alt=\"edit\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  256. else
  257. return "<img src=\"/_bors/i/edit-16.png\" width=\"16\" height=\"16\" alt=\"edit\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  258. }
  259. function imaged_append_child_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  260. {
  261. $obj = $this->real_object();
  262. if(is_null($title))
  263. $title = ec('Добавить дочерний объект');
  264. $x = $title ? '&nbsp;' : '';
  265. $url = $this->append_child_url();
  266. if(is_null($popup))
  267. $popup = $title;
  268. if(!bors()->main_object() || $unlink_in_admin && preg_match('!'.preg_quote($obj->admin()->append_child_url(), '!').'!', bors()->main_object()->url()))
  269. $url = '';
  270. if($url)
  271. return "<a href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/new-16.png\" width=\"16\" height=\"16\" alt=\"edit\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  272. else
  273. return "<img src=\"/_bors/i/new-16.png\" width=\"16\" height=\"16\" alt=\"edit\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  274. }
  275. function imaged_property_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  276. {
  277. $obj = $this->real_object();
  278. if(is_null($title))
  279. $title = ec('Свойства ')
  280. .bors_lower($obj->class_title_rp())
  281. .' '
  282. .$obj->title();
  283. $x = $title ? '&nbsp;' : '';
  284. $url = $this->property_url();
  285. if(is_null($popup))
  286. $popup = $title;
  287. if(!bors()->main_object() || $unlink_in_admin && preg_match('!'.preg_quote($obj->admin()->property_url(), '!').'!', bors()->main_object()->url()))
  288. $url = '';
  289. if($url)
  290. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/property-16.png\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  291. else
  292. return "<img src=\"/_bors/i/property-16.png\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  293. }
  294. function hide_url()
  295. {
  296. if(method_exists($obj = $this->object(), 'hide_url'))
  297. return $obj->hide_url();
  298. return '/_bors/admin/visibility?act=' . ( $obj->is_hidden() ? 'show' : 'hide') . '&object='.urlencode($obj->internal_uri());
  299. }
  300. function imaged_hide_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  301. {
  302. $obj = $this->object();
  303. $full_title = ($obj->is_hidden() ? ec('Показать ') : ec('Скрыть '))
  304. .bors_lower($obj->class_title())
  305. .' '
  306. .$obj->title();
  307. if(is_null($title))
  308. $title = $full_title;
  309. $x = $title ? '&nbsp;' : '';
  310. $url = $this->hide_url();
  311. if(is_null($popup))
  312. $popup = $full_title;
  313. if(!bors()->main_object() || $unlink_in_admin && preg_match('!'.preg_quote($obj->admin()->hide_url(), '!').'!', bors()->main_object()->url()))
  314. $url = '';
  315. $img = $obj->is_hidden() ? 'visible' : 'hidden';
  316. $alt = $obj->is_hidden() ? 'show' : 'hide';
  317. if($url)
  318. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/$img-16.gif\" width=\"16\" height=\"16\" alt=\"$alt\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  319. else
  320. return "<img src=\"/_bors/i/$img-16.gif\" width=\"16\" height=\"16\" alt=\"$alt\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  321. }
  322. function imaged_delete_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  323. {
  324. $obj = $this->real_object();
  325. if(!$obj->access()->get('can_delete'))
  326. return '';
  327. // http://admin.aviaport.ru/digest/origins/3516/ — внизу страницы
  328. $delete_text = ec('Удаление ')
  329. .bors_lower($obj->class_title_rp())
  330. .ec(' «').$obj->get('title').ec('»');
  331. // Справа в http://admin.aviaport.ru/_bors/admin/edit/synonyms/?real_object=aviaport_directory_aviafirms_firm__1519&object=aviaport_admin_directory_aviafirms_firm__1519&edit_class=http://admin.aviaport.ru/directory/aviafirms/1519/
  332. if($title===false)
  333. $title = '';
  334. // Внизу http://admin.aviaport.ru/digest/origins/3516/
  335. elseif(is_null($title))
  336. $title = $delete_text;
  337. $x = $title ? '&nbsp;' : '';
  338. $url = $this->delete_url();
  339. if(is_null($popup))
  340. $popup = $delete_text;
  341. if(!bors()->main_object() ||
  342. ($unlink_in_admin
  343. && preg_match('!'.preg_quote($obj->admin()->delete_url(), '!').'!',
  344. bors()->main_object()->url()))
  345. )
  346. $url = '';
  347. if($url)
  348. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i16/delete.png\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  349. else
  350. return "<img src=\"/_bors/i16/delete.png\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  351. }
  352. function login_url() { return $this->real_object()->url().'?login'; }
  353. function imaged_login_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  354. {
  355. $obj = $this->real_object();
  356. if(is_null($title))
  357. $title = ec('Вход в систему');
  358. $x = $title ? '&nbsp;' : '';
  359. $url = $this->login_url();
  360. if(is_null($popup))
  361. $popup = $title;
  362. if(!bors()->main_object() || preg_match('!\?login$!', bors()->main_object()->url()))
  363. $url = '';
  364. if($url)
  365. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/login-16.gif\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  366. else
  367. return "<img src=\"/_bors/i/login-16.gif\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/>{$x}{$title}";
  368. }
  369. function logout_url() { return $this->real_object()->url().'?logout'; }
  370. function imaged_logout_link($title = NULL, $popup = NULL, $unlink_in_admin = true)
  371. {
  372. if(is_null($title))
  373. $title = ec('Выход из системы');
  374. $x = $title ? '&nbsp;' : '';
  375. $url = $this->logout_url();
  376. if(is_null($popup))
  377. $popup = $title;
  378. return "<a rel=\"nofollow\" href=\"{$url}\" style=\"text-decoration: none\"><img src=\"/_bors/i/logout-16.png\" width=\"16\" height=\"16\" alt=\"prop\" title=\"$popup\" style=\"vertical-align:middle\"/></a>{$x}".($title?"<a rel=\"nofollow\" href=\"{$url}\" title=\"$popup\">{$title}</a>":'');
  379. }
  380. function imaged_set_default_link($item, $title = NULL, $popup = NULL)
  381. {
  382. if(is_null($title))
  383. $title = ec('Сделать изображением по умолчанию');
  384. if(is_null($popup))
  385. $popup = ec('Сделать изображением по умолчанию');
  386. if($title)
  387. $title = "&nbsp;$title";
  388. return "<a rel=\"nofollow\" href=\"".$this->object()->setdefaultfor_url($item)."\"><img src=\"/_bors/i/set-default-16.gif\" width=\"16\" height=\"16\" alt=\"def\" title=\"$popup\"/>{$title}</a>";
  389. }
  390. function edit_links()
  391. {
  392. return "/admin/edit/crosslinks/?object={$this->real_object()->internal_uri()}&edit_class={$this->real_object()->admin()->url()}";
  393. }
  394. function urls($type = NULL)
  395. {
  396. $object = $this->object();
  397. if(method_exists($object, 'urls') && ($object_url = $object->urls($type)) && !is_object($object_url))
  398. return $object_url;
  399. switch($type)
  400. {
  401. case 'links':
  402. return config('admin_host_url')."/_bors/admin/edit/crosslinks/?real_object={$this->real_object()->internal_uri_ascii()}&object={$this->object()->internal_uri_ascii()}&edit_class={$this->real_object()->admin()->url()}";
  403. case 'synonyms':
  404. return config('admin_host_url')."/_bors/admin/edit/synonyms/?real_object={$this->real_object()->internal_uri_ascii()}&object={$this->object()->internal_uri_ascii()}&edit_class={$this->real_object()->admin()->url()}";
  405. case 'new':
  406. return config('admin_host_url')."/{$object->section_name()}/new/";
  407. }
  408. return $this->object()->admin()->url().$type.'/';
  409. }
  410. }