PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/concrete/src/Page/Type/Composer/Control/BlockControl.php

https://gitlab.com/koodersmiikka/operaatio-terveys
PHP | 391 lines | 335 code | 48 blank | 8 comment | 39 complexity | c9b709f6180e9f3502d3fced6dfa5de4 MD5 | raw file
  1. <?php
  2. namespace Concrete\Core\Page\Type\Composer\Control;
  3. use Concrete\Core\Package\PackageList;
  4. use Loader;
  5. use \Concrete\Core\Foundation\Object;
  6. use Controller;
  7. use Package;
  8. use Block;
  9. use BlockType;
  10. use Environment;
  11. use Page;
  12. use Area;
  13. use PageTemplate;
  14. use \Concrete\Core\Page\Type\Composer\FormLayoutSet as PageTypeComposerFormLayoutSet;
  15. class BlockControl extends Control
  16. {
  17. protected $btID;
  18. protected $ptComposerControlTypeHandle = 'block';
  19. protected $bt = false;
  20. protected $b = false;
  21. protected $controller;
  22. public function setBlockTypeID($btID)
  23. {
  24. $this->btID = $btID;
  25. $this->setPageTypeComposerControlIdentifier($btID);
  26. }
  27. public function getBlockTypeID()
  28. {
  29. return $this->btID;
  30. }
  31. public function export($node)
  32. {
  33. $bt = $this->getBlockTypeObject();
  34. $node->addAttribute('handle', $bt->getBlockTypeHandle());
  35. }
  36. public function shouldPageTypeComposerControlStripEmptyValuesFromPage()
  37. {
  38. return true;
  39. }
  40. public function removePageTypeComposerControlFromPage()
  41. {
  42. $b = $this->getPageTypeComposerControlBlockObject($this->page);
  43. $b->deleteBlock();
  44. }
  45. public function getPageTypeComposerControlBlockObject(Page $c)
  46. {
  47. $db = Loader::db();
  48. if (!is_object($this->b)) {
  49. $setControl = $this->getPageTypeComposerFormLayoutSetControlObject();
  50. $r = $db->GetRow(
  51. $q = 'select cdb.bID, cdb.arHandle from PageTypeComposerOutputBlocks cdb inner join CollectionVersionBlocks cvb on (cdb.bID = cvb.bID and cvb.cID = cdb.cID and cvb.cvID = ?) where cdb.ptComposerFormLayoutSetControlID = ? and cdb.cID = ?',
  52. array(
  53. $c->getVersionID(),
  54. $setControl->getPageTypeComposerFormLayoutSetControlID(),
  55. $c->getCollectionID()
  56. )
  57. );
  58. if (!$r['bID']) {
  59. // this is the first run. so we look for the proxy block.
  60. $pt = PageTemplate::getByID($c->getPageTemplateID());
  61. $outputControl = $setControl->getPageTypeComposerOutputControlObject($pt);
  62. if (is_object($outputControl)) {
  63. $cm = $c->getPageTypeObject();
  64. $mc = $cm->getPageTypePageTemplateDefaultPageObject($pt);
  65. $r = $db->GetRow(
  66. 'select bco.bID, cvb.arHandle from btCorePageTypeComposerControlOutput bco inner join CollectionVersionBlocks cvb on cvb.bID = bco.bID where ptComposerOutputControlID = ? and cvb.cID = ?',
  67. array(
  68. $outputControl->getPageTypeComposerOutputControlID(),
  69. $mc->getCollectionID()
  70. )
  71. );
  72. }
  73. }
  74. if ($r['bID']) {
  75. $b = Block::getByID($r['bID'], $c, $r['arHandle']);
  76. $this->setPageTypeComposerControlBlockObject($b);
  77. return $this->b;
  78. }
  79. }
  80. return $this->b;
  81. }
  82. public function setPageTypeComposerControlBlockObject($b)
  83. {
  84. $this->b = $b;
  85. }
  86. public function getBlockTypeObject()
  87. {
  88. if (!is_object($this->bt)) {
  89. $this->bt = BlockType::getByID($this->btID);
  90. }
  91. return $this->bt;
  92. }
  93. public function getPageTypeComposerControlPageNameValue(Page $dc)
  94. {
  95. if (is_object($this->b)) {
  96. $controller = $this->b->getController();
  97. return $controller->getPageTypeComposerControlPageNameValue();
  98. }
  99. }
  100. public function canPageTypeComposerControlSetPageName()
  101. {
  102. $bt = $this->getBlockTypeObject();
  103. $controller = $bt->getController();
  104. if (method_exists($controller, 'getPageTypeComposerControlPageNameValue')) {
  105. return true;
  106. }
  107. return false;
  108. }
  109. public function isPageTypeComposerControlValueEmpty()
  110. {
  111. $bt = $this->getBlockTypeObject();
  112. $controller = $bt->getController();
  113. if (method_exists($controller, 'isPageTypeComposerControlValueEmpty')) {
  114. $bx = $this->getPageTypeComposerControlBlockObject($this->page);
  115. if (is_object($bx)) {
  116. $controller = $bx->getController();
  117. return $controller->isPageTypeComposerControlValueEmpty();
  118. }
  119. }
  120. return false;
  121. }
  122. public function pageTypeComposerFormControlSupportsValidation()
  123. {
  124. $bt = $this->getBlockTypeObject();
  125. $controller = $bt->getController();
  126. if (method_exists($controller, 'validate_composer')) {
  127. return true;
  128. }
  129. return false;
  130. }
  131. public function addAssetsToRequest(Controller $cnt)
  132. {
  133. $bt = $this->getBlockTypeObject();
  134. $controller = $bt->getController();
  135. $controller->setupAndRun('composer');
  136. }
  137. public function getPageTypeComposerControlCustomTemplates()
  138. {
  139. $bt = $this->getBlockTypeObject();
  140. $txt = Loader::helper('text');
  141. $templates = array();
  142. if (is_object($bt)) {
  143. $blocktemplates = $bt->getBlockTypeComposerTemplates();
  144. if (is_array($blocktemplates)) {
  145. foreach ($blocktemplates as $tpl) {
  146. if (strpos($tpl, '.') !== false) {
  147. $name = substr($txt->unhandle($tpl), 0, strrpos($tpl, '.'));
  148. } else {
  149. $name = $txt->unhandle($tpl);
  150. }
  151. $templates[] = new CustomTemplate($tpl, $name);
  152. }
  153. }
  154. }
  155. return $templates;
  156. }
  157. public function addToPageTypeComposerFormLayoutSet(PageTypeComposerFormLayoutSet $set, $import = false)
  158. {
  159. $layoutSetControl = parent::addToPageTypeComposerFormLayoutSet($set, $import);
  160. $pagetype = $set->getPageTypeObject();
  161. $pagetype->rescanPageTypeComposerOutputControlObjects();
  162. return $layoutSetControl;
  163. }
  164. protected function getController($obj)
  165. {
  166. if (!isset($this->controller)) {
  167. $this->controller = $obj->getController();
  168. $this->controller->setupAndRun('composer');
  169. }
  170. return $this->controller;
  171. }
  172. public function render($label, $customTemplate, $description)
  173. {
  174. $obj = $this->getPageTypeComposerControlDraftValue();
  175. if (!is_object($obj)) {
  176. if ($this->page) {
  177. // we HAVE a page, but we don't have a block object, which means something has gone wrong.
  178. // we've lost the association. So we abort.
  179. Loader::element('page_types/composer/controls/invalid_block');
  180. return;
  181. }
  182. $obj = $this->getBlockTypeObject();
  183. }
  184. $this->getController($obj);
  185. $env = Environment::get();
  186. $form = Loader::helper('form');
  187. $set = $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetObject();
  188. if ($customTemplate) {
  189. $rec = $env->getRecord(
  190. DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle(
  191. ) . '/' . DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' . $customTemplate
  192. );
  193. if ($rec->exists()) {
  194. $template = DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' . $customTemplate;
  195. } else {
  196. foreach (PackageList::get()->getPackages() as $pkg) {
  197. $file =
  198. (is_dir(DIR_PACKAGES . '/' . $pkg->getPackageHandle()) ? DIR_PACKAGES : DIR_PACKAGES_CORE)
  199. . '/' . $pkg->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle() . '/' . DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' .
  200. $customTemplate;
  201. if (file_exists($file)) {
  202. $template = DIRNAME_BLOCK_TEMPLATES_COMPOSER . '/' . $customTemplate;
  203. break;
  204. }
  205. }
  206. }
  207. }
  208. if (!isset($template)) {
  209. $template = FILENAME_BLOCK_COMPOSER;
  210. }
  211. $this->inc($template, array('control' => $this, 'obj' => $obj, 'description' => $description));
  212. }
  213. public function action($task)
  214. {
  215. $obj = $this->getPageTypeComposerControlDraftValue();
  216. if (!is_object($obj)) {
  217. // we don't have a page, an area, or ANYTHING YET.
  218. $arguments = array('/ccm/system/block/action/add_composer',
  219. $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetControlID(),
  220. $task
  221. );
  222. return call_user_func_array(array('\URL', 'to'), $arguments);
  223. } else {
  224. $area = $obj->getBlockAreaObject();
  225. $c = $area->getAreaCollectionObject();
  226. $arguments = array('/ccm/system/block/action/edit_composer',
  227. $c->getCollectionID(),
  228. urlencode($area->getAreaHandle()),
  229. $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerFormLayoutSetControlID(),
  230. $task
  231. );
  232. return call_user_func_array(array('\URL', 'to'), $arguments);
  233. }
  234. }
  235. public function inc($file, $args = array())
  236. {
  237. extract($args);
  238. if (!isset($obj)) {
  239. $obj = $this->getPageTypeComposerControlDraftValue();
  240. if (!is_object($obj)) {
  241. $obj = $this->getBlockTypeObject();
  242. }
  243. }
  244. $controller = $this->getController($obj);
  245. extract($controller->getSets());
  246. extract($controller->getHelperObjects());
  247. $label = $this->getPageTypeComposerFormLayoutSetControlObject()->getPageTypeComposerControlDisplayLabel();
  248. $env = Environment::get();
  249. $pkg = false;
  250. if ($obj->getPackageID() > 0) {
  251. $pkg = Package::getByID($obj->getPackageID());
  252. }
  253. $view = $this;
  254. $r = $env->getRecord(DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle() . '/' . $file, $pkg);
  255. if ($r->exists()) {
  256. include $r->file;
  257. } else {
  258. foreach (PackageList::get()->getPackages() as $pkg) {
  259. $include =
  260. (is_dir(DIR_PACKAGES . '/' . $pkg->getPackageHandle()) ? DIR_PACKAGES : DIR_PACKAGES_CORE)
  261. . '/' . $pkg->getPackageHandle() . '/' . DIRNAME_BLOCKS . '/' . $obj->getBlockTypeHandle() . '/' .
  262. $file;
  263. if (file_exists($include)) {
  264. include $include;
  265. }
  266. }
  267. }
  268. }
  269. public function getPageTypeComposerControlDraftValue()
  270. {
  271. if (is_object($this->page)) {
  272. return $this->getPageTypeComposerControlBlockObject($this->page);
  273. }
  274. }
  275. public function publishToPage(Page $c, $data, $controls)
  276. {
  277. // for blocks, we need to also grab their output
  278. $bt = $this->getBlockTypeObject();
  279. $pt = PageTemplate::getByID($c->getPageTemplateID());
  280. $setControl = $this->getPageTypeComposerFormLayoutSetControlObject();
  281. $b = $this->getPageTypeComposerControlBlockObject($c);
  282. if (!is_object($b)) {
  283. return;
  284. }
  285. // delete the block that this set control has placed on this version, because
  286. // we are going to replace it with a new one.
  287. $db = Loader::db();
  288. $q = 'select cvb.arHandle, cdb.bID, cdb.cbDisplayOrder from PageTypeComposerOutputBlocks cdb inner join CollectionVersionBlocks cvb on (cdb.bID = cvb.bID and cvb.cID = cdb.cID and cvb.cvID = ?) where cdb.ptComposerFormLayoutSetControlID = ? and cdb.cID = ?';
  289. $v = array($c->getVersionID(), $setControl->getPageTypeComposerFormLayoutSetControlID(), $c->getCollectionID());
  290. $row = $db->GetRow($q, $v);
  291. if ($row['bID'] && $row['arHandle']) {
  292. $db->Execute(
  293. 'delete from PageTypeComposerOutputBlocks where ptComposerFormLayoutSetControlID = ? and cID = ?',
  294. array($setControl->getPageTypeComposerFormLayoutSetControlID(), $c->getCollectionID())
  295. );
  296. }
  297. $arHandle = $b->getAreaHandle();
  298. $blockDisplayOrder = $b->getBlockDisplayOrder();
  299. $bFilename = $b->getBlockFilename();
  300. $defaultStyles = $b->getCustomStyle();
  301. $b->deleteBlock();
  302. $ax = Area::getOrCreate($c, $arHandle);
  303. $b = $c->addBlock($bt, $ax, $data);
  304. $this->setPageTypeComposerControlBlockObject($b);
  305. $b->setAbsoluteBlockDisplayOrder($blockDisplayOrder);
  306. if ($bFilename) {
  307. $b->setCustomTemplate($bFilename);
  308. }
  309. if ($defaultStyles) {
  310. $b->setCustomStyleSet($defaultStyles->getStyleSet());
  311. }
  312. // make a reference to the new block
  313. $this->recordPageTypeComposerOutputBlock($b);
  314. }
  315. public function recordPageTypeComposerOutputBlock(\Concrete\Core\Block\Block $block)
  316. {
  317. $db = Loader::db();
  318. $setControl = $this->getPageTypeComposerFormLayoutSetControlObject();
  319. $db->Execute(
  320. 'insert into PageTypeComposerOutputBlocks (cID, arHandle, ptComposerFormLayoutSetControlID, cbDisplayOrder, bID) values (?, ?, ?, ?, ?)',
  321. array(
  322. $block->getBlockCollectionID(),
  323. $block->getAreaHandle(),
  324. $setControl->getPageTypeComposerFormLayoutSetControlID(),
  325. $block->getBlockDisplayOrder(),
  326. $block->getBlockID()
  327. )
  328. );
  329. }
  330. public function validate()
  331. {
  332. $b = $this->getPageTypeComposerControlBlockObject($this->page);
  333. if (is_object($b)) {
  334. $controller = $b->getController();
  335. if (method_exists($controller, 'validate_composer')) {
  336. $e1 = $controller->validate_composer();
  337. }
  338. if (is_object($e1)) {
  339. return $e1;
  340. }
  341. }
  342. }
  343. }