예제 #1
0
 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();
         }
     }
 }
예제 #4
0
 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 &ndash; %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 ? "&amp;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 . '&amp;sort=' . $column->get('id') . '&amp;order=' . ($section->get('entry_order_direction') == 'desc' ? 'asc' : 'desc') . ($filter ? "&amp;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 . '&amp;sort=' . $column->get('id') . '&amp;order=asc' . ($filter ? "&amp;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 &rarr;', 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 ? "&amp;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(__('&larr; Previous'), Administration::instance()->getCurrentPageURL() . '?pg=' . ($current_page - 1) . ($filter ? "&amp;filter={$field_handle}:{$filter_value}" : '')));
         } else {
             $li->setValue(__('&larr; 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 &rarr;'), Administration::instance()->getCurrentPageURL() . '?pg=' . ($current_page + 1) . ($filter ? "&amp;filter={$field_handle}:{$filter_value}" : '')));
         } else {
             $li->setValue(__('Next &rarr;'));
         }
         $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 ? "&amp;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/');
     }
 }
예제 #6
0
 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 &ndash; %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 ? "&amp;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 . '&amp;sort=' . $column->get('id') . '&amp;order=' . ($section->get('entry_order_direction') == 'desc' ? 'asc' : 'desc') . ($filter ? "&amp;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 . '&amp;sort=' . $column->get('id') . '&amp;order=asc' . ($filter ? "&amp;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 &rarr;', 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 ? "&amp;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(__('&larr; Previous'), $this->_Parent->getCurrentPageURL() . '?pg=' . ($current_page - 1) . ($filter ? "&amp;filter={$field_handle}:{$filter_value}" : '')));
         } else {
             $li->setValue(__('&larr; 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 &rarr;'), $this->_Parent->getCurrentPageURL() . '?pg=' . ($current_page + 1) . ($filter ? "&amp;filter={$field_handle}:{$filter_value}" : '')));
         } else {
             $li->setValue(__('Next &rarr;'));
         }
         $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 ? "&amp;filter={$field_handle}:{$filter_value}" : '')));
         } else {
             $li->setValue(__('Last'));
         }
         $ul->appendChild($li);
         $this->Form->appendChild($ul);
     }
 }