PageRenderTime 61ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/extensions/ds_sections/lib/class.event.php

https://github.com/builders/symphony-3
PHP | 401 lines | 303 code | 85 blank | 13 comment | 50 complexity | 70fe89a3c3921efca9904263f5a8b5ef MD5 | raw file
  1. <?php
  2. require_once LIB . '/class.duplicator.php';
  3. require_once LIB . '/class.entry.php';
  4. require_once LIB . '/class.event.php';
  5. Class SectionsEvent extends Event {
  6. public function __construct(){
  7. // Set Default Values
  8. $this->_about = new StdClass;
  9. $this->_parameters = (object)array(
  10. 'root-element' => null,
  11. 'section' => null,
  12. 'filters' => array(),
  13. 'overrides' => array(),
  14. 'defaults' => array(),
  15. 'output-id-on-save' => false
  16. );
  17. }
  18. public function getType() {
  19. return 'SectionsEvent';
  20. }
  21. public function getTemplate(){
  22. return EXTENSIONS . '/ds_sections/templates/template.event.php';
  23. }
  24. public function prepareDestinationColumnValue(){
  25. $section = Section::loadFromHandle($this->_parameters->section);
  26. if ($section instanceof Section) {
  27. return Widget::TableData(
  28. Widget::Anchor($section->name, ADMIN_URL . '/blueprints/sections/edit/' . $section->handle . '/', array(
  29. 'title' => $section->handle
  30. ))
  31. );
  32. }
  33. else {
  34. return Widget::TableData(__('None'), array(
  35. 'class' => 'inactive'
  36. ));
  37. }
  38. }
  39. /*-----------------------------------------------------------------------*/
  40. public function prepare(array $data = null) {
  41. if (!is_null($data)) {
  42. $this->about()->name = $data['name'];
  43. $this->about()->author->name = Administration::instance()->User->getFullName();
  44. $this->about()->author->email = Administration::instance()->User->email;
  45. $this->parameters()->section = $data['section'];
  46. if(isset($data['output-id-on-save']) && $data['output-id-on-save'] == 'yes'){
  47. $this->parameters()->{'output-id-on-save'} = true;
  48. }
  49. if(isset($data['filters']) && is_array($data['filters']) || !empty($data['filters'])){
  50. $this->parameters()->filters = $data['filters'];
  51. }
  52. if(isset($data['defaults']) && is_array($data['defaults']) || !empty($data['defaults'])){
  53. $defaults = array();
  54. foreach($data['defaults']['field'] as $index => $field){
  55. $defaults[$field] = $data['defaults']['replacement'][$index];
  56. }
  57. $this->parameters()->defaults = $defaults;
  58. }
  59. if(isset($data['overrides']) && is_array($data['overrides']) || !empty($data['overrides'])){
  60. $overrides = array();
  61. foreach($data['overrides']['field'] as $index => $field){
  62. $overrides[$field] = $data['overrides']['replacement'][$index];
  63. }
  64. $this->parameters()->overrides = $overrides;
  65. }
  66. }
  67. }
  68. public function view(SymphonyDOMElement $wrapper, MessageStack $errors) {
  69. $page = Administration::instance()->Page;
  70. $page->insertNodeIntoHead($page->createScriptElement(URL . '/extensions/ds_sections/assets/view.js'));
  71. $layout = new Layout;
  72. $column_1 = $layout->createColumn(Layout::SMALL);
  73. $column_2 = $layout->createColumn(Layout::SMALL);
  74. $column_3 = $layout->createColumn(Layout::LARGE);
  75. $fieldset = Widget::Fieldset(__('Essentials'));
  76. $label = Widget::Label(__('Name'));
  77. $label->appendChild(Widget::Input('fields[name]', General::sanitize($this->about()->name)));
  78. if(isset($errors->{'about::name'})){
  79. $fieldset->appendChild(Widget::wrapFormElementWithError($label, $errors->{'about::name'}));
  80. }
  81. else $fieldset->appendChild($label);
  82. $label = Widget::Label(__('Section'));
  83. $options = array();
  84. foreach (new SectionIterator as $section) {
  85. $options[] = array($section->handle, ($this->parameters()->section == $section->handle), $section->name);
  86. }
  87. $label->appendChild(Widget::Select('fields[section]', $options, array('id' => 'context')));
  88. $fieldset->appendChild($label);
  89. $column_1->appendChild($fieldset);
  90. $fieldset = Widget::Fieldset(__('Processing Options'));
  91. $label = Widget::Label(__('Filter Rules'));
  92. $filters = $this->parameters()->filters;
  93. if(!is_array($filters)) $filters = array();
  94. $options = array(
  95. array('admin-only', in_array('admin-only', $filters), __('Admin Only')),
  96. array('send-email', in_array('send-email', $filters), __('Send Email')),
  97. array('expect-multiple', in_array('expect-multiple', $filters), __('Allow Multiple')),
  98. );
  99. ###
  100. # Delegate: AppendEventFilter
  101. # Description: Allows adding of new filter rules to the Event filter
  102. # rule select box. A reference to the $options array is provided, and selected filters
  103. Extension::notify(
  104. 'AppendEventFilter',
  105. '/blueprints/events/',
  106. array(
  107. 'selected' => $fields['filters'],
  108. 'options' => &$options
  109. )
  110. );
  111. $label->appendChild(Widget::Select('fields[filters][]', $options, array('multiple' => 'multiple')));
  112. $fieldset->appendChild($label);
  113. $label = Widget::Label();
  114. $input = Widget::Input('fields[output-id-on-save]', 'yes', 'checkbox');
  115. if($this->parameters()->{'output-id-on-save'} == true){
  116. $input->setAttribute('checked', 'checked');
  117. }
  118. $label->appendChild($input);
  119. $label->appendChild(new DOMText(__('Add entry ID to the parameter pool in the format of $this-name-id when saving is successful.')));
  120. $fieldset->appendChild($label);
  121. $column_2->appendChild($fieldset);
  122. $fieldset = Widget::Fieldset(__('Overrides & Defaults'), '{$param}');
  123. foreach(new SectionIterator as $section){
  124. $this->appendDuplicator(
  125. $fieldset, $section,
  126. ($this->parameters()->section == $section->handle
  127. ? array(
  128. 'overrides' => $this->parameters()->overrides,
  129. 'defaults' => $this->parameters()->defaults
  130. )
  131. : NULL
  132. )
  133. );
  134. }
  135. $column_3->appendChild($fieldset);
  136. $layout->appendTo($wrapper);
  137. }
  138. protected function appendDuplicator(SymphonyDOMElement $wrapper, Section $section, array $items = null) {
  139. $document = $wrapper->ownerDocument;
  140. $duplicator = new Duplicator(__('Add Item'));
  141. $duplicator->addClass('context context-' . $section->handle);
  142. $item = $duplicator->createTemplate(__('Override'));
  143. $label = Widget::Label(__('Field'));
  144. $options = array(array('system:id', false, 'System ID'));
  145. foreach($section->fields as $f){
  146. $options[] = array(General::sanitize($f->{'element-name'}), false, General::sanitize($f->label));
  147. }
  148. $label->appendChild(Widget::Select('fields[overrides][field][]', $options));
  149. $item->appendChild($label);
  150. $label = Widget::Label(__('Replacement'));
  151. $label->appendChild(Widget::Input('fields[overrides][replacement][]'));
  152. $item->appendChild($label);
  153. $item = $duplicator->createTemplate(__('Default Value'));
  154. $label = Widget::Label(__('Field'));
  155. $options = array(array('system:id', false, 'System ID'));
  156. foreach ($section->fields as $f) {
  157. $options[] = array(General::sanitize($f->{'element-name'}), false, General::sanitize($f->label));
  158. }
  159. $label->appendChild(Widget::Select('fields[defaults][field][]', $options));
  160. $item->appendChild($label);
  161. $label = Widget::Label(__('Replacement'));
  162. $label->appendChild(Widget::Input('fields[defaults][replacement][]'));
  163. $item->appendChild($label);
  164. if(is_array($items['overrides'])){
  165. foreach($items['overrides'] as $field_name => $replacement){
  166. $item = $duplicator->createInstance(__('Override'));
  167. $label = Widget::Label(__('Field'));
  168. $options = array(array('system:id', false, 'System ID'));
  169. foreach($section->fields as $f){
  170. $options[] = array(
  171. General::sanitize($f->{'element-name'}),
  172. $f->{'element-name'} == $field_name,
  173. General::sanitize($f->label)
  174. );
  175. }
  176. $label->appendChild(Widget::Select('fields[overrides][field][]', $options));
  177. $item->appendChild($label);
  178. $label = Widget::Label(__('Replacement'));
  179. $label->appendChild(Widget::Input('fields[overrides][replacement][]', General::sanitize($replacement)));
  180. $item->appendChild($label);
  181. }
  182. }
  183. if(is_array($items['defaults'])){
  184. foreach($items['defaults'] as $field_name => $replacement){
  185. $item = $duplicator->createInstance(__('Default Value'));
  186. $label = Widget::Label(__('Field'));
  187. $options = array(array('system:id', false, 'System ID'));
  188. foreach($section->fields as $f){
  189. $options[] = array(
  190. General::sanitize($f->{'element-name'}),
  191. $f->{'element-name'} == $field_name,
  192. General::sanitize($f->label)
  193. );
  194. }
  195. $label->appendChild(Widget::Select('fields[defaults][field][]', $options));
  196. $item->appendChild($label);
  197. $label = Widget::Label(__('Replacement'));
  198. $label->appendChild(Widget::Input('fields[defaults][replacement][]', General::sanitize($replacement)));
  199. $item->appendChild($label);
  200. }
  201. }
  202. $duplicator->appendTo($wrapper);
  203. }
  204. /*-----------------------------------------------------------------------*/
  205. public function canTrigger(array $data) {
  206. if (!isset($data['action'][$this->parameters()->{'root-element'}])) return false;
  207. return true;
  208. }
  209. public function trigger(Register $ParameterOutput, array $postdata){
  210. $result = new XMLDocument;
  211. $result->appendChild($result->createElement($this->parameters()->{'root-element'}));
  212. $root = $result->documentElement;
  213. if(isset($postdata['id'])){
  214. $entry = Entry::loadFromID($postdata['id']);
  215. $type = 'edit';
  216. }
  217. else{
  218. $entry = new Entry;
  219. $entry->section = $this->parameters()->{'section'};
  220. if(isset(Frontend::instance()->User) && Frontend::instance()->User instanceof User){
  221. $entry->user_id = Frontend::instance()->User->id;
  222. }
  223. else{
  224. $entry->user_id = (int)Symphony::Database()->query("SELECT `id` FROM `tbl_users` ORDER BY `id` ASC LIMIT 1")->current()->id;
  225. }
  226. $type = 'create';
  227. }
  228. if(isset($postdata['fields']) && is_array($postdata['fields']) && !empty($postdata['fields'])){
  229. $entry->setFieldDataFromFormArray($postdata['fields']);
  230. }
  231. $root->setAttribute('type', $type);
  232. ###
  233. # Delegate: EntryPreCreate
  234. # Description: Just prior to creation of an Entry. Entry object provided
  235. Extension::notify(
  236. 'EntryPreCreate', '/frontend/',
  237. array('entry' => &$entry)
  238. );
  239. $errors = new MessageStack;
  240. $status = Entry::save($entry, $errors);
  241. if($status == Entry::STATUS_OK){
  242. ###
  243. # Delegate: EntryPostCreate
  244. # Description: Creation of an Entry. New Entry object is provided.
  245. Extension::notify(
  246. 'EntryPostCreate', '/frontend/',
  247. array('entry' => $entry)
  248. );
  249. if($this->parameters()->{'output-id-on-save'} == true){
  250. $ParameterOutput->{sprintf('event-%s-id', $this->parameters()->{'root-element'})} = $entry->id;
  251. }
  252. $root->setAttribute('result', 'success');
  253. $root->appendChild($result->createElement(
  254. 'message',
  255. __("Entry %s successfully.", array(($type == 'edit' ? __('edited') : __('created'))))
  256. ));
  257. }
  258. else{
  259. $root->setAttribute('result', 'error');
  260. $root->appendChild($result->createElement(
  261. 'message', __('Entry encountered errors when saving.')
  262. ));
  263. if(!isset($postdata['fields']) || !is_array($postdata['fields'])) {
  264. $postdata['fields'] = array();
  265. }
  266. $element = $result->createElement('values');
  267. $this->appendValues($element, $postdata['fields']);
  268. $root->appendChild($element);
  269. $element = $result->createElement('errors');
  270. $this->appendMessages($element, $errors);
  271. $root->appendChild($element);
  272. }
  273. return $result;
  274. }
  275. protected function appendValues(DOMElement $wrapper, array $values) {
  276. $document = $wrapper->ownerDocument;
  277. foreach ($values as $key => $value) {
  278. if (is_numeric($key)) {
  279. $element = $document->createElement('item');
  280. }
  281. else {
  282. $element = $document->createElement($key);
  283. }
  284. if (is_array($value) and !empty($value)) {
  285. $this->appendValues($element, $value);
  286. }
  287. else {
  288. $element->setValue((string)$value);
  289. }
  290. $wrapper->appendChild($element);
  291. }
  292. }
  293. protected function appendMessages(DOMElement $wrapper, MessageStack $messages) {
  294. $document = $wrapper->ownerDocument;
  295. foreach ($messages as $key => $value) {
  296. if (is_numeric($key)) {
  297. $element = $document->createElement('item');
  298. }
  299. else {
  300. $element = $document->createElement($key);
  301. }
  302. if ($value instanceof $messages and $value->valid()) {
  303. $this->appendMessages($element, $value);
  304. }
  305. else if ($value instanceof STDClass) {
  306. $element->setValue($value->message);
  307. $element->setAttribute('type', $value->code);
  308. }
  309. else {
  310. continue;
  311. }
  312. $wrapper->appendChild($element);
  313. }
  314. }
  315. }
  316. ?>