public function grab(&$param_pool)
 {
     $result = new XMLElement($this->dsParamROOTELEMENT);
     self::__init();
     $db = ASDCLoader::instance();
     $sql = "SELECT SQL_CALC_FOUND_ROWS \n\t\t\t\t\t\tpinned.entry_id AS `id`, \n\t\t\t\t\t\tpinned.value AS `pinned`, \n\t\t\t\t\t\tclosed.value AS `closed`, \n\t\t\t\t\t\tcreation_date.local AS `creation-date`,\n\t\t\t\t\t\tlast_active.local AS `last-active`,\t\t\t\t\t\t\t\n\t\t\t\t\t\tcreated_by.member_id AS `created-by-member-id`,\n\t\t\t\t\t\tcreated_by.username AS `created-by-username`,\n\t\t\t\t\t\tlast_post.member_id AS `last-post-member-id`,\n\t\t\t\t\t\tlast_post.username AS `last-post-username`,\t\t\t\t\t\t\t\n\t\t\t\t\t\ttopic.value AS `topic`,\n\t\t\t\t\t\tCOUNT(comments.relation_id) AS `comments`\n\t\t\t\t\t\n\t\t\t\t\tFROM `tbl_entries_data_%d` AS `pinned`\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `closed` ON pinned.entry_id = closed.entry_id\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `creation_date` ON pinned.entry_id = creation_date.entry_id\t\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `last_active` ON pinned.entry_id = last_active.entry_id\t\t\t\t\t\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `created_by` ON pinned.entry_id = created_by.entry_id\t\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `last_post` ON pinned.entry_id = last_post.entry_id\t\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `topic` ON pinned.entry_id = topic.entry_id\n\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `comments` ON pinned.entry_id = comments.relation_id\n\t\t\t\t\tWHERE 1 %s\n\t\t\t\t\tGROUP BY pinned.entry_id\n\t\t\t\t\tORDER BY pinned.value ASC, last_active.local DESC\n\t\t\t\t\tLIMIT %d, %d";
     try {
         $rows = $db->query(sprintf($sql, self::findFieldID('pinned', 'discussions'), self::findFieldID('closed', 'discussions'), self::findFieldID('creation-date', 'discussions'), self::findFieldID('last-active', 'discussions'), self::findFieldID('created-by', 'discussions'), self::findFieldID('last-post', 'discussions'), self::findFieldID('topic', 'discussions'), self::findFieldID('parent-id', 'comments'), isset($this->dsParamFILTERS['id']) && (int) $this->dsParamFILTERS['id'] > 0 ? " AND pinned.entry_id  = " . (int) $this->dsParamFILTERS['id'] : NULL, max(0, ($this->dsParamSTARTPAGE - 1) * $this->dsParamLIMIT), $this->dsParamLIMIT));
     } catch (Exception $e) {
         $result->appendChild(new XMLElement('error', General::sanitize(vsprintf('%d: %s on query %s', $db->lastError()))));
         return $result;
     }
     if ($rows->length() == 0 && strlen(trim($dsParamFILTERS['id'])) > 0) {
         $this->__redirectToErrorPage();
     } elseif ($rows->length() == 0) {
         return $this->emptyXMLSet();
     }
     $total = $db->query('SELECT FOUND_ROWS() AS `total`;')->current()->total;
     $result->prependChild(General::buildPaginationElement($total, ceil($total * (1 / $this->dsParamLIMIT)), $this->dsParamLIMIT, $this->dsParamSTARTPAGE));
     /*
     	stdClass Object
     	(
     	    [id] => 666
     	    [pinned] => yes
     	    [closed] => no
     	    [creation-date] => 1233599808
     	    [last-active] => 1237161637
     	    [created-by-member-id] => 2126
     	    [created-by-username] => Lewis
     	    [last-post-member-id] => 2126
     	    [last-post-username] => Lewis
     	    [topic] => Symphony 2 Documentation
     	    [comments] => 18
     	)
     
        <entry id="595" comments="7">
     		            <created-by id="2150">newnomad</created-by>
     		            <closed>No</closed>
     		            <last-active time="18:30" weekday="1">2009-02-09</last-active>
     		            <last-post id="2150">newnomad</last-post>
     		            <pinned>No</pinned>
     		            <topic handle="viewing-feeds">viewing feeds</topic>
     		            <creation-date time="19:31" weekday="3">2009-01-07</creation-date>
         </entry>
     */
     $param_pool['ds-' . $this->dsParamROOTELEMENT] = DatabaseUtilities::resultColumn($rows, 'id');
     foreach ($rows as $r) {
         $entry = new XMLElement('entry', NULL, array('id' => $r->id, 'comments' => $r->comments));
         $entry->appendChild(new XMLElement('created-by', General::sanitize($r->{'created-by-username'}), array('id' => $r->{'created-by-member-id'})));
         $entry->appendChild(new XMLElement('last-post', General::sanitize($r->{'last-post-username'}), array('id' => $r->{'last-post-member-id'})));
         $entry->appendChild(new XMLElement('closed', ucfirst($r->closed)));
         $entry->appendChild(new XMLElement('pinned', ucfirst($r->pinned)));
         $entry->appendChild(new XMLElement('topic', General::sanitize($r->topic)));
         $entry->appendChild(General::createXMLDateObject($r->{'creation-date'}, 'creation-date'));
         $entry->appendChild(General::createXMLDateObject($r->{'last-active'}, 'last-active'));
         $result->appendChild($entry);
     }
     return $result;
 }
 public function grab(&$param_pool)
 {
     self::__init();
     /*
     		
     		var $dsParamINCLUDEDELEMENTS = array(
     				'system:pagination',
     				'comment',
     				'date',
     				'created-by'
     		);
     		
         <pagination total-entries="28" total-pages="2" entries-per-page="20" current-page="2" />
         <section id="39" handle="comments">Comments</section>
     */
     $result = new XMLElement($this->dsParamROOTELEMENT);
     try {
         $comments = ASDCLoader::instance()->query(sprintf("SELECT SQL_CALC_FOUND_ROWS\n\t\t\t\t\t\t\tcomment.entry_id AS `id`,\n\t\t\t\t\t\t\tcomment.value_formatted AS `comment`, \n\t\t\t\t\t\t\tcreated_by.member_id, \n\t\t\t\t\t\t\tcreated_by.username, \n\t\t\t\t\t\t\tdate.local AS `date`,\n\t\t\t\t\t\t\temail.value AS `email`\n\n\t\t\t\t\t\tFROM `tbl_entries_data_%d` AS `comment`\n\t\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `created_by` ON comment.entry_id = created_by.entry_id\n\t\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `date` ON comment.entry_id = date.entry_id\n\t\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `email` ON created_by.member_id = email.entry_id\n\t\t\t\t\t\tLEFT JOIN `tbl_entries_data_%d` AS `discussion` ON comment.entry_id = discussion.entry_id\n\t\t\t\t\t\tWHERE discussion.relation_id = %d\n\t\t\t\t\t\tORDER BY date.local ASC\n\t\t\t\t\t\tLIMIT %d, %d", self::findFieldID('comment', 'comments'), self::findFieldID('created-by', 'comments'), self::findFieldID('date', 'comments'), self::findFieldID('email-address', 'members'), self::findFieldID('parent-id', 'comments'), (int) $this->dsParamFILTERS['discussion_id'], max(0, ($this->dsParamSTARTPAGE - 1) * $this->dsParamLIMIT), (int) $this->dsParamLIMIT));
     } catch (Exception $e) {
         $result->appendChild(new XMLElement('error', General::sanitize(vsprintf('%d: %s on query %s', ASDCLoader::instance()->lastError()))));
         return $result;
     }
     if ($comments->length() == 0) {
         $this->__redirectToErrorPage();
     }
     $total = ASDCLoader::instance()->query('SELECT FOUND_ROWS() AS `total`;')->current()->total;
     $result->prependChild(General::buildPaginationElement($total, ceil($total * (1 / $this->dsParamLIMIT)), $this->dsParamLIMIT, $this->dsParamSTARTPAGE));
     foreach ($comments as $c) {
         /*
         	stdClass Object
         	(
         	    [id] => 20589
         	    [comment] => <p>blah blah</p>
         
         	    [member_id] => 2103
         	    [username] => Alistair
         	    [date] => 1241576727
         	    [email] => alistair@21degrees.com.au
         	)
         	
         	<entry id="20515">
                 <date time="01:32" weekday="3">2009-05-06</date>
                 <comment word-count="6"><p>This site looks awesome guys! Congrats!</p></comment>
                 <created-by id="2694">davethegr8</created-by>
             </entry>
         */
         $entry = new XMLElement('entry', NULL, array('id' => $c->id));
         $entry->appendChild(new XMLElement('created-by', General::sanitize($c->username), array('email-address-hash' => md5($c->email), 'email-address' => General::sanitize($c->email), 'id' => $c->member_id)));
         $entry->appendChild(General::createXMLDateObject($c->date, 'date'));
         $c->comment = str_replace(array('<script', '</script'), array('&lt;script', '&lt;/script'), $c->comment);
         $entry->appendChild(new XMLElement('comment', trim($c->comment)));
         $result->appendChild($entry);
     }
     return $result;
 }
 /**
  * If `$this->Alert` is set, it will be prepended to the Form of this page.
  * A delegate is fired here to allow extensions to provide their
  * their own Alert messages to the page. Note that only one Alert
  * is allowed per page at any one time.
  *
  * @uses AppendPageAlert
  */
 public function appendAlert()
 {
     /**
      * Allows for appending of alerts. Administration::instance()->Page->Alert is way to tell what
      * is currently in the system
      *
      * @delegate AppendPageAlert
      * @param string $context
      *  '/backend/'
      */
     Symphony::ExtensionManager()->notifyMembers('AppendPageAlert', '/backend/');
     if ($this->Alert instanceof Alert) {
         $this->Header->prependChild($this->Alert->asXML());
     }
 }
 /**
  * Add parent pages including current to XML output.
  *
  * @param array      $pages   - contains all pages data
  * @param int        $page_id - current page id
  * @param array      $langs   - all supported language codes
  * @param XMLElement $result  - resulting XML
  *
  * @return XMLElement - a pages XML ouput
  */
 private function appendPage(array $pages, $page_id, array $langs, XMLElement $result)
 {
     $page = $pages[$page_id];
     if ($page['parent'] !== null) {
         $result = $this->appendPage($pages, $page['parent'], $langs, $result);
     }
     $page_xml = new XMLElement('page');
     $page_xml->setAttribute('handle', $page['handle']);
     $page_xml->setAttribute('id', $page_id);
     foreach ($langs as $lc) {
         $item_xml = new XMLElement('item');
         $item_xml->setValue(General::sanitize($page["plh_t-{$lc}"]));
         $item_xml->setAttribute('lang', $lc);
         $item_xml->setAttribute('handle', $page["plh_h-{$lc}"]);
         $page_xml->prependChild($item_xml);
     }
     $result->appendChild($page_xml);
     return $page_xml;
 }
 public function grab(&$param_pool)
 {
     $result = new XMLElement($this->dsParamROOTELEMENT);
     $current_page_id = (int) $this->_env['param']['current-page-id'];
     $db = ASDCLoader::instance();
     try {
         $results = $db->query("SELECT * FROM `tbl_pages` WHERE `id` = '{$current_page_id}' LIMIT 1");
     } catch (Exception $e) {
         $result->appendChild(new XMLElement('error', General::sanitize(vsprintf('%d: %s on query "%s"', $db->lastError()))));
         return $result;
     }
     while ($results->length() > 0) {
         $current = $results->current();
         $result->prependChild(new XMLElement('page', $current->title, array('path' => trim("{$current->path}/{$current->handle}", '/'))));
         if (is_null($current->parent)) {
             break;
         }
         $results = $db->query(sprintf("SELECT * FROM `tbl_pages` WHERE `id` = '%d' LIMIT 1", (int) $current->parent));
     }
     return $result;
 }
 /**
  * Appends data into the XML tree of a Data Source
  * @param $wrapper
  * @param $data
  */
 public function appendFormattedElement(&$wrapper, $data, $encode = false, $mode = null, $entry_id = null)
 {
     if (!is_array($data) || empty($data)) {
         return;
     }
     // root for all values
     $root = new XMLElement($this->get('element_name'));
     // selected items
     $entries = static::getEntries($data);
     // current linked entries
     $root->setAttribute('entries', $data['entries']);
     // available sections
     $root->setAttribute('sections', $this->get('sections'));
     // included elements
     $elements = $this->parseElements();
     // cache
     $sectionsCache = new CacheableFetch('SectionManager');
     // DS mode
     if (!$mode) {
         $mode = '*';
     }
     $parentDeepness = General::intval($this->recursiveDeepness);
     $deepness = General::intval($this->get('deepness'));
     // both deepnesses are defined and parent restricts more
     if ($parentDeepness > 0 && $deepness > 0 && $parentDeepness < $deepness) {
         $deepness = $parentDeepness;
     } else {
         if ($parentDeepness > 0 && $deepness < 1) {
             $deepness = $parentDeepness;
         }
     }
     // cache recursive level because recursion might
     // change its value later on.
     $recursiveLevel = $this->recursiveLevel;
     // build entries
     foreach ($entries as $eId) {
         $item = new XMLElement('item');
         // output id
         $item->setAttribute('id', $eId);
         // output recursive level
         $item->setAttribute('level', $recursiveLevel);
         $item->setAttribute('max-level', $deepness);
         // max recursion check
         if ($deepness < 1 || $recursiveLevel < $deepness) {
             // current entry, without data
             $entry = $this->fetchEntry($eId);
             // entry not found...
             if (!$entry || empty($entry)) {
                 $error = new XMLElement('error');
                 $error->setAttribute('id', $eId);
                 $error->setValue(__('Error: entry `%s` not found', array($eId)));
                 $root->prependChild($error);
                 continue;
             }
             // fetch section infos
             $sectionId = $entry->get('section_id');
             $item->setAttribute('section-id', $sectionId);
             $section = $sectionsCache->fetch($sectionId);
             $sectionName = $section->get('handle');
             $item->setAttribute('section', $sectionName);
             // adjust the mode for the current section
             $curMode = $mode;
             if ($curMode) {
                 // remove section name from current mode, i.e sectionName.field
                 if (preg_match('/^(' . $sectionName . '\\.)(.*)$/sU', $curMode)) {
                     $curMode = preg_replace('/^' . $sectionName . '\\./sU', '', $curMode);
                 } else {
                     if (preg_match('/^(' . $sectionName . ')$/sU', $curMode)) {
                         $curMode = null;
                     } else {
                         if (preg_match('/\\./sU', $curMode)) {
                             $item->setAttribute('forbidden', 'yes');
                             $root->appendChild($item);
                             continue;
                         }
                     }
                 }
             }
             $item->setAttribute('section', $section->get('handle'));
             // Get the valid elements for this section only
             $sectionElements = $elements[$sectionName];
             // get all if no mode is set or section element is empty
             // or mode is * and * is allowed
             if (!$curMode || empty($sectionElements) || $curMode === '*' && in_array('*', $sectionElements)) {
                 // setting null = get all
                 $sectionElements = null;
             } else {
                 if (in_array('*', $sectionElements) && !!$curMode) {
                     // get only the mode
                     $sectionElements = array($curMode);
                 } else {
                     if ($curMode !== '*') {
                         foreach ($sectionElements as $secElemIndex => $sectionElement) {
                             if ($curMode != $sectionElement) {
                                 unset($sectionElements[$secElemIndex]);
                             }
                         }
                     }
                 }
             }
             // current entry again, but with data and the allowed schema
             $entry = $this->fetchEntry($eId, $sectionElements);
             // cache fields info
             if (!isset($section->er_field_cache)) {
                 $section->er_field_cache = $section->fetchFields();
             }
             // cache the entry data
             $entryData = $entry->getData();
             // for each field returned for this entry...
             foreach ($entryData as $fieldId => $data) {
                 $filteredData = array_filter($data, function ($value) {
                     return $value != null;
                 });
                 if (empty($filteredData)) {
                     continue;
                 }
                 $field = $section->er_field_cache[$fieldId];
                 $fieldName = $field->get('element_name');
                 // Increment recursive level
                 if ($field instanceof FieldEntry_relationship) {
                     $field->recursiveLevel = $recursiveLevel + 1;
                     $field->recursiveDeepness = $deepness;
                 }
                 // filter out elements per what's allowed
                 if (self::isFieldIncluded($fieldName, $sectionElements)) {
                     $parentIncludableElement = self::getSectionElementName($fieldName, $sectionElements);
                     $fieldIncludableElements = null;
                     // if the includable element is not just the field name
                     if ($parentIncludableElement != $fieldName) {
                         // use the includable element's mode
                         $curMode = preg_replace('/^' . $fieldName . '\\s*\\:\\s*/i', '', $parentIncludableElement, 1);
                     } else {
                         // revert to the field's includable elements
                         $fieldIncludableElements = $field->fetchIncludableElements();
                     }
                     // do not use includable elements
                     if ($field instanceof FieldEntry_relationship) {
                         $fieldIncludableElements = null;
                     }
                     // include children
                     if (!empty($fieldIncludableElements) && count($fieldIncludableElements) > 1) {
                         // append each includable element
                         foreach ($fieldIncludableElements as $fieldIncludableElement) {
                             // remove field name from mode
                             $submode = preg_replace('/^' . $fieldName . '\\s*\\:\\s*/i', '', $fieldIncludableElement, 1);
                             $field->appendFormattedElement($item, $data, $encode, $submode, $eId);
                         }
                     } else {
                         $field->appendFormattedElement($item, $data, $encode, $curMode, $eId);
                     }
                 } else {
                     $item->appendChild(new XMLElement('error', __('Field "%s" not allowed', array($fieldName))));
                 }
             }
             // output current mode
             $item->setAttribute('matched-element', $curMode);
         }
         // append item when done
         $root->appendChild($item);
     }
     // output mode for this field
     $root->setAttribute('data-source-mode', $mode);
     // add all our data to the wrapper;
     $wrapper->appendChild($root);
     // clean up
     $this->recursiveLevel = 1;
     $this->recursiveDeepness = null;
 }
 public function getXPath($entry, $XSLTfilename = NULL, $fetch_associated_counts = NULL)
 {
     $entry_xml = new XMLElement('entry');
     $data = $entry->getData();
     $fields = array();
     $entry_xml->setAttribute('id', $entry->get('id'));
     //Add date created and edited values
     $date = new XMLElement('system-date');
     $date->appendChild(General::createXMLDateObject(DateTimeObj::get('U', $entry->get('creation_date')), 'created'));
     $date->appendChild(General::createXMLDateObject(DateTimeObj::get('U', $entry->get('modification_date')), 'modified'));
     $entry_xml->appendChild($date);
     //Reflect Workspace and Siteroot params
     $workspace = new XMLElement('workspace', URL . '/workspace');
     $root = new XMLElement('root', URL);
     // Add associated entry counts
     if ($fetch_associated_counts == 'yes') {
         $associated = $entry->fetchAllAssociatedEntryCounts();
         if (is_array($associated) and !empty($associated)) {
             foreach ($associated as $section_id => $count) {
                 $section = SectionManager::fetch($section_id);
                 if ($section instanceof Section === false) {
                     continue;
                 }
                 $entry_xml->setAttribute($section->get('handle'), (string) $count);
             }
         }
     }
     // Add fields:
     foreach ($data as $field_id => $values) {
         if (empty($field_id)) {
             continue;
         }
         $field = FieldManager::fetch($field_id);
         $field->appendFormattedElement($entry_xml, $values, false, null, $entry->get('id'));
     }
     $xml = new XMLElement('data');
     $xml->appendChild($entry_xml);
     $xml->appendChild($workspace);
     $xml->appendChild($root);
     // Build some context
     $section = SectionManager::fetch($entry->get('section_id'));
     $params = new XMLElement('params');
     $params->appendChild(new XMLElement('section-handle', $section->get('handle')));
     $params->appendChild(new XMLElement('entry-id', $entry->get('id')));
     $xml->prependChild($params);
     $dom = new DOMDocument();
     $dom->strictErrorChecking = false;
     $dom->loadXML($xml->generate(true));
     if (!empty($XSLTfilename)) {
         $XSLTfilename = UTILITIES . '/' . preg_replace(array('%/+%', '%(^|/)../%'), '/', $XSLTfilename);
         if (file_exists($XSLTfilename)) {
             $XSLProc = new XsltProcessor();
             $xslt = new DomDocument();
             $xslt->load($XSLTfilename);
             $XSLProc->importStyleSheet($xslt);
             // Set some context
             $XSLProc->setParameter('', array('section-handle' => $section->get('handle'), 'entry-id' => $entry->get('id')));
             $temp = $XSLProc->transformToDoc($dom);
             if ($temp instanceof DOMDocument) {
                 $dom = $temp;
             }
         }
     }
     $xpath = new DOMXPath($dom);
     if (version_compare(phpversion(), '5.3', '>=')) {
         $xpath->registerPhpFunctions();
     }
     return $xpath;
 }
        $xsl = @new SimpleXMLElement($xsl);
        $xsl->registerXPathNamespace("ext", "http://getsymphony.com/schemas/extension/1.0");
        $result = $xsl->xpath("//ext:extension[@id = '" . $e->getAdditional()->name . "']");
        if (!empty($result)) {
            $match = $extension->getFilename();
            break;
        }
    }
}
// If we've found a similar folder
if ($match != "" && $e->getAdditional()->rename_failed !== true) {
    $div->appendChild(new XMLElement('p', __('Often the cause of this error is a misnamed extension folder. You can try renaming %s to %s, or you can uninstall the extension to continue.', array('<code>extensions/' . $match . '</code>', '<code>extensions/' . $e->getAdditional()->name . '</code>'))));
    $form->appendChild(Widget::Input('existing-folder', $match, 'hidden'));
    $form->appendChild(Widget::Input('new-folder', $e->getAdditional()->name, 'hidden'));
    $button = new XMLElement('button', __('Rename folder'));
    $button->setAttributeArray(array('name' => 'action[rename]', 'class' => 'button', 'type' => 'submit', 'accesskey' => 's'));
    $actions->appendChild($button);
} elseif ($e->getAdditional()->rename_failed) {
    $div->appendChild(new XMLElement('p', __('Sorry, but Symphony was unable to rename the folder. You can try renaming %s to %s yourself, or you can uninstall the extension to continue.', array('<code>extensions/' . $match . '</code>', '<code>extensions/' . $e->getAdditional()->name . '</code>'))));
} else {
    $div->appendChild(new XMLElement('p', __('You can try uninstalling the extension to continue, or you might want to ask on the forums')));
}
// Add XSRF token to form's in the backend
if (Symphony::Engine()->isXSRFEnabled()) {
    $form->prependChild(XSRF::formToken());
}
$div->appendChild($form);
$Page->Body->appendChild($div);
$output = $Page->generate();
echo $output;
exit;
 /**
  * Prepare a Drawer to visualize section associations
  *
  * @param  Section $section The current Section object
  * @throws InvalidArgumentException
  * @throws Exception
  */
 private function prepareAssociationsDrawer($section)
 {
     $entry_id = !is_null($this->_context['entry_id']) ? $this->_context['entry_id'] : null;
     $show_entries = Symphony::Configuration()->get('association_maximum_rows', 'symphony');
     if (is_null($entry_id) && !isset($_GET['prepopulate']) || is_null($show_entries) || $show_entries == 0) {
         return;
     }
     $parent_associations = SectionManager::fetchParentAssociations($section->get('id'), true);
     $child_associations = SectionManager::fetchChildAssociations($section->get('id'), true);
     $content = null;
     $drawer_position = 'vertical-right';
     /**
      * Prepare Associations Drawer from an Extension
      *
      * @since Symphony 2.3.3
      * @delegate PrepareAssociationsDrawer
      * @param string $context
      * '/publish/'
      * @param integer $entry_id
      *  The entry ID or null
      * @param array $parent_associations
      *  Array of Sections
      * @param array $child_associations
      *  Array of Sections
      * @param string $drawer_position
      *  The position of the Drawer, defaults to `vertical-right`. Available
      *  values of `vertical-left, `vertical-right` and `horizontal`
      */
     Symphony::ExtensionManager()->notifyMembers('PrepareAssociationsDrawer', '/publish/', array('entry_id' => $entry_id, 'parent_associations' => &$parent_associations, 'child_associations' => &$child_associations, 'content' => &$content, 'drawer-position' => &$drawer_position));
     // If there are no associations, return now.
     if ((is_null($parent_associations) || empty($parent_associations)) && (is_null($child_associations) || empty($child_associations))) {
         return;
     }
     if (!$content instanceof XMLElement) {
         $content = new XMLElement('div', null, array('class' => 'content'));
         $content->setSelfClosingTag(false);
         // Process Parent Associations
         if (!is_null($parent_associations) && !empty($parent_associations)) {
             foreach ($parent_associations as $as) {
                 if ($field = FieldManager::fetch($as['parent_section_field_id'])) {
                     if (isset($_GET['prepopulate'])) {
                         $prepopulate_field = key($_GET['prepopulate']);
                     }
                     // get associated entries if entry exists,
                     if ($entry_id) {
                         $entry_ids = $field->findParentRelatedEntries($as['child_section_field_id'], $entry_id);
                         // get prepopulated entry otherwise
                     } elseif (isset($_GET['prepopulate'])) {
                         $entry_ids = array(intval(current($_GET['prepopulate'])));
                     } else {
                         $entry_ids = array();
                     }
                     // Use $schema for perf reasons
                     $schema = array($field->get('element_name'));
                     $where = !empty($entry_ids) ? sprintf(' AND `e`.`id` IN (%s)', implode(', ', $entry_ids)) : null;
                     $entries = !empty($entry_ids) || isset($_GET['prepopulate']) && $field->get('id') === $prepopulate_field ? EntryManager::fetchByPage(1, $as['parent_section_id'], $show_entries, $where, null, false, false, true, $schema) : array();
                     $has_entries = !empty($entries) && $entries['total-entries'] != 0;
                     if ($has_entries) {
                         $element = new XMLElement('section', null, array('class' => 'association parent'));
                         $header = new XMLElement('header');
                         $header->appendChild(new XMLElement('p', __('Linked to %s in', array('<a class="association-section" href="' . SYMPHONY_URL . '/publish/' . $as['handle'] . '/">' . $as['name'] . '</a>'))));
                         $element->appendChild($header);
                         $ul = new XMLElement('ul', null, array('class' => 'association-links', 'data-section-id' => $as['child_section_id'], 'data-association-ids' => implode(', ', $entry_ids)));
                         foreach ($entries['records'] as $e) {
                             // let the field create the mark up
                             $li = $field->prepareAssociationsDrawerXMLElement($e, $as);
                             // add it to the unordered list
                             $ul->appendChild($li);
                         }
                         $element->appendChild($ul);
                         $content->appendChild($element);
                     }
                 }
             }
         }
         // Process Child Associations
         if (!is_null($child_associations) && !empty($child_associations)) {
             foreach ($child_associations as $as) {
                 // Get the related section
                 $child_section = SectionManager::fetch($as['child_section_id']);
                 if (!$child_section instanceof Section) {
                     continue;
                 }
                 // Get the visible field instance (using the sorting field, this is more flexible than visibleColumns())
                 // Get the link field instance
                 $visible_field = current($child_section->fetchVisibleColumns());
                 $relation_field = FieldManager::fetch($as['child_section_field_id']);
                 // Get entries, using $schema for performance reasons.
                 $entry_ids = $relation_field->findRelatedEntries($entry_id, $as['parent_section_field_id']);
                 $schema = $visible_field ? array($visible_field->get('element_name')) : array();
                 $where = sprintf(' AND `e`.`id` IN (%s)', implode(', ', $entry_ids));
                 $entries = !empty($entry_ids) ? EntryManager::fetchByPage(1, $as['child_section_id'], $show_entries, $where, null, false, false, true, $schema) : array();
                 $has_entries = !empty($entries) && $entries['total-entries'] != 0;
                 // Build the HTML of the relationship
                 $element = new XMLElement('section', null, array('class' => 'association child'));
                 $header = new XMLElement('header');
                 $filter = '?filter[' . $relation_field->get('element_name') . ']=' . $entry_id;
                 $prepopulate = '?prepopulate[' . $as['child_section_field_id'] . ']=' . $entry_id;
                 // Create link with filter or prepopulate
                 $link = SYMPHONY_URL . '/publish/' . $as['handle'] . '/' . $filter;
                 $a = new XMLElement('a', $as['name'], array('class' => 'association-section', 'href' => $link));
                 // Create new entries
                 $create = new XMLElement('a', __('Create New'), array('class' => 'button association-new', 'href' => SYMPHONY_URL . '/publish/' . $as['handle'] . '/new/' . $prepopulate));
                 // Display existing entries
                 if ($has_entries) {
                     $header->appendChild(new XMLElement('p', __('Links in %s', array($a->generate()))));
                     $ul = new XMLElement('ul', null, array('class' => 'association-links', 'data-section-id' => $as['child_section_id'], 'data-association-ids' => implode(', ', $entry_ids)));
                     foreach ($entries['records'] as $key => $e) {
                         // let the first visible field create the mark up
                         if ($visible_field) {
                             $li = $visible_field->prepareAssociationsDrawerXMLElement($e, $as, $prepopulate);
                         } else {
                             $li = Field::createAssociationsDrawerXMLElement($e->get('id'), $e, $as, $prepopulate);
                         }
                         // add it to the unordered list
                         $ul->appendChild($li);
                     }
                     $element->appendChild($ul);
                     // If we are only showing 'some' of the entries, then show this on the UI
                     if ($entries['total-entries'] > $show_entries) {
                         $pagination = new XMLElement('li', null, array('class' => 'association-more', 'data-current-page' => '1', 'data-total-pages' => ceil($entries['total-entries'] / $show_entries), 'data-total-entries' => $entries['total-entries']));
                         $counts = new XMLElement('a', __('Show more entries'), array('href' => $link));
                         $pagination->appendChild($counts);
                         $ul->appendChild($pagination);
                     }
                     // No entries
                 } else {
                     $element->setAttribute('class', 'association child empty');
                     $header->appendChild(new XMLElement('p', __('No links in %s', array($a->generate()))));
                 }
                 $header->appendChild($create);
                 $element->prependChild($header);
                 $content->appendChild($element);
             }
         }
     }
     $drawer = Widget::Drawer('section-associations', __('Show Associations'), $content);
     $this->insertDrawer($drawer, $drawer_position, 'prepend');
 }
 public function execute(array &$param_pool = null)
 {
     $result = new XMLElement($this->dsParamROOTELEMENT);
     $this->_param_pool = $param_pool;
     $where = null;
     $joins = null;
     $group = false;
     if (!($section = SectionManager::fetch((int) $this->getSource()))) {
         $about = $this->about();
         trigger_error(__('The Section, %s, associated with the Data source, %s, could not be found.', array($this->getSource(), '<code>' . $about['name'] . '</code>')), E_USER_ERROR);
     }
     $sectioninfo = new XMLElement('section', General::sanitize($section->get('name')), array('id' => $section->get('id'), 'handle' => $section->get('handle')));
     if ($this->_force_empty_result == true) {
         if ($this->dsParamREDIRECTONREQUIRED == 'yes') {
             throw new FrontendPageNotFoundException();
         }
         $this->_force_empty_result = false;
         //this is so the section info element doesn't disappear.
         $error = new XMLElement('error', __("Data source not executed, required parameter is missing."), array('required-param' => $this->dsParamREQUIREDPARAM));
         $result->appendChild($error);
         $result->prependChild($sectioninfo);
         return $result;
     }
     if ($this->_negate_result == true) {
         if ($this->dsParamREDIRECTONFORBIDDEN == 'yes') {
             throw new FrontendPageNotFoundException();
         }
         $this->_negate_result = false;
         //this is so the section info element doesn't disappear.
         $result = $this->negateXMLSet();
         $result->prependChild($sectioninfo);
         return $result;
     }
     if (is_array($this->dsParamINCLUDEDELEMENTS)) {
         $include_pagination_element = in_array('system:pagination', $this->dsParamINCLUDEDELEMENTS);
     } else {
         $this->dsParamINCLUDEDELEMENTS = array();
     }
     if (isset($this->dsParamPARAMOUTPUT) && !is_array($this->dsParamPARAMOUTPUT)) {
         $this->dsParamPARAMOUTPUT = array($this->dsParamPARAMOUTPUT);
     }
     $this->_can_process_system_parameters = $this->canProcessSystemParameters();
     if (!isset($this->dsParamPAGINATERESULTS)) {
         $this->dsParamPAGINATERESULTS = 'yes';
     }
     // Process Filters
     $this->processFilters($where, $joins, $group);
     // Process Sorting
     if ($this->dsParamSORT == 'system:id') {
         EntryManager::setFetchSorting('system:id', $this->dsParamORDER);
     } elseif ($this->dsParamSORT == 'system:date' || $this->dsParamSORT == 'system:creation-date') {
         EntryManager::setFetchSorting('system:creation-date', $this->dsParamORDER);
     } elseif ($this->dsParamSORT == 'system:modification-date') {
         EntryManager::setFetchSorting('system:modification-date', $this->dsParamORDER);
     } else {
         EntryManager::setFetchSorting(FieldManager::fetchFieldIDFromElementName($this->dsParamSORT, $this->getSource()), $this->dsParamORDER);
     }
     // combine `INCLUDEDELEMENTS`, `PARAMOUTPUT` and `GROUP` into an
     // array of field handles to optimise the `EntryManager` queries
     $datasource_schema = $this->dsParamINCLUDEDELEMENTS;
     if (is_array($this->dsParamPARAMOUTPUT)) {
         $datasource_schema = array_merge($datasource_schema, $this->dsParamPARAMOUTPUT);
     }
     if ($this->dsParamGROUP) {
         $datasource_schema[] = FieldManager::fetchHandleFromID($this->dsParamGROUP);
     }
     $entries = EntryManager::fetchByPage($this->dsParamPAGINATERESULTS == 'yes' && $this->dsParamSTARTPAGE > 0 ? $this->dsParamSTARTPAGE : 1, $this->getSource(), $this->dsParamPAGINATERESULTS == 'yes' && $this->dsParamLIMIT >= 0 ? $this->dsParamLIMIT : null, $where, $joins, $group, !$include_pagination_element ? true : false, true, array_unique($datasource_schema));
     /**
      * Immediately after building entries allow modification of the Data Source entries array
      *
      * @delegate DataSourceEntriesBuilt
      * @param string $context
      * '/frontend/'
      * @param Datasource $datasource
      * @param array $entries
      * @param array $filters
      */
     Symphony::ExtensionManager()->notifyMembers('DataSourceEntriesBuilt', '/frontend/', array('datasource' => &$this, 'entries' => &$entries, 'filters' => $this->dsParamFILTERS));
     if (($entries['total-entries'] <= 0 || $include_pagination_element === true) && (!is_array($entries['records']) || empty($entries['records'])) || $this->dsParamSTARTPAGE == '0') {
         if ($this->dsParamREDIRECTONEMPTY == 'yes') {
             throw new FrontendPageNotFoundException();
         }
         $this->_force_empty_result = false;
         $result = $this->emptyXMLSet();
         $result->prependChild($sectioninfo);
         if ($include_pagination_element) {
             $pagination_element = General::buildPaginationElement();
             if ($pagination_element instanceof XMLElement && $result instanceof XMLElement) {
                 $result->prependChild($pagination_element);
             }
         }
     } else {
         if (!$this->_param_output_only) {
             $result->appendChild($sectioninfo);
             if ($include_pagination_element) {
                 $t = $this->dsParamPAGINATERESULTS == 'yes' && isset($this->dsParamLIMIT) && $this->dsParamLIMIT >= 0 ? $this->dsParamLIMIT : $entries['total-entries'];
                 $pagination_element = General::buildPaginationElement($entries['total-entries'], $entries['total-pages'], $t, $this->dsParamPAGINATERESULTS == 'yes' && $this->dsParamSTARTPAGE > 0 ? $this->dsParamSTARTPAGE : 1);
                 if ($pagination_element instanceof XMLElement && $result instanceof XMLElement) {
                     $result->prependChild($pagination_element);
                 }
             }
         }
         // If this datasource has a Limit greater than 0 or the Limit is not set
         if (!isset($this->dsParamLIMIT) || $this->dsParamLIMIT > 0) {
             if (!isset($this->dsParamASSOCIATEDENTRYCOUNTS) || $this->dsParamASSOCIATEDENTRYCOUNTS == 'yes') {
                 $this->_associated_sections = $section->fetchAssociatedSections();
             }
             // If the datasource require's GROUPING
             if (isset($this->dsParamGROUP)) {
                 self::$_fieldPool[$this->dsParamGROUP] = FieldManager::fetch($this->dsParamGROUP);
                 if (self::$_fieldPool[$this->dsParamGROUP] == null) {
                     throw new SymphonyErrorPage(vsprintf("The field used for grouping '%s' cannot be found.", $this->dsParamGROUP));
                 }
                 $groups = self::$_fieldPool[$this->dsParamGROUP]->groupRecords($entries['records']);
                 foreach ($groups as $element => $group) {
                     foreach ($group as $g) {
                         $result->appendChild($this->processRecordGroup($element, $g));
                     }
                 }
             } else {
                 if (isset($entries['records'][0])) {
                     $data = $entries['records'][0]->getData();
                     $pool = FieldManager::fetch(array_keys($data));
                     self::$_fieldPool += $pool;
                 }
                 foreach ($entries['records'] as $entry) {
                     $xEntry = $this->processEntry($entry);
                     if ($xEntry instanceof XMLElement) {
                         $result->appendChild($xEntry);
                     }
                 }
             }
         }
     }
     $param_pool = $this->_param_pool;
     return $result;
 }
    public function grab(&$param_pool)
    {
        $Members = Frontend::instance()->ExtensionManager->create('members');
        $Members->initialiseCookie();
        if ($Members->isLoggedIn() !== true) {
            // Oi! you can't be here
            redirect(URL . '/forbidden/');
            exit;
        }
        $result = new XMLElement($this->dsParamROOTELEMENT);
        self::__init();
        $db = ASDCLoader::instance();
        $sql = 'SELECT SQL_CALC_FOUND_ROWS 
						pinned.entry_id AS `id`, 
						pinned.value AS `pinned`, 
						closed.value AS `closed`, 
						creation_date.local AS `creation-date`,
						last_active.local AS `last-active`,							
						created_by.member_id AS `created-by-member-id`,
						created_by.username AS `created-by-username`,
						last_post.member_id AS `last-post-member-id`,
						last_post.username AS `last-post-username`,							
						topic.value AS `topic`
					
					FROM `tbl_entries_data_%d` AS `pinned`
					LEFT JOIN `tbl_entries_data_%d` AS `closed` ON pinned.entry_id = closed.entry_id
					LEFT JOIN `tbl_entries_data_%d` AS `creation_date` ON pinned.entry_id = creation_date.entry_id	
					LEFT JOIN `tbl_entries_data_%d` AS `last_active` ON pinned.entry_id = last_active.entry_id					
					LEFT JOIN `tbl_entries_data_%d` AS `created_by` ON pinned.entry_id = created_by.entry_id	
					LEFT JOIN `tbl_entries_data_%d` AS `last_post` ON pinned.entry_id = last_post.entry_id	
					LEFT JOIN `tbl_entries_data_%d` AS `topic` ON pinned.entry_id = topic.entry_id
					LEFT JOIN `tbl_entries_data_%d` AS `comments` ON pinned.entry_id = comments.relation_id
					LEFT JOIN `tbl_entries_data_%d` AS `discussion_comments_member` ON comments.entry_id = discussion_comments_member.entry_id	
					WHERE 1 %s
					AND (created_by.member_id = %11$d || discussion_comments_member.member_id = %11$d)
					GROUP BY pinned.entry_id
					ORDER BY pinned.value ASC, last_active.local DESC
					LIMIT %12$d, %13$d';
        try {
            $rows = $db->query(sprintf($sql, self::findFieldID('pinned', 'discussions'), self::findFieldID('closed', 'discussions'), self::findFieldID('creation-date', 'discussions'), self::findFieldID('last-active', 'discussions'), self::findFieldID('created-by', 'discussions'), self::findFieldID('last-post', 'discussions'), self::findFieldID('topic', 'discussions'), self::findFieldID('parent-id', 'comments'), self::findFieldID('created-by', 'comments'), isset($this->dsParamFILTERS['id']) && (int) $this->dsParamFILTERS['id'] > 0 ? " AND pinned.entry_id  = " . (int) $this->dsParamFILTERS['id'] : NULL, (int) $Members->Member->get('id'), max(0, ($this->dsParamSTARTPAGE - 1) * $this->dsParamLIMIT), $this->dsParamLIMIT));
        } catch (Exception $e) {
            $result->appendChild(new XMLElement('error', General::sanitize(vsprintf('%d: %s on query %s', $db->lastError()))));
            return $result;
        }
        if ($rows->length() == 0) {
            return $this->emptyXMLSet();
        }
        $total = $db->query('SELECT FOUND_ROWS() AS `total`;')->current()->total;
        $result->prependChild(General::buildPaginationElement($total, ceil($total * (1 / $this->dsParamLIMIT)), $this->dsParamLIMIT, $this->dsParamSTARTPAGE));
        /*
        	stdClass Object
        	(
        	    [id] => 666
        	    [pinned] => yes
        	    [closed] => no
        	    [creation-date] => 1233599808
        	    [last-active] => 1237161637
        	    [created-by-member-id] => 2126
        	    [created-by-username] => Lewis
        	    [last-post-member-id] => 2126
        	    [last-post-username] => Lewis
        	    [topic] => Symphony 2 Documentation
        	    [comments] => 18
        	)
        
           <entry id="595" comments="7">
        		            <created-by id="2150">newnomad</created-by>
        		            <closed>No</closed>
        		            <last-active time="18:30" weekday="1">2009-02-09</last-active>
        		            <last-post id="2150">newnomad</last-post>
        		            <pinned>No</pinned>
        		            <topic handle="viewing-feeds">viewing feeds</topic>
        		            <creation-date time="19:31" weekday="3">2009-01-07</creation-date>
            </entry>
        */
        $param_pool['ds-' . $this->dsParamROOTELEMENT] = DatabaseUtilities::resultColumn($rows, 'id');
        foreach ($rows as $r) {
            // Need to do a seperate query to find the comment counts.
            try {
                $comments = $db->query(sprintf("SELECT COUNT(*) AS `count` FROM `tbl_entries_data_%d` WHERE `relation_id` = %d ", self::findFieldID('parent-id', 'comments'), $r->id))->current()->count;
            } catch (Exception $e) {
                $result->appendChild(new XMLElement('error', General::sanitize(vsprintf('%d: %s on query %s', $db->lastError()))));
                return $result;
            }
            $entry = new XMLElement('entry', NULL, array('id' => $r->id, 'comments' => $comments));
            $entry->appendChild(new XMLElement('created-by', General::sanitize($r->{'created-by-username'}), array('id' => $r->{'created-by-member-id'})));
            $entry->appendChild(new XMLElement('last-post', General::sanitize($r->{'last-post-username'}), array('id' => $r->{'last-post-member-id'})));
            $entry->appendChild(new XMLElement('closed', ucfirst($r->closed)));
            $entry->appendChild(new XMLElement('pinned', ucfirst($r->pinned)));
            $entry->appendChild(new XMLElement('topic', General::sanitize($r->topic)));
            $entry->appendChild(General::createXMLDateObject($r->{'creation-date'}, 'creation-date'));
            $entry->appendChild(General::createXMLDateObject($r->{'last-active'}, 'last-active'));
            $result->appendChild($entry);
        }
        return $result;
    }
 private function createCheckbox($text, $key)
 {
     $order = $this->get('sortorder');
     $lbl = new XMLElement('label', __($text), array('class' => 'column'));
     $input = new XMLElement('input', NULL, array('type' => 'checkbox', 'name' => "fields[{$order}][{$key}]"));
     $input->setSelfClosingTag(true);
     if ($this->get($key) == 'yes') {
         $input->setAttribute('checked', 'checked');
     }
     $lbl->prependChild($input);
     return $lbl;
 }
 public function view()
 {
     if (isset($_POST['action']['submit'])) {
         $this->panelErrors = Extension_Dashboard::validatePanelOptions($this->panelType, $this->panelId);
         if (empty($this->panelErrors)) {
             $this->panelId = Extension_Dashboard::savePanel(array('id' => $this->panelId, 'label' => $this->panelLabel, 'placement' => $this->panelPlacement, 'type' => $this->panelType), $this->panelConfig);
         }
     } else {
         if (isset($_POST['action']['delete'])) {
             Extension_Dashboard::deletePanel($this->panelId);
             $this->_Result->setAttribute('id', $this->panelId);
             $this->_Result->setAttribute('placement', $this->panelPlacement);
             return;
         }
     }
     if (isset($this->panelId) && !empty($this->panelId)) {
         $this->panelConfig = Extension_Dashboard::getPanel($this->panelId);
         $this->panelLabel = $this->panelConfig['label'];
         $this->panelPlacement = $this->panelConfig['placement'];
     }
     if (isset($_POST['action']['submit']) && empty($this->panelErrors)) {
         $html = Extension_Dashboard::buildPanelHTML($this->panelConfig);
         $class = $html->getAttribute('class');
         $html->setAttribute('class', $class . ' new-panel');
         $this->_Result->setAttribute('id', $this->panelId);
         $this->_Result->setAttribute('placement', $this->panelPlacement);
         $this->_Result->setValue(sprintf('<![CDATA[%s]]>', $html->generate()));
     } else {
         $this->addHeaderToPage('Content-Type', 'text/html');
         $container = new XMLElement('form');
         $container->setAttribute('id', 'save-panel');
         $container->appendChild(new XMLElement('div', NULL, array('class' => 'top')));
         $heading = new XMLElement('h3', __('Configuration') . ' <span>' . (isset($this->panelLabel) ? $this->panelLabel : __('Untitled Panel')) . '<span>');
         $container->appendChild($heading);
         $config_options = Extension_Dashboard::buildPanelOptions($this->panelType, $this->panelId, $this->panelErrors);
         $primary = new XMLElement('div', NULL, array('class' => 'panel-config'));
         $fieldset = new XMLElement('fieldset', NULL, array('class' => 'settings'));
         $legend = new XMLElement('legend', __('General'));
         $fieldset->appendChild($legend);
         $group = new XMLElement('div', NULL, array('class' => 'group'));
         $group->appendChild(Widget::Label(__('Name'), Widget::Input('label', $this->panelLabel)));
         $group->appendChild(Widget::Label(__('Placement'), Widget::Select('placement', array(array('primary', $this->panelPlacement == 'primary', __('Main content')), array('secondary', $this->panelPlacement == 'secondary', __('Sidebar'))))));
         $fieldset->appendChild($group);
         $primary->appendChild($fieldset);
         if ($config_options) {
             $primary->appendChild($config_options);
         }
         $actions = new XMLElement('div', NULL, array('class' => 'actions'));
         $actions->appendChild(Widget::Input('action[submit]', __('Save Panel'), 'submit', array('class' => 'button create')));
         $actions->appendChild(Widget::Input('action[cancel]', __('Cancel'), 'submit'));
         if ($this->panelId) {
             $actions->appendChild(new XMLElement('button', __('Delete Panel'), array('class' => 'delete', 'name' => 'action[delete]')));
         }
         $primary->appendChild($actions);
         $primary->appendChild(Widget::Input('id', $this->panelId, 'hidden'));
         $primary->appendChild(Widget::Input('type', $this->panelType, 'hidden'));
         $container->appendChild($primary);
         if (Symphony::isXSRFEnabled()) {
             $container->prependChild(XSRF::formToken());
         }
         $this->_Result = $container;
     }
 }
 /**
  * This function will append the Navigation to the AdministrationPage.
  * It fires a delegate, NavigationPreRender, to allow extensions to manipulate
  * the navigation. Extensions should not use this to add their own navigation,
  * they should provide the navigation through their fetchNavigation function.
  * Note with the Section navigation groups, if there is only one section in a group
  * and that section is set to visible, the group will not appear in the navigation.
  *
  * @uses NavigationPreRender
  * @see getNavigationArray()
  * @see toolkit.Extension#fetchNavigation()
  */
 public function appendNavigation()
 {
     $nav = $this->getNavigationArray();
     /**
      * Immediately before displaying the admin navigation. Provided with the
      * navigation array. Manipulating it will alter the navigation for all pages.
      *
      * @delegate NavigationPreRender
      * @param string $context
      *  '/backend/'
      * @param array $nav
      *  An associative array of the current navigation, passed by reference
      */
     Symphony::ExtensionManager()->notifyMembers('NavigationPreRender', '/backend/', array('navigation' => &$nav));
     $navElement = new XMLElement('nav', null, array('id' => 'nav', 'role' => 'navigation'));
     $contentNav = new XMLElement('ul', null, array('class' => 'content', 'role' => 'menubar'));
     $structureNav = new XMLElement('ul', null, array('class' => 'structure', 'role' => 'menubar'));
     foreach ($nav as $n) {
         if (isset($n['visible']) && $n['visible'] === 'no') {
             continue;
         }
         if ($this->doesAuthorHaveAccess($n['limit'])) {
             $xGroup = new XMLElement('li', $n['name'], array('role' => 'presentation'));
             if (isset($n['class']) && trim($n['name']) !== '') {
                 $xGroup->setAttribute('class', $n['class']);
             }
             $hasChildren = false;
             $xChildren = new XMLElement('ul', null, array('role' => 'menu'));
             if (is_array($n['children']) && !empty($n['children'])) {
                 foreach ($n['children'] as $c) {
                     // adapt for Yes and yes
                     if (strtolower($c['visible']) !== 'yes') {
                         continue;
                     }
                     if ($this->doesAuthorHaveAccess($c['limit'])) {
                         $xChild = new XMLElement('li');
                         $xChild->setAttribute('role', 'menuitem');
                         $linkChild = Widget::Anchor($c['name'], SYMPHONY_URL . $c['link']);
                         if (isset($c['target'])) {
                             $linkChild->setAttribute('target', $c['target']);
                         }
                         $xChild->appendChild($linkChild);
                         $xChildren->appendChild($xChild);
                         $hasChildren = true;
                     }
                 }
                 if ($hasChildren) {
                     $xGroup->setAttribute('aria-haspopup', 'true');
                     $xGroup->appendChild($xChildren);
                     if ($n['type'] === 'content') {
                         $contentNav->appendChild($xGroup);
                     } elseif ($n['type'] === 'structure') {
                         $structureNav->prependChild($xGroup);
                     }
                 }
             }
         }
     }
     $navElement->appendChild($contentNav);
     $navElement->appendChild($structureNav);
     $this->Header->appendChild($navElement);
     Symphony::Profiler()->sample('Navigation Built', PROFILE_LAP);
 }
 /**
  * This function will append the Navigation to the AdministrationPage.
  * It fires a delegate, NavigationPreRender, to allow extensions to manipulate
  * the navigation. Extensions should not use this to add their own navigation,
  * they should provide the navigation through their fetchNavigation function.
  * Note with the Section navigation groups, if there is only one section in a group
  * and that section is set to visible, the group will not appear in the navigation.
  *
  * @uses NavigationPreRender
  * @see getNavigationArray()
  * @see toolkit.Extension#fetchNavigation()
  */
 public function appendNavigation()
 {
     $nav = $this->getNavigationArray();
     /**
      * Immediately before displaying the admin navigation. Provided with the
      * navigation array. Manipulating it will alter the navigation for all pages.
      *
      * @delegate NavigationPreRender
      * @param string $context
      *  '/backend/'
      * @param array $nav
      *  An associative array of the current navigation, passed by reference
      */
     Symphony::ExtensionManager()->notifyMembers('NavigationPreRender', '/backend/', array('navigation' => &$nav));
     $navElement = new XMLElement('nav', NULL, array('id' => 'nav'));
     $contentNav = new XMLElement('ul', NULL, array('class' => 'content'));
     $structureNav = new XMLElement('ul', NULL, array('class' => 'structure'));
     foreach ($nav as $n) {
         if (isset($n['visible']) && $n['visible'] == 'no') {
             continue;
         }
         $can_access = false;
         if (!isset($n['limit']) || $n['limit'] == 'author') {
             $can_access = true;
         } elseif ($n['limit'] == 'developer' && Administration::instance()->Author->isDeveloper()) {
             $can_access = true;
         } elseif ($n['limit'] == 'primary' && Administration::instance()->Author->isPrimaryAccount()) {
             $can_access = true;
         }
         if ($can_access) {
             $xGroup = new XMLElement('li', $n['name']);
             if (isset($n['class']) && trim($n['name']) != '') {
                 $xGroup->setAttribute('class', $n['class']);
             }
             $hasChildren = false;
             $xChildren = new XMLElement('ul');
             if (is_array($n['children']) && !empty($n['children'])) {
                 foreach ($n['children'] as $c) {
                     if ($c['visible'] == 'no') {
                         continue;
                     }
                     $can_access_child = false;
                     if (!isset($c['limit']) || $c['limit'] == 'author') {
                         $can_access_child = true;
                     } elseif ($c['limit'] == 'developer' && Administration::instance()->Author->isDeveloper()) {
                         $can_access_child = true;
                     } elseif ($c['limit'] == 'primary' && Administration::instance()->Author->isPrimaryAccount()) {
                         $can_access_child = true;
                     }
                     if ($can_access_child) {
                         $xChild = new XMLElement('li');
                         $xChild->appendChild(Widget::Anchor($c['name'], SYMPHONY_URL . $c['link']));
                         $xChildren->appendChild($xChild);
                         $hasChildren = true;
                     }
                 }
                 if ($hasChildren) {
                     $xGroup->appendChild($xChildren);
                     if ($n['type'] === 'content') {
                         $contentNav->appendChild($xGroup);
                     } else {
                         if ($n['type'] === 'structure') {
                             $structureNav->prependChild($xGroup);
                         }
                     }
                 }
             }
         }
     }
     $navElement->appendChild($contentNav);
     $navElement->appendChild($structureNav);
     $this->Header->appendChild($navElement);
     Symphony::Profiler()->sample('Navigation Built', PROFILE_LAP);
 }
        if ($pagination_element instanceof XMLElement && $result instanceof XMLElement) {
            $result->prependChild($pagination_element);
        }
    }
    if (isset($this->dsParamPARAMOUTPUT)) {
        $param_pool[$key][] = '';
    }
} else {
    if (!$this->_param_output_only) {
        $result = new XMLElement($this->dsParamROOTELEMENT);
        $result->appendChild($sectioninfo);
        if ($include_pagination_element) {
            $t = $this->dsParamPAGINATERESULTS == 'yes' && isset($this->dsParamLIMIT) && $this->dsParamLIMIT >= 0 ? $this->dsParamLIMIT : $entries['total-entries'];
            $pagination_element = General::buildPaginationElement($entries['total-entries'], $entries['total-pages'], $t, $this->dsParamPAGINATERESULTS == 'yes' && $this->dsParamSTARTPAGE > 0 ? $this->dsParamSTARTPAGE : 1);
            if ($pagination_element instanceof XMLElement && $result instanceof XMLElement) {
                $result->prependChild($pagination_element);
            }
        }
    }
    if (isset($this->dsParamPARAMOUTPUT) && !is_array($param_pool[$key])) {
        $param_pool[$key] = array();
    }
    if (!isset($this->dsParamLIMIT) || $this->dsParamLIMIT > 0) {
        if (isset($this->dsParamGROUP)) {
            $fieldPool[$this->dsParamGROUP] =& $entryManager->fieldManager->fetch($this->dsParamGROUP);
            $groups = $fieldPool[$this->dsParamGROUP]->groupRecords($entries['records']);
            foreach ($groups as $element => $group) {
                foreach ($group as $g) {
                    processRecordGroup($result, $element, $g, $this, $entryManager, $fieldPool, $param_pool, $this->_param_output_only);
                }
            }
 /**
  * Append localised Title and Handle fields to Page edit menu.
  *
  * @param array $context - see delegate description
  */
 public function dAppendPageContent($context)
 {
     Extension_Frontend_Localisation::appendAssets();
     $main_lang = FLang::getMainLang();
     $all_langs = FLang::getAllLangs();
     $langs = FLang::getLangs();
     $fieldset = new XMLElement('fieldset', null, array('class' => 'settings'));
     $fieldset->appendChild(new XMLElement('legend', __('Page LHandles')));
     $container = new XMLElement('div', null, array('class' => 'field-multilingual'));
     /*------------------------------------------------------------------------------------------------*/
     /*  Tabs  */
     /*------------------------------------------------------------------------------------------------*/
     $ul = new XMLElement('ul', null, array('class' => 'tabs'));
     foreach ($langs as $lc) {
         $li = new XMLElement('li', $all_langs[$lc], array('class' => $lc));
         $lc === $main_lang ? $ul->prependChild($li) : $ul->appendChild($li);
     }
     $container->appendChild($ul);
     /*------------------------------------------------------------------------------------------------*/
     /*  Panels  */
     /*------------------------------------------------------------------------------------------------*/
     foreach ($langs as $lc) {
         // title
         $container->appendChild(Widget::Label(__('Localised Title'), Widget::Input("fields[plh_t-" . $lc . "]", $context['fields']['plh_t-' . $lc], 'text', array('length', '30')), 'tab-panel tab-' . $lc . ' tab-title', null, array('style' => 'margin-bottom: 0;border-bottom: none;')));
         // handle
         $container->appendChild(Widget::Label(__('Localised URL Handle'), Widget::Input("fields[plh_h-" . $lc . "]", $context['fields']['plh_h-' . $lc], 'text', array('length', '30')), 'tab-panel tab-' . $lc . ' tab-handle'));
     }
     $fieldset->appendChild($container);
     $context['form']->prependChild($fieldset);
 }