public function view() { $items = $_REQUEST['items']; if (!is_array($items) || empty($items)) { return; } $destination = self::kREORDER_UNKNOWN; if ($this->_context[0] == 'blueprints' && $this->_context[1] == 'pages') { $destination = self::kREORDER_PAGES; } elseif ($this->_context[0] == 'blueprints' && $this->_context[1] == 'sections') { $destination = self::kREORDER_SECTIONS; } elseif ($this->_context[0] == 'extensions') { $destination = self::kREORDER_EXTENSION; } switch ($destination) { case self::kREORDER_PAGES: foreach ($items as $id => $position) { if (!PageManager::edit($id, array('sortorder' => $position))) { $this->setHttpStatus(self::HTTP_STATUS_ERROR); $this->_Result->setValue(__('A database error occurred while attempting to reorder.')); break; } } break; case self::kREORDER_SECTIONS: foreach ($items as $id => $position) { if (!SectionManager::edit($id, array('sortorder' => $position))) { $this->setHttpStatus(self::HTTP_STATUS_ERROR); $this->_Result->setValue(__('A database error occurred while attempting to reorder.')); break; } } break; case self::kREORDER_EXTENSION: // TODO break; case self::kREORDER_UNKNOWN: default: $this->setHttpStatus(self::HTTP_STATUS_BAD_REQUEST); break; } }
public function __actionEdit() { if (@array_key_exists('save', $_POST['action']) || @array_key_exists('done', $_POST['action'])) { $canProceed = true; $fields = $_POST['fields']; $meta = $_POST['meta']; $section_id = $this->_context[1]; $sectionManager = new SectionManager($this->_Parent); $existing_section = $sectionManager->fetch($section_id); $fieldManager = new FieldManager($this->_Parent); $this->_errors = array(); ## Check to ensure all the required section fields are filled if (!isset($meta['name']) || trim($meta['name']) == '') { $required = array('Name'); $this->_errors['name'] = __('This is a required field.'); $canProceed = false; } elseif ($meta['name'] != $existing_section->get('name') && Symphony::Database()->fetchRow(0, "SELECT * FROM `tbl_sections` WHERE `name` = '" . $meta['name'] . "' AND `id` != {$section_id} LIMIT 1")) { $this->_errors['name'] = __('A Section with the name <code>%s</code> name already exists', array($meta['name'])); $canProceed = false; } ## Check to ensure all the required section fields are filled if (!isset($meta['navigation_group']) || strlen(trim($meta['navigation_group'])) == 0) { $required = array('Navigation Group'); $this->_errors['navigation_group'] = __('This is a required field.'); $canProceed = false; } elseif (is_array($fields) && !empty($fields)) { ## Check for duplicate CF names if ($canProceed) { $name_list = array(); foreach ($fields as $position => $data) { if (trim($data['element_name']) == '') { $data['element_name'] = $fields[$position]['element_name'] = Lang::createHandle($data['label'], NULL, '-', false, true, array('@^[\\d-]+@i' => '')); } if (trim($data['element_name']) != '' && in_array($data['element_name'], $name_list)) { $this->_errors[$position] = array('label' => __('Two custom fields have the same element name. All element names must be unique.')); $canProceed = false; break; } $name_list[] = $data['element_name']; } } if ($canProceed) { $fieldManager = new FieldManager($this->_Parent); $unique = array(); foreach ($fields as $position => $data) { $required = NULL; $field = $fieldManager->create($data['type']); $field->setFromPOST($data); if ($field->mustBeUnique() && !in_array($field->get('type'), $unique)) { $unique[] = $field->get('type'); } elseif ($field->mustBeUnique() && in_array($field->get('type'), $unique)) { ## Warning. cannot have 2 of this field! $canProceed = false; $this->_errors[$position] = array('label' => __('There is already a field of type <code>%s</code>. There can only be one per section.', array($field->name()))); } $errors = array(); if (Field::__OK__ != $field->checkFields($errors, false, false) && !empty($errors)) { $this->_errors[$position] = $errors; $canProceed = false; break; } } } } if ($canProceed) { $meta['handle'] = Lang::createHandle($meta['name']); $meta['hidden'] = isset($meta['hidden']) ? 'yes' : 'no'; if (!$sectionManager->edit($section_id, $meta)) { $this->pageAlert(__('An unknown database occurred while attempting to create the section.'), Alert::ERROR); } else { ## Delete missing CF's $id_list = array(); if (is_array($fields) && !empty($fields)) { foreach ($fields as $position => $data) { if (isset($data['id'])) { $id_list[] = $data['id']; } } } $missing_cfs = Symphony::Database()->fetchCol('id', "SELECT `id` FROM `tbl_fields` WHERE `parent_section` = '{$section_id}' AND `id` NOT IN ('" . @implode("', '", $id_list) . "')"); if (is_array($missing_cfs) && !empty($missing_cfs)) { foreach ($missing_cfs as $id) { $fieldManager->delete($id); } } ## Save each custom field if (is_array($fields) && !empty($fields)) { foreach ($fields as $position => $data) { $field = $fieldManager->create($data['type']); $field->setFromPOST($data); $field->set('sortorder', (string) $position); $field->set('parent_section', $section_id); $bEdit = true; if (!$field->get('id')) { $bEdit = false; } ## Creation if ($field->commit()) { $field_id = $field->get('id'); ### # Delegate: FieldPostCreate # Delegate: FieldPostEdit # Description: After creation/editing of an Field. New Field object is provided. $this->_Parent->ExtensionManager->notifyMembers($bEdit ? 'FieldPostEdit' : 'FieldPostCreate', '/blueprints/sections/', array('field' => &$field, 'data' => &$data)); } } } ## TODO: Fix Me ### # Delegate: Edit # Description: After editing a Section. The ID is provided. #$ExtensionManager->notifyMembers('Edit', getCurrentPage(), array('section_id' => $section_id)); redirect(URL . "/symphony/blueprints/sections/edit/{$section_id}/saved/"); } } } if (@array_key_exists("delete", $_POST['action'])) { $section_id = $this->_context[1]; $sectionManager = new SectionManager($this->_Parent); $sectionManager->delete($section_id); redirect(URL . '/symphony/blueprints/sections/'); } }
/** * Commit the settings of this section from the section editor to * create an instance of this section in `tbl_sections`. This function * loops of each of the fields in this section and calls their commit * function. * * @see toolkit.Field#commit() * @return boolean * true if the commit was successful, false otherwise. */ public function commit() { $settings = $this->_data; $section_id = null; if (isset($settings['id'])) { $id = $settings['id']; unset($settings['id']); $section_id = SectionManager::edit($id, $settings); if ($section_id) { $section_id = $id; } } else { $section_id = SectionManager::add($settings); } if (is_numeric($section_id) && $section_id !== false) { for ($ii = 0, $length = count($this->_fields); $ii < $length; $ii++) { $this->_fields[$ii]->set('parent_section', $section_id); $this->_fields[$ii]->commit(); } } }
public function __viewIndex() { $sectionManager = new SectionManager($this->_Parent); if (!($section_id = $sectionManager->fetchIDFromHandle($this->_context['section_handle']))) { Administration::instance()->customError(__('Unknown Section'), __('The Section you are looking, <code>%s</code> for could not be found.', array($this->_context['section_handle']))); } $section = $sectionManager->fetch($section_id); $this->setPageType('table'); $this->setTitle(__('%1$s – %2$s', array(__('Symphony'), $section->get('name')))); $this->Form->setAttribute("class", $this->_context['section_handle']); $entryManager = new EntryManager($this->_Parent); $filter = $filter_value = $where = $joins = NULL; $current_page = isset($_REQUEST['pg']) && is_numeric($_REQUEST['pg']) ? max(1, intval($_REQUEST['pg'])) : 1; if (isset($_REQUEST['filter'])) { list($field_handle, $filter_value) = explode(':', $_REQUEST['filter'], 2); $field_names = explode(',', $field_handle); foreach ($field_names as $field_name) { $filter_value = rawurldecode($filter_value); $filter = Symphony::Database()->fetchVar('id', 0, "SELECT `f`.`id`\n\t\t\t\t\t\t\t\t\t\t FROM `tbl_fields` AS `f`, `tbl_sections` AS `s`\n\t\t\t\t\t\t\t\t\t\t WHERE `s`.`id` = `f`.`parent_section`\n\t\t\t\t\t\t\t\t\t\t AND f.`element_name` = '{$field_name}'\n\t\t\t\t\t\t\t\t\t\t AND `s`.`handle` = '" . $section->get('handle') . "' LIMIT 1"); $field =& $entryManager->fieldManager->fetch($filter); if ($field instanceof Field) { // For deprecated reasons, call the old, typo'd function name until the switch to the // properly named buildDSRetrievalSQL function. $field->buildDSRetrivalSQL(array($filter_value), $joins, $where, false); $filter_value = rawurlencode($filter_value); } } if (!is_null($where)) { $where = str_replace('AND', 'OR', $where); // multiple fields need to be OR $where = trim($where); $where = ' AND (' . substr($where, 2, strlen($where)) . ')'; // replace leading OR with AND } } if (isset($_REQUEST['sort']) && is_numeric($_REQUEST['sort'])) { $sort = intval($_REQUEST['sort']); $order = $_REQUEST['order'] ? strtolower($_REQUEST['order']) : 'asc'; if ($section->get('entry_order') != $sort || $section->get('entry_order_direction') != $order) { $sectionManager->edit($section->get('id'), array('entry_order' => $sort, 'entry_order_direction' => $order)); redirect(Administration::instance()->getCurrentPageURL() . ($filter ? "?filter={$field_handle}:{$filter_value}" : '')); } } elseif (isset($_REQUEST['unsort'])) { $sectionManager->edit($section->get('id'), array('entry_order' => NULL, 'entry_order_direction' => NULL)); redirect(Administration::instance()->getCurrentPageURL()); } $this->Form->setAttribute('action', Administration::instance()->getCurrentPageURL() . '?pg=' . $current_page . ($filter ? "&filter={$field_handle}:{$filter_value}" : '')); $this->appendSubheading($section->get('name'), Widget::Anchor(__('Create New'), Administration::instance()->getCurrentPageURL() . 'new/' . ($filter ? '?prepopulate[' . $filter . ']=' . $filter_value : ''), __('Create a new entry'), 'create button', NULL, array('accesskey' => 'c'))); if (is_null($entryManager->getFetchSorting()->field) && is_null($entryManager->getFetchSorting()->direction)) { $entryManager->setFetchSortingDirection('DESC'); } $entries = $entryManager->fetchByPage($current_page, $section_id, Symphony::Configuration()->get('pagination_maximum_rows', 'symphony'), $where, $joins); $aTableHead = array(); $visible_columns = $section->fetchVisibleColumns(); if (is_array($visible_columns) && !empty($visible_columns)) { foreach ($visible_columns as $column) { $label = $column->get('label'); if ($column->isSortable()) { if ($column->get('id') == $section->get('entry_order')) { $link = Administration::instance()->getCurrentPageURL() . '?pg=' . $current_page . '&sort=' . $column->get('id') . '&order=' . ($section->get('entry_order_direction') == 'desc' ? 'asc' : 'desc') . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''); $anchor = Widget::Anchor($label, $link, __('Sort by %1$s %2$s', array($section->get('entry_order_direction') == 'desc' ? __('ascending') : __('descending'), strtolower($column->get('label')))), 'active'); } else { $link = Administration::instance()->getCurrentPageURL() . '?pg=' . $current_page . '&sort=' . $column->get('id') . '&order=asc' . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''); $anchor = Widget::Anchor($label, $link, __('Sort by %1$s %2$s', array(__('ascending'), strtolower($column->get('label'))))); } $aTableHead[] = array($anchor, 'col', array('id' => 'field-' . $column->get('id'), 'class' => 'field-' . $column->get('type'))); } else { $aTableHead[] = array($label, 'col', array('id' => 'field-' . $column->get('id'), 'class' => 'field-' . $column->get('type'))); } } } else { $aTableHead[] = array(__('ID'), 'col'); } $child_sections = array(); $associated_sections = $section->fetchAssociatedSections(true); if (is_array($associated_sections) && !empty($associated_sections)) { foreach ($associated_sections as $key => $as) { $child_sections[$key] = $sectionManager->fetch($as['child_section_id']); $aTableHead[] = array($child_sections[$key]->get('name'), 'col'); } } /** * Allows the creation of custom entries tablecolumns. Called * after all the Section Visible columns have been added as well * as the Section Associations * * @delegate AddCustomPublishColumn * @since Symphony 2.2 * @param string $context * '/publish/' * @param array $tableHead * An array of the current columns, passed by reference * @param integer $section_id * The current Section ID */ Symphony::ExtensionManager()->notifyMembers('AddCustomPublishColumn', '/publish/', array('tableHead' => &$aTableHead, 'section_id' => $section->get('id'))); ## Table Body $aTableBody = array(); if (!is_array($entries['records']) || empty($entries['records'])) { $aTableBody = array(Widget::TableRow(array(Widget::TableData(__('None found.'), 'inactive', NULL, count($aTableHead))), 'odd')); } else { $field_pool = array(); if (is_array($visible_columns) && !empty($visible_columns)) { foreach ($visible_columns as $column) { $field_pool[$column->get('id')] = $column; } } foreach ($entries['records'] as $entry) { $tableData = array(); ## Setup each cell if (!is_array($visible_columns) || empty($visible_columns)) { $tableData[] = Widget::TableData(Widget::Anchor($entry->get('id'), Administration::instance()->getCurrentPageURL() . 'edit/' . $entry->get('id') . '/')); } else { $link = Widget::Anchor('None', Administration::instance()->getCurrentPageURL() . 'edit/' . $entry->get('id') . '/', $entry->get('id'), 'content'); foreach ($visible_columns as $position => $column) { $data = $entry->getData($column->get('id')); $field = $field_pool[$column->get('id')]; $value = $field->prepareTableValue($data, $position == 0 ? $link : null, $entry->get('id')); if (!is_object($value) && strlen(trim($value)) == 0) { $value = $position == 0 ? $link->generate() : __('None'); } if ($value == 'None') { $tableData[] = Widget::TableData($value, 'inactive field-' . $column->get('type') . ' field-' . $column->get('id')); } else { $tableData[] = Widget::TableData($value, 'field-' . $column->get('type') . ' field-' . $column->get('id')); } unset($field); } } if (is_array($child_sections) && !empty($child_sections)) { foreach ($child_sections as $key => $as) { $field = $entryManager->fieldManager->fetch((int) $associated_sections[$key]['child_section_field_id']); $parent_section_field_id = (int) $associated_sections[$key]['parent_section_field_id']; if (!is_null($parent_section_field_id)) { $search_value = $field->fetchAssociatedEntrySearchValue($entry->getData($parent_section_field_id), $parent_section_field_id, $entry->get('id')); } else { $search_value = $entry->get('id'); } if (!is_array($search_value)) { $associated_entry_count = $field->fetchAssociatedEntryCount($search_value); $tableData[] = Widget::TableData(Widget::Anchor(sprintf('%d →', max(0, intval($associated_entry_count))), sprintf('%s/publish/%s/?filter=%s:%s', SYMPHONY_URL, $as->get('handle'), $field->get('element_name'), rawurlencode($search_value)), $entry->get('id'), 'content')); } } } /** * Allows Extensions to inject custom table data for each Entry * into the Publish Index * * @delegate AddCustomPublishColumnData * @since Symphony 2.2 * @param string $context * '/publish/' * @param array $tableData * An array of `Widget::TableData`, passed by reference * @param integer $section_id * The current Section ID * @param integer $entry_id * The Entry ID for this row */ Symphony::ExtensionManager()->notifyMembers('AddCustomPublishColumnData', '/publish/', array('tableData' => &$tableData, 'section_id' => $section->get('id'), 'entry_id' => $entry)); $tableData[count($tableData) - 1]->appendChild(Widget::Input('items[' . $entry->get('id') . ']', NULL, 'checkbox')); ## Add a row to the body array, assigning each cell to the row $aTableBody[] = Widget::TableRow($tableData, NULL, 'id-' . $entry->get('id')); } } $table = Widget::Table(Widget::TableHead($aTableHead), NULL, Widget::TableBody($aTableBody), 'selectable'); $this->Form->appendChild($table); $tableActions = new XMLElement('div'); $tableActions->setAttribute('class', 'actions'); $options = array(array(NULL, false, __('With Selected...')), array('delete', false, __('Delete'), 'confirm', null, array('data-message' => __('Are you sure you want to delete the selected entries?')))); $toggable_fields = $section->fetchToggleableFields(); if (is_array($toggable_fields) && !empty($toggable_fields)) { $index = 2; foreach ($toggable_fields as $field) { $options[$index] = array('label' => __('Set %s', array($field->get('label'))), 'options' => array()); foreach ($field->getToggleStates() as $value => $state) { $options[$index]['options'][] = array('toggle-' . $field->get('id') . '-' . $value, false, $state); } $index++; } } $tableActions->appendChild(Widget::Select('with-selected', $options)); $tableActions->appendChild(Widget::Input('action[apply]', __('Apply'), 'submit')); $this->Form->appendChild($tableActions); if ($entries['total-pages'] > 1) { $ul = new XMLElement('ul'); $ul->setAttribute('class', 'page'); ## First $li = new XMLElement('li'); if ($current_page > 1) { $li->appendChild(Widget::Anchor(__('First'), Administration::instance()->getCurrentPageURL() . '?pg=1' . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('First')); } $ul->appendChild($li); ## Previous $li = new XMLElement('li'); if ($current_page > 1) { $li->appendChild(Widget::Anchor(__('← Previous'), Administration::instance()->getCurrentPageURL() . '?pg=' . ($current_page - 1) . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('← Previous')); } $ul->appendChild($li); ## Summary $li = new XMLElement('li', __('Page %1$s of %2$s', array($current_page, max($current_page, $entries['total-pages'])))); $li->setAttribute('title', __('Viewing %1$s - %2$s of %3$s entries', array($entries['start'], $current_page != $entries['total-pages'] ? $current_page * Symphony::Configuration()->get('pagination_maximum_rows', 'symphony') : $entries['total-entries'], $entries['total-entries']))); $ul->appendChild($li); ## Next $li = new XMLElement('li'); if ($current_page < $entries['total-pages']) { $li->appendChild(Widget::Anchor(__('Next →'), Administration::instance()->getCurrentPageURL() . '?pg=' . ($current_page + 1) . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('Next →')); } $ul->appendChild($li); ## Last $li = new XMLElement('li'); if ($current_page < $entries['total-pages']) { $li->appendChild(Widget::Anchor(__('Last'), Administration::instance()->getCurrentPageURL() . '?pg=' . $entries['total-pages'] . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('Last')); } $ul->appendChild($li); $this->Form->appendChild($ul); } }
public function __actionNew() { if (@array_key_exists('save', $_POST['action']) || @array_key_exists('done', $_POST['action'])) { $canProceed = true; $edit = $this->_context[0] == "edit"; $this->_errors = array(); $fields = isset($_POST['fields']) ? $_POST['fields'] : array(); $meta = $_POST['meta']; if ($edit) { $section_id = $this->_context[1]; $existing_section = SectionManager::fetch($section_id); } // Check to ensure all the required section fields are filled if (!isset($meta['name']) || strlen(trim($meta['name'])) == 0) { $this->_errors['name'] = __('This is a required field.'); $canProceed = false; } elseif ($edit) { $s = SectionManager::fetchIDFromHandle(Lang::createHandle($meta['name'])); if ($meta['name'] !== $existing_section->get('name') && !is_null($s) && $s !== $section_id) { $this->_errors['name'] = __('A Section with the name %s already exists', array('<code>' . $meta['name'] . '</code>')); $canProceed = false; } } elseif (!is_null(SectionManager::fetchIDFromHandle(Lang::createHandle($meta['name'])))) { $this->_errors['name'] = __('A Section with the name %s already exists', array('<code>' . $meta['name'] . '</code>')); $canProceed = false; } // Check to ensure all the required section fields are filled if (!isset($meta['navigation_group']) || strlen(trim($meta['navigation_group'])) == 0) { $this->_errors['navigation_group'] = __('This is a required field.'); $canProceed = false; } // Basic custom field checking if (is_array($fields) && !empty($fields)) { // Check for duplicate CF names if ($canProceed) { $name_list = array(); foreach ($fields as $position => $data) { if (trim($data['element_name']) == '') { $data['element_name'] = $fields[$position]['element_name'] = $_POST['fields'][$position]['element_name'] = Lang::createHandle($data['label'], 255, '-', false, true, array('@^[\\d-]+@i' => '')); } if (trim($data['element_name']) != '' && in_array($data['element_name'], $name_list)) { $this->_errors[$position] = array('element_name' => __('A field with this handle already exists. All handle must be unique.')); $canProceed = false; break; } $name_list[] = $data['element_name']; } } if ($canProceed) { $unique = array(); foreach ($fields as $position => $data) { $field = FieldManager::create($data['type']); $field->setFromPOST($data); if (isset($existing_section)) { $field->set('parent_section', $existing_section->get('id')); } if ($field->mustBeUnique() && !in_array($field->get('type'), $unique)) { $unique[] = $field->get('type'); } elseif ($field->mustBeUnique() && in_array($field->get('type'), $unique)) { // Warning. cannot have 2 of this field! $canProceed = false; $this->_errors[$position] = array('label' => __('There is already a field of type %s. There can only be one per section.', array('<code>' . $field->handle() . '</code>'))); } $errors = array(); if (Field::__OK__ != $field->checkFields($errors, false) && !empty($errors)) { $this->_errors[$position] = $errors; $canProceed = false; } } } } if ($canProceed) { $meta['handle'] = Lang::createHandle($meta['name']); // If we are creating a new Section if (!$edit) { $meta['sortorder'] = SectionManager::fetchNextSortOrder(); /** * Just prior to saving the Section settings. Use with caution as * there is no additional processing to ensure that Field's or Section's * are unique. * * @delegate SectionPreCreate * @since Symphony 2.2 * @param string $context * '/blueprints/sections/' * @param array $meta * The section's settings, passed by reference * @param array $fields * An associative array of the fields that will be saved to this * section with the key being the position in the Section Editor * and the value being a Field object, passed by reference */ Symphony::ExtensionManager()->notifyMembers('SectionPreCreate', '/blueprints/sections/', array('meta' => &$meta, 'fields' => &$fields)); if (!($section_id = SectionManager::add($meta))) { $this->pageAlert(__('An unknown database occurred while attempting to create the section.'), Alert::ERROR); } } else { $meta['hidden'] = isset($meta['hidden']) ? 'yes' : 'no'; /** * Just prior to updating the Section settings. Use with caution as * there is no additional processing to ensure that Field's or Section's * are unique. * * @delegate SectionPreEdit * @since Symphony 2.2 * @param string $context * '/blueprints/sections/' * @param integer $section_id * The Section ID that is about to be edited. * @param array $meta * The section's settings, passed by reference * @param array $fields * An associative array of the fields that will be saved to this * section with the key being the position in the Section Editor * and the value being a Field object, passed by reference */ Symphony::ExtensionManager()->notifyMembers('SectionPreEdit', '/blueprints/sections/', array('section_id' => $section_id, 'meta' => &$meta, 'fields' => &$fields)); if (!SectionManager::edit($section_id, $meta)) { $canProceed = false; $this->pageAlert(__('An unknown database occurred while attempting to create the section.'), Alert::ERROR); } } if ($section_id && $canProceed) { if ($edit) { // Delete missing CF's $id_list = array(); if (is_array($fields) && !empty($fields)) { foreach ($fields as $position => $data) { if (isset($data['id'])) { $id_list[] = $data['id']; } } } $missing_cfs = Symphony::Database()->fetchCol('id', "SELECT `id` FROM `tbl_fields` WHERE `parent_section` = '{$section_id}' AND `id` NOT IN ('" . @implode("', '", $id_list) . "')"); if (is_array($missing_cfs) && !empty($missing_cfs)) { foreach ($missing_cfs as $id) { FieldManager::delete($id); } } } // Save each custom field if (is_array($fields) && !empty($fields)) { foreach ($fields as $position => $data) { $field = FieldManager::create($data['type']); $field->setFromPOST($data); $field->set('sortorder', (string) $position); $field->set('parent_section', $section_id); $newField = !(bool) $field->get('id'); $field->commit(); $field_id = $field->get('id'); if ($field_id) { if ($newField) { /** * After creation of a Field. * * @delegate FieldPostCreate * @param string $context * '/blueprints/sections/' * @param Field $field * The Field object, passed by reference * @param array $data * The settings for ths `$field`, passed by reference */ Symphony::ExtensionManager()->notifyMembers('FieldPostCreate', '/blueprints/sections/', array('field' => &$field, 'data' => &$data)); } else { /** * After editing of a Field. * * @delegate FieldPostEdit * @param string $context * '/blueprints/sections/' * @param Field $field * The Field object, passed by reference * @param array $data * The settings for ths `$field`, passed by reference */ Symphony::ExtensionManager()->notifyMembers('FieldPostEdit', '/blueprints/sections/', array('field' => &$field, 'data' => &$data)); } } } } if (!$edit) { /** * After the Section has been created, and all the Field's have been * created for this section, but just before the redirect * * @delegate SectionPostCreate * @since Symphony 2.2 * @param string $context * '/blueprints/sections/' * @param integer $section_id * The newly created Section ID. */ Symphony::ExtensionManager()->notifyMembers('SectionPostCreate', '/blueprints/sections/', array('section_id' => $section_id)); redirect(SYMPHONY_URL . "/blueprints/sections/edit/{$section_id}/created/"); } else { /** * After the Section has been updated, and all the Field's have been * updated for this section, but just before the redirect * * @delegate SectionPostEdit * @since Symphony 2.2 * @param string $context * '/blueprints/sections/' * @param integer $section_id * The edited Section ID. */ Symphony::ExtensionManager()->notifyMembers('SectionPostEdit', '/blueprints/sections/', array('section_id' => $section_id)); redirect(SYMPHONY_URL . "/blueprints/sections/edit/{$section_id}/saved/"); } } } } if (@array_key_exists("delete", $_POST['action'])) { $section_id = array($this->_context[1]); /** * Just prior to calling the Section Manager's delete function * * @delegate SectionPreDelete * @since Symphony 2.2 * @param string $context * '/blueprints/sections/' * @param array $section_ids * An array of Section ID's passed by reference */ Symphony::ExtensionManager()->notifyMembers('SectionPreDelete', '/blueprints/sections/', array('section_ids' => &$section_id)); foreach ($section_id as $section) { SectionManager::delete($section); } redirect(SYMPHONY_URL . '/blueprints/sections/'); } }
function __viewIndex() { $sectionManager = new SectionManager($this->_Parent); if (!($section_id = $sectionManager->fetchIDFromHandle($this->_context['section_handle']))) { $this->_Parent->customError(E_USER_ERROR, __('Unknown Section'), __('The Section you are looking, <code>%s</code> for could not be found.', array($this->_context['section_handle'])), false, true); } $section = $sectionManager->fetch($section_id); $this->setPageType('table'); $this->setTitle(__('%1$s – %2$s', array(__('Symphony'), $section->get('name')))); $this->Form->setAttribute("class", $this->_context['section_handle']); $entryManager = new EntryManager($this->_Parent); $authors = AuthorManager::fetch(); $filter = $filter_value = $where = $joins = NULL; $current_page = isset($_REQUEST['pg']) && is_numeric($_REQUEST['pg']) ? max(1, intval($_REQUEST['pg'])) : 1; if (isset($_REQUEST['filter'])) { list($field_handle, $filter_value) = explode(':', $_REQUEST['filter'], 2); $field_names = explode(',', $field_handle); foreach ($field_names as $field_name) { $filter_value = rawurldecode($filter_value); $filter = Symphony::Database()->fetchVar('id', 0, "SELECT `f`.`id` \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t FROM `tbl_fields` AS `f`, `tbl_sections` AS `s` \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t WHERE `s`.`id` = `f`.`parent_section` \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t AND f.`element_name` = '{$field_name}' \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t AND `s`.`handle` = '" . $section->get('handle') . "' LIMIT 1"); $field =& $entryManager->fieldManager->fetch($filter); if (is_object($field)) { $field->buildDSRetrivalSQL(array($filter_value), $joins, $where, false); $filter_value = rawurlencode($filter_value); } } if ($where != null) { $where = str_replace('AND', 'OR', $where); // multiple fields need to be OR $where = trim($where); $where = ' AND (' . substr($where, 2, strlen($where)) . ')'; // replace leading OR with AND } } if (isset($_REQUEST['sort']) && is_numeric($_REQUEST['sort'])) { $sort = intval($_REQUEST['sort']); $order = $_REQUEST['order'] ? strtolower($_REQUEST['order']) : 'asc'; if ($section->get('entry_order') != $sort || $section->get('entry_order_direction') != $order) { $sectionManager->edit($section->get('id'), array('entry_order' => $sort, 'entry_order_direction' => $order)); redirect($this->_Parent->getCurrentPageURL() . ($filter ? "?filter={$field_handle}:{$filter_value}" : '')); } } elseif (isset($_REQUEST['unsort'])) { $sectionManager->edit($section->get('id'), array('entry_order' => NULL, 'entry_order_direction' => NULL)); redirect($this->_Parent->getCurrentPageURL()); } $this->Form->setAttribute('action', $this->_Parent->getCurrentPageURL() . '?pg=' . $current_page . ($filter ? "&filter={$field_handle}:{$filter_value}" : '')); ## Remove the create button if there is a section link field, and no filtering set for it $section_links = $section->fetchFields('sectionlink'); if (count($section_links) > 1 || !$filter && $section_links || is_object($section_links[0]) && $filter != $section_links[0]->get('id')) { $this->appendSubheading($section->get('name')); } else { $this->appendSubheading($section->get('name'), Widget::Anchor(__('Create New'), $this->_Parent->getCurrentPageURL() . 'new/' . ($filter ? '?prepopulate[' . $filter . ']=' . $filter_value : ''), __('Create a new entry'), 'create button')); } if (is_null($entryManager->getFetchSorting()->field) && is_null($entryManager->getFetchSorting()->direction)) { $entryManager->setFetchSortingDirection('DESC'); } $entries = $entryManager->fetchByPage($current_page, $section_id, Symphony::Configuration()->get('pagination_maximum_rows', 'symphony'), $where, $joins); $aTableHead = array(); $visible_columns = $section->fetchVisibleColumns(); if (is_array($visible_columns) && !empty($visible_columns)) { foreach ($visible_columns as $column) { $label = $column->get('label'); if ($column->isSortable()) { if ($column->get('id') == $section->get('entry_order')) { $link = $this->_Parent->getCurrentPageURL() . '?pg=' . $current_page . '&sort=' . $column->get('id') . '&order=' . ($section->get('entry_order_direction') == 'desc' ? 'asc' : 'desc') . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''); $anchor = Widget::Anchor($label, $link, __('Sort by %1$s %2$s', array($section->get('entry_order_direction') == 'desc' ? __('ascending') : __('descending'), strtolower($column->get('label')))), 'active'); } else { $link = $this->_Parent->getCurrentPageURL() . '?pg=' . $current_page . '&sort=' . $column->get('id') . '&order=asc' . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''); $anchor = Widget::Anchor($label, $link, __('Sort by %1$s %2$s', array(__('ascending'), strtolower($column->get('label'))))); } $aTableHead[] = array($anchor, 'col'); } else { $aTableHead[] = array($label, 'col'); } } } else { $aTableHead[] = array(__('ID'), 'col'); } $child_sections = NULL; $associated_sections = $section->fetchAssociatedSections(); if (is_array($associated_sections) && !empty($associated_sections)) { $child_sections = array(); foreach ($associated_sections as $key => $as) { $child_sections[$key] = $sectionManager->fetch($as['child_section_id']); $aTableHead[] = array($child_sections[$key]->get('name'), 'col'); } } ## Table Body $aTableBody = array(); if (!is_array($entries['records']) || empty($entries['records'])) { $aTableBody = array(Widget::TableRow(array(Widget::TableData(__('None found.'), 'inactive', NULL, count($aTableHead))), 'odd')); } else { $bOdd = true; $field_pool = array(); if (is_array($visible_columns) && !empty($visible_columns)) { foreach ($visible_columns as $column) { $field_pool[$column->get('id')] = $column; } } foreach ($entries['records'] as $entry) { $tableData = array(); ## Setup each cell if (!is_array($visible_columns) || empty($visible_columns)) { $tableData[] = Widget::TableData(Widget::Anchor($entry->get('id'), $this->_Parent->getCurrentPageURL() . 'edit/' . $entry->get('id') . '/')); } else { $link = Widget::Anchor('None', $this->_Parent->getCurrentPageURL() . 'edit/' . $entry->get('id') . '/', $entry->get('id'), 'content'); foreach ($visible_columns as $position => $column) { $data = $entry->getData($column->get('id')); $field = $field_pool[$column->get('id')]; $value = $field->prepareTableValue($data, $position == 0 ? $link : null, $entry->get('id')); if (!is_object($value) && strlen(trim($value)) == 0) { $value = $position == 0 ? $link->generate() : __('None'); } if ($value == 'None') { $tableData[] = Widget::TableData($value, 'inactive'); } else { $tableData[] = Widget::TableData($value); } unset($field); } } if (is_array($child_sections) && !empty($child_sections)) { foreach ($child_sections as $key => $as) { $field = $entryManager->fieldManager->fetch((int) $associated_sections[$key]['child_section_field_id']); $parent_section_field_id = (int) $associated_sections[$key]['parent_section_field_id']; if (!is_null($parent_section_field_id)) { $search_value = $field->fetchAssociatedEntrySearchValue($entry->getData($parent_section_field_id), $parent_section_field_id, $entry->get('id')); } else { $search_value = $entry->get('id'); } $associated_entry_count = $field->fetchAssociatedEntryCount($search_value); $tableData[] = Widget::TableData(Widget::Anchor(sprintf('%d →', max(0, intval($associated_entry_count))), sprintf('%s/symphony/publish/%s/?filter=%s:%s', URL, $as->get('handle'), $field->get('element_name'), rawurlencode($search_value)), $entry->get('id'), 'content')); } } $tableData[count($tableData) - 1]->appendChild(Widget::Input('items[' . $entry->get('id') . ']', NULL, 'checkbox')); ## Add a row to the body array, assigning each cell to the row $aTableBody[] = Widget::TableRow($tableData, $bOdd ? 'odd' : NULL); $bOdd = !$bOdd; } } $table = Widget::Table(Widget::TableHead($aTableHead), NULL, Widget::TableBody($aTableBody)); $this->Form->appendChild($table); $tableActions = new XMLElement('div'); $tableActions->setAttribute('class', 'actions'); $options = array(array(NULL, false, __('With Selected...')), array('delete', false, __('Delete'))); $toggable_fields = $section->fetchToggleableFields(); if (is_array($toggable_fields) && !empty($toggable_fields)) { $index = 2; foreach ($toggable_fields as $field) { $options[$index] = array('label' => __('Set %s', array($field->get('label'))), 'options' => array()); foreach ($field->getToggleStates() as $value => $state) { $options[$index]['options'][] = array('toggle-' . $field->get('id') . '-' . $value, false, $state); } $index++; } } $tableActions->appendChild(Widget::Select('with-selected', $options)); $tableActions->appendChild(Widget::Input('action[apply]', __('Apply'), 'submit')); $this->Form->appendChild($tableActions); if ($entries['total-pages'] > 1) { $ul = new XMLElement('ul'); $ul->setAttribute('class', 'page'); ## First $li = new XMLElement('li'); if ($current_page > 1) { $li->appendChild(Widget::Anchor(__('First'), $this->_Parent->getCurrentPageURL() . '?pg=1' . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('First')); } $ul->appendChild($li); ## Previous $li = new XMLElement('li'); if ($current_page > 1) { $li->appendChild(Widget::Anchor(__('← Previous'), $this->_Parent->getCurrentPageURL() . '?pg=' . ($current_page - 1) . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('← Previous')); } $ul->appendChild($li); ## Summary $li = new XMLElement('li', __('Page %1$s of %2$s', array($current_page, max($current_page, $entries['total-pages'])))); $li->setAttribute('title', __('Viewing %1$s - %2$s of %3$s entries', array($entries['start'], min($entries['limit'], max(1, $entries['remaining-entries'])), $entries['total-entries']))); $ul->appendChild($li); ## Next $li = new XMLElement('li'); if ($current_page < $entries['total-pages']) { $li->appendChild(Widget::Anchor(__('Next →'), $this->_Parent->getCurrentPageURL() . '?pg=' . ($current_page + 1) . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('Next →')); } $ul->appendChild($li); ## Last $li = new XMLElement('li'); if ($current_page < $entries['total-pages']) { $li->appendChild(Widget::Anchor(__('Last'), $this->_Parent->getCurrentPageURL() . '?pg=' . $entries['total-pages'] . ($filter ? "&filter={$field_handle}:{$filter_value}" : ''))); } else { $li->setValue(__('Last')); } $ul->appendChild($li); $this->Form->appendChild($ul); } }