public static function updateSections()
 {
     $files = General::listStructure(WORKSPACE . '/sections', array(), false);
     $engine =& Symphony::Engine();
     $sectionManager = new SectionManager($engine);
     $fieldManager = new FieldManager($engine);
     if (is_array($files['filelist']) && !empty($files['filelist'])) {
         foreach ($files['filelist'] as $filename) {
             $data = @file_get_contents(WORKSPACE . "/sections/{$filename}");
             // Create DOMDocument instance
             $xml = new DOMDocument();
             $xml->preserveWhiteSpace = false;
             $xml->formatOutput = true;
             $xml->loadXML($data);
             // XPath for querying nodes
             $xpath = new DOMXPath($xml);
             $editing = false;
             $section_guid = $xpath->query('/section/@guid')->item(0)->value;
             $sections = Symphony::Database()->fetchCol('guid', "SELECT * FROM `tbl_sections`");
             if (in_array($section_guid, $sections)) {
                 $editing = true;
             }
             // Meta data
             $meta = array();
             $meta_nodes = $xpath->query('/section/meta/*');
             foreach ($meta_nodes as $node) {
                 $meta[$node->tagName] = $node->textContent;
             }
             if ($editing) {
                 Symphony::Database()->update($meta, 'tbl_sections', "guid = {$section_guid}");
             } else {
                 $section_id = $sectionManager->add($meta);
             }
             // Fields
             $fields = array();
             $field_nodes = $xpath->query('/section/fields/entry');
             foreach ($field_nodes as $node) {
                 $field = array();
                 foreach ($node->childNodes as $childNode) {
                     $field[$childNode->tagName] = $childNode->textContent;
                 }
                 $fields[] = $field;
             }
             self::removeMissingFields($fields, $fieldManager);
             if (is_array($fields) && !empty($fields)) {
                 foreach ($fields as $data) {
                     $field = $fieldManager->create($data['type']);
                     $field->setFromPOST($data);
                     $field->commit();
                 }
             }
         }
     }
 }
 public function __actionNew()
 {
     if (@array_key_exists('save', $_POST['action']) || @array_key_exists('done', $_POST['action'])) {
         $canProceed = true;
         $fields = $_POST['fields'];
         $meta = $_POST['meta'];
         $this->_errors = array();
         ## Check to ensure all the required section fields are filled
         if (!isset($meta['name']) || strlen(trim($meta['name'])) == 0) {
             $required = array('Name');
             $this->_errors['name'] = __('This is a required field.');
             $canProceed = false;
         } elseif (Symphony::Database()->fetchRow(0, "SELECT * FROM `tbl_sections` WHERE `name` = '" . Symphony::Database()->cleanValue($meta['name']) . "' 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;
         }
         ## Basic custom field checking
         if (is_array($fields) && !empty($fields)) {
             $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('element_name' => __('Two custom fields have the same element name. All element names must be unique.'));
                     $canProceed = false;
                     break;
                 }
                 $name_list[] = $data['element_name'];
             }
             $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) {
             $query = 'SELECT MAX(`sortorder`) + 1 AS `next` FROM tbl_sections LIMIT 1';
             $next = Symphony::Database()->fetchVar('next', 0, $query);
             $meta['sortorder'] = $next ? $next : '1';
             $meta['handle'] = Lang::createHandle($meta['name']);
             $sectionManager = new SectionManager($this->_Parent);
             if (!($section_id = $sectionManager->add($meta))) {
                 $this->pageAlert(__('An unknown database occurred while attempting to create the section.'), Alert::ERROR);
             } else {
                 ## 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', $position);
                         $field->set('parent_section', $section_id);
                         $field->commit();
                         $field_id = $field->get('id');
                         if ($field_id) {
                             ###
                             # Delegate: FieldPostCreate
                             # Description: After creation of an Field. New Field object is provided.
                             $this->_Parent->ExtensionManager->notifyMembers('FieldPostCreate', '/blueprints/sections/', array('field' => &$field, 'data' => &$data));
                         }
                     }
                 }
                 ## TODO: Fix me
                 ###
                 # Delegate: Create
                 # Description: Creation of a new Section. Section ID and Primary Field ID are provided.
                 #$ExtensionManager->notifyMembers('Create', getCurrentPage(), array('section_id' => $section_id));
                 redirect(URL . "/symphony/blueprints/sections/edit/{$section_id}/created/");
             }
         }
     }
 }
 /**
  * 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();
         }
     }
 }
 /**
  * Render create Page Fields section admin page.  This creates the Page Fields section
  * for the specified page.
  *
  */
 public function __viewCreate()
 {
     // Retrieve title and handle of specified pages.
     //
     $pageId = $this->_context[1];
     $pageQuery = "SELECT handle, title FROM `tbl_pages` WHERE `id` = {$pageId} LIMIT 1";
     $pageRow = $this->_Parent->Database->fetchrow(0, $pageQuery);
     // Now get the Id for the next extry in the section table.  We need this to create
     // a new entry.
     //
     $nextSectionIdQuery = 'SELECT MAX(`sortorder`) + 1 AS `next` FROM tbl_sections LIMIT 1';
     $nextSectionId = $this->_Parent->Database->fetchVar('next', 0, $nextSectionIdQuery);
     // Initialise details of the new section.
     //
     $newSectionDetails['sortorder'] = $nextSectionId ? $nextSectionId : '1';
     $newSectionDetails['handle'] = Lang::createHandle(PF_SECTION_TITLE_PREFIX . $pageId);
     $newSectionDetails['navigation_group'] = 'Content';
     $newSectionDetails['name'] = PF_SECTION_TITLE_PREFIX . $pageId;
     $newSectionDetails['hidden'] = 'yes';
     // Create the section and then display the (now updated) index page.
     //
     $sectionManager = new SectionManager($this->_Parent);
     $sectionManager->add($newSectionDetails);
     // Reditect to the manage page fields page.  (We can't just call __viewIndex()
     // to render the page as we need to redraw the menu).
     //
     redirect(URL . PF_MANAGE_URL);
 }
 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/');
     }
 }