function processRawFieldData($data, &$status, &$message = null, $simulate = false, $entry_id = null) { $status = self::__OK__; $increment_subsequent_order = false; if ($entry_id != null) { $entry_id = General::intval($entry_id); } if (is_array($data)) { //TODO Auto Increment for filtered ordering for now just return the data as it is already properly formatted return $data; } if ($entry_id) { $new_value = $data; $current_value = Symphony::Database()->fetchVar("value", 0, "\n\t\t\t\t\tSELECT value\n\t\t\t\t\tFROM tbl_entries_data_{$this->get('id')}\n\t\t\t\t\tWHERE entry_id=" . $entry_id . "\n\t\t\t\t\tLIMIT 1\n\t\t\t\t"); if (isset($current_value) && $current_value !== $new_value) { $increment_subsequent_order = true; } } else { $increment_subsequent_order = true; } if ($increment_subsequent_order && !empty($data)) { Symphony::Database()->query("UPDATE tbl_entries_data_{$this->get('id')} SET value = (value + 1) WHERE value >= " . $data); } return array('value' => $data); }
/** * Send an email using an SMTP server * * @throws EmailGatewayException * @throws EmailValidationException * @throws Exception * @return boolean */ public function send() { $this->validate(); $settings = array(); $settings['helo_hostname'] = $this->_helo_hostname; if ($this->_auth) { $settings['username'] = $this->_user; $settings['password'] = $this->_pass; } $settings['secure'] = $this->_secure; try { if (!is_a($this->_SMTP, 'SMTP')) { $this->_SMTP = new SMTP($this->_host, $this->_port, $settings); } // Encode recipient names (but not any numeric array indexes) $recipients = array(); foreach ($this->_recipients as $name => $email) { // Support Bcc header if (isset($this->_header_fields['Bcc']) && $this->_header_fields['Bcc'] == $email) { continue; } // if the key is not numeric, qEncode the key. $name = General::intval($name) > -1 ? General::intval($name) : EmailHelper::qEncode($name); $recipients[$name] = $email; } // Combine keys and values into a recipient list (name <email>, name <email>). $recipient_list = EmailHelper::arrayToList($recipients); // Encode the subject $subject = EmailHelper::qEncode((string) $this->_subject); // Build the 'From' header field body $from = empty($this->_sender_name) ? $this->_sender_email_address : EmailHelper::qEncode($this->_sender_name) . ' <' . $this->_sender_email_address . '>'; // Build the 'Reply-To' header field body if (!empty($this->_reply_to_email_address)) { $reply_to = empty($this->_reply_to_name) ? $this->_reply_to_email_address : EmailHelper::qEncode($this->_reply_to_name) . ' <' . $this->_reply_to_email_address . '>'; } if (!empty($reply_to)) { $this->_header_fields = array_merge($this->_header_fields, array('Reply-To' => $reply_to)); } // Build the body text using attachments, html-text and plain-text. $this->prepareMessageBody(); // Build the header fields $this->_header_fields = array_merge($this->_header_fields, array('Message-ID' => sprintf('<%s@%s>', md5(uniqid()), HTTP_HOST), 'Date' => date('r'), 'From' => $from, 'Subject' => $subject, 'To' => $recipient_list, 'X-Mailer' => 'Symphony Email Module', 'MIME-Version' => '1.0')); // Set header fields and fold header field bodies foreach ($this->_header_fields as $name => $body) { $this->_SMTP->setHeader($name, EmailHelper::fold($body)); } // Send the email command. If the envelope from variable is set, use that for the MAIL command. This improves bounce handling. $this->_SMTP->sendMail(is_null($this->_envelope_from) ? $this->_sender_email_address : $this->_envelope_from, $this->_recipients, $this->_body); if ($this->_keepalive === false) { $this->closeConnection(); } $this->reset(); } catch (SMTPException $e) { throw new EmailGatewayException($e->getMessage()); } return true; }
/** * Send an email using the PHP mail() function * * Please note that 'encoded-words' should be used according to * RFC2047. Basically this means that the subject should be * encoded if necessary, as well as (real) names in 'From', 'To' * or 'Reply-To' header field bodies. For details see RFC2047. * * The parts of a message body should be encoded (quoted-printable * or base64) to make non-US-ASCII text work with the widest range * of email transports and clients. * * @throws EmailGatewayException * @throws EmailValidationException * @return bool */ public function send() { $this->validate(); try { // Encode recipient names (but not any numeric array indexes) $recipients = array(); foreach ($this->_recipients as $name => $email) { // Support Bcc header if (isset($this->_header_fields['Bcc']) && $this->_header_fields['Bcc'] == $email) { continue; } // if the key is not numeric, qEncode the key. $name = General::intval($name) > -1 ? General::intval($name) : EmailHelper::qEncode($name); $recipients[$name] = $email; } // Combine keys and values into a recipient list (name <email>, name <email>). $recipient_list = EmailHelper::arrayToList($recipients); // Encode the subject $subject = EmailHelper::qEncode((string) $this->_subject); // Build the 'From' header field body $from = empty($this->_sender_name) ? $this->_sender_email_address : EmailHelper::qEncode($this->_sender_name) . ' <' . $this->_sender_email_address . '>'; // Build the 'Reply-To' header field body if (!empty($this->_reply_to_email_address)) { $reply_to = empty($this->_reply_to_name) ? $this->_reply_to_email_address : EmailHelper::qEncode($this->_reply_to_name) . ' <' . $this->_reply_to_email_address . '>'; } if (!empty($reply_to)) { $this->_header_fields = array_merge($this->_header_fields, array('Reply-To' => $reply_to)); } // Build the message from the attachments, the html-text and the plain-text. $this->prepareMessageBody(); // Build the header fields $this->_header_fields = array_merge($this->_header_fields, array('Message-ID' => sprintf('<%s@%s>', md5(uniqid()), HTTP_HOST), 'Date' => date('r'), 'From' => $from, 'X-Mailer' => 'Symphony Email Module', 'MIME-Version' => '1.0')); // Format header fields $header_fields = array(); foreach ($this->_header_fields as $name => $body) { $header_fields[] = sprintf('%s: %s', $name, $body); } /** * Make things nice for mail(). * - Replace CRLF in the message body by LF as required by mail(). * - Implode the header fields as required by mail(). */ $this->_body = str_replace("\r\n", "\n", $this->_body); $header_fields = implode("\r\n", $header_fields); // Send the email mail($recipient_list, $subject, $this->_body, $header_fields, "-f{$this->_sender_email_address}"); } catch (Exception $e) { throw new EmailGatewayException($e->getMessage()); } return true; }
public function view() { $database = Symphony::Configuration()->get('db', 'database'); $field_ids = array_map(array('General', 'intval'), explode(',', General::sanitize($_GET['field_id']))); $search = MySQL::cleanValue(General::sanitize($_GET['query'])); $types = array_map(array('MySQL', 'cleanValue'), explode(',', General::sanitize($_GET['types']))); $limit = General::intval(General::sanitize($_GET['limit'])); // Set limit if ($limit === 0) { $max = ''; } elseif ($limit < 0) { $max = ' LIMIT 100'; } else { $max = sprintf(' LIMIT %d', $limit); } // Entries if (in_array('entry', $types)) { foreach ($field_ids as $field_id) { $this->get($database, intval($field_id), $search, $max); } } // Associations if (in_array('association', $types)) { foreach ($field_ids as $field_id) { $association_id = $this->getAssociationId($field_id); if ($association_id) { $this->get($database, $association_id, $search, $max); } } } // Static values if (in_array('static', $types)) { foreach ($field_ids as $field_id) { $this->getStatic($field_id, $search); } } // Return results return $this->_Result; }
/** * Implodes an associative array or straight array to a * comma-separated string * * @param array $array * @return string */ public static function arrayToList(array $array = array()) { $return = array(); foreach ($array as $name => $email) { $return[] = empty($name) || General::intval($name) > -1 ? $email : $name . ' <' . $email . '>'; } return implode(', ', $return); }
/** * 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; }
/** * This function iterates over `dsParamFILTERS` and builds the relevant * `$where` and `$joins` parameters with SQL. This SQL is generated from * `Field->buildDSRetrievalSQL`. A third parameter, `$group` is populated * with boolean from `Field->requiresSQLGrouping()` * * @param string $where * @param string $joins * @param boolean $group * @throws Exception */ public function processFilters(&$where, &$joins, &$group) { if (!is_array($this->dsParamFILTERS) || empty($this->dsParamFILTERS)) { return; } $pool = FieldManager::fetch(array_filter(array_keys($this->dsParamFILTERS), 'is_int')); self::$_fieldPool += $pool; if (!is_string($where)) { $where = ''; } foreach ($this->dsParamFILTERS as $field_id => $filter) { if (is_array($filter) && empty($filter) || trim($filter) == '') { continue; } if (!is_array($filter)) { $filter_type = Datasource::determineFilterType($filter); $value = preg_split('/' . ($filter_type == Datasource::FILTER_AND ? '\\+' : '(?<!\\\\),') . '\\s*/', $filter, -1, PREG_SPLIT_NO_EMPTY); $value = array_map('trim', $value); $value = array_map(array('Datasource', 'removeEscapedCommas'), $value); } else { $value = $filter; } if (!in_array($field_id, self::$_system_parameters) && $field_id != 'id' && !self::$_fieldPool[$field_id] instanceof Field) { throw new Exception(__('Error creating field object with id %1$d, for filtering in data source %2$s. Check this field exists.', array($field_id, '<code>' . $this->dsParamROOTELEMENT . '</code>'))); } // Support system:id as well as the old 'id'. #1691 if ($field_id === 'system:id' || $field_id === 'id') { $c = 'IN'; if (stripos($value[0], 'not:') === 0) { $value[0] = preg_replace('/^not:\\s*/', null, $value[0]); $c = 'NOT IN'; } // Cast all ID's to integers. (RE: #2191) $value = array_map(function ($val) { $val = General::intval($val); // General::intval can return -1, so reset that to 0 // so there are no side effects for the following // array_sum and array_filter calls. RE: #2475 if ($val === -1) { $val = 0; } return $val; }, $value); $count = array_sum($value); $value = array_filter($value); // If the ID was cast to 0, then we need to filter on 'id' = 0, // which will of course return no results, but without it the // Datasource will return ALL results, which is not the // desired behaviour. RE: #1619 if ($count === 0) { $value[] = 0; } // If there are no ID's, no need to filter. RE: #1567 if (!empty($value)) { $where .= " AND `e`.id " . $c . " (" . implode(", ", $value) . ") "; } } elseif ($field_id === 'system:creation-date' || $field_id === 'system:modification-date' || $field_id === 'system:date') { $date_joins = ''; $date_where = ''; $date = new FieldDate(); $date->buildDSRetrievalSQL($value, $date_joins, $date_where, $filter_type == Datasource::FILTER_AND ? true : false); // Replace the date field where with the `creation_date` or `modification_date`. $date_where = preg_replace('/`t\\d+`.date/', $field_id !== 'system:modification-date' ? '`e`.creation_date_gmt' : '`e`.modification_date_gmt', $date_where); $where .= $date_where; } else { if (!self::$_fieldPool[$field_id]->buildDSRetrievalSQL($value, $joins, $where, $filter_type == Datasource::FILTER_AND ? true : false)) { $this->_force_empty_result = true; return; } if (!$group) { $group = self::$_fieldPool[$field_id]->requiresSQLGrouping(); } } } }
/** * * Builds the content view */ public function view() { // _context[0] => entry values // _context[1] => fieldId if (!is_array($this->_context) || empty($this->_context)) { $this->_Result->appendChild(new XMLElement('error', __('Parameters not found'))); return; } else { if (count($this->_context) < self::NUMBER_OF_URL_PARAMETERS) { $this->_Result->appendChild(new XMLElement('error', __('Not enough parameters'))); return; } else { if (count($this->_context) > self::NUMBER_OF_URL_PARAMETERS) { $this->_Result->appendChild(new XMLElement('error', __('Too many parameters'))); return; } } } $entriesId = explode(',', MySQL::cleanValue($this->_context[0])); $entriesId = array_map(array('General', 'intval'), $entriesId); if (!is_array($entriesId) || empty($entriesId)) { $this->_Result->appendChild(new XMLElement('error', __('No entry no found'))); return; } $parentFieldId = General::intval($this->_context[1]); if ($parentFieldId < 1) { $this->_Result->appendChild(new XMLElement('error', __('Parent field id not valid'))); return; } $parentField = $this->fieldManager->fetch($parentFieldId); if (!$parentField || empty($parentField)) { $this->_Result->appendChild(new XMLElement('error', __('Parent field not found'))); return; } if ($parentField->get('type') != 'entry_relationship') { $this->_Result->appendChild(new XMLElement('error', __('Parent field is `%s`, not `entry_relationship`', array($parentField->get('type'))))); return; } $includedElements = $this->parseIncludedElements($parentField); $xmlParams = self::getXmlParams(); // Get entries one by one since they may belong to // different sections, which prevents us from // passing an array of entryId. foreach ($entriesId as $key => $entryId) { $entry = $this->entryManager->fetch($entryId); if (empty($entry)) { $li = new XMLElement('li', null, array('data-entry-id' => $entryId)); $header = new XMLElement('header', null, array('class' => 'frame-header')); $title = new XMLElement('h4'); $title->appendChild(new XMLElement('strong', __('Entry %s not found', array($entryId)))); $header->appendChild($title); $options = new XMLElement('div', null, array('class' => 'destructor')); if ($parentField->is('allow_link')) { $options->appendChild(new XMLElement('a', __('Un-link'), array('class' => 'unlink', 'data-unlink' => $entryId))); } $header->appendChild($options); $li->appendChild($header); $this->_Result->appendChild($li); } else { $entry = $entry[0]; $entryData = $entry->getData(); $entrySection = $this->sectionManager->fetch($entry->get('section_id')); $entryVisibleFields = $entrySection->fetchVisibleColumns(); $entryFields = $entrySection->fetchFields(); $entrySectionHandle = $this->getSectionName($entry, 'handle'); $li = new XMLElement('li', null, array('data-entry-id' => $entryId, 'data-section' => $entrySectionHandle, 'data-section-id' => $entrySection->get('id'))); $header = new XMLElement('header', null, array('class' => 'frame-header')); $title = new XMLElement('h4'); $title->appendChild(new XMLElement('strong', $this->getEntryTitle($entry, $entryVisibleFields, $entryFields))); $title->appendChild(new XMLElement('span', $this->getSectionName($entry))); $header->appendChild($title); $options = new XMLElement('div', null, array('class' => 'destructor')); if ($parentField->is('allow_edit')) { $title->setAttribute('data-edit', $entryId); $options->appendChild(new XMLElement('a', __('Edit'), array('class' => 'edit', 'data-edit' => $entryId))); } if ($parentField->is('allow_delete')) { $options->appendChild(new XMLElement('a', __('Delete'), array('class' => 'delete', 'data-delete' => $entryId))); } if ($parentField->is('allow_link')) { $options->appendChild(new XMLElement('a', __('Replace'), array('class' => 'unlink', 'data-replace' => $entryId))); } if ($parentField->is('allow_delete') || $parentField->is('allow_link')) { $options->appendChild(new XMLElement('a', __('Un-link'), array('class' => 'unlink', 'data-unlink' => $entryId))); } $header->appendChild($options); $li->appendChild($header); $xslFilePath = WORKSPACE . '/er-templates/' . $entrySectionHandle . '.xsl'; if (!empty($entryData) && !!@file_exists($xslFilePath)) { $xmlData = new XMLElement('data'); $xmlData->setIncludeHeader(true); $xml = new XMLElement('entry'); $xml->setAttribute('id', $entryId); $xmlData->appendChild($xmlParams); $xmlData->appendChild($xml); foreach ($entryData as $fieldId => $data) { $filteredData = array_filter($data, function ($value) { return $value != null; }); if (empty($filteredData)) { continue; } $field = $entryFields[$fieldId]; $fieldName = $field->get('element_name'); $fieldIncludedElement = $includedElements[$entrySectionHandle]; if (FieldEntry_relationship::isFieldIncluded($fieldName, $fieldIncludedElement)) { $fieldIncludableElements = $field->fetchIncludableElements(); if ($field instanceof FieldEntry_relationship) { $fieldIncludableElements = null; } if (!empty($fieldIncludableElements) && count($fieldIncludableElements) > 1) { foreach ($fieldIncludableElements as $fieldIncludableElement) { $submode = preg_replace('/^' . $fieldName . '\\s*\\:\\s*/i', '', $fieldIncludableElement, 1); $field->appendFormattedElement($xml, $data, false, $submode, $entryId); } } else { $field->appendFormattedElement($xml, $data, false, null, $entryId); } } } $indent = false; $mode = $parentField->get('mode'); if (isset($_REQUEST['debug'])) { $mode = 'debug'; } if ($mode == 'debug') { $indent = true; } $xmlMode = empty($mode) ? '' : 'mode="' . $mode . '"'; $xmlString = $xmlData->generate($indent, 0); $xsl = '<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="' . str_replace('\\', '/', $xslFilePath) . '"/> <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="no" /> <xsl:template match="/"> <xsl:apply-templates select="/data" ' . $xmlMode . ' /> </xsl:template> <xsl:template match="/data" ' . $xmlMode . '> <xsl:apply-templates select="entry" ' . $xmlMode . ' /> </xsl:template> <xsl:template match="/data" mode="debug"> <xsl:copy-of select="/" /> </xsl:template> </xsl:stylesheet>'; $xslt = new XsltProcess(); $result = $xslt->process($xmlString, $xsl, $this->params); if ($mode == 'debug') { $result = '<pre><code>' . str_replace('<', '<', str_replace('>', '>', $xmlString)) . '</code></pre>'; } if ($xslt->isErrors()) { $error = $xslt->getError(); $result = $error[1]['message']; } if (!!$xslt && strlen($result) > 0) { $content = new XMLElement('div', $result, array('class' => 'content')); $li->appendChild($content); } } $this->_Result->appendChild($li); } } }
/** * * Builds the content view */ public function view() { if ($_SERVER['REQUEST_METHOD'] != 'POST') { $this->_Result['status'] = Page::HTTP_STATUS_BAD_REQUEST; $this->_Result['error'] = __('This page accepts posts only'); $this->setHttpStatus($this->_Result['status']); return; } // _context[0] => entry id to delete // _context[1] => fieldId // _context[2] => current entry id (parent of entry id to delete) if (!is_array($this->_context) || empty($this->_context)) { $this->_Result['error'] = __('Parameters not found'); return; } else { if (count($this->_context) < self::NUMBER_OF_URL_PARAMETERS) { $this->_Result['error'] = __('Not enough parameters'); return; } else { if (count($this->_context) > self::NUMBER_OF_URL_PARAMETERS) { $this->_Result['error'] = __('Too many parameters'); return; } } } // Validate to delete entry ID $rawToDeleteEntryId = MySQL::cleanValue($this->_context[0]); $toDeleteEntryId = General::intval($rawToDeleteEntryId); if ($toDeleteEntryId < 1) { $this->_Result['error'] = __('No entry no found'); return; } // Validate parent field exists $parentFieldId = General::intval(MySQL::cleanValue($this->_context[1])); if ($parentFieldId < 1) { $this->_Result['error'] = __('Parent id not valid'); return; } $parentField = FieldManager::fetch($parentFieldId); if (!$parentField || empty($parentField)) { $this->_Result['error'] = __('Parent field not found'); return; } // Validate parent entry ID $rawEntryId = MySQL::cleanValue($this->_context[2]); $entryId = General::intval($rawEntryId); if ($entryId < 1) { $this->_Result['error'] = sprintf(__('Parent entry id `%s` not valid'), $rawEntryId); return; } // Validate parent entry exists $entry = EntryManager::fetch($entryId); if ($entry == null || count($entry) != 1) { $this->_Result['error'] = __('Parent entry not found'); return; } if (is_array($entry)) { $entry = $entry[0]; } if ($entry->get('section_id') != $parentField->get('parent_section')) { $this->_Result['error'] = __('Field and entry do not belong together'); return; } // Validate to delete entry exists $toDeleteEntry = EntryManager::fetch($toDeleteEntryId); if ($toDeleteEntry == null || count($toDeleteEntry) != 1) { $this->_Result['error'] = __('Entry not found'); return; } if (is_array($toDeleteEntry)) { $toDeleteEntry = $toDeleteEntry[0]; } // Validate entry is not linked anywhere else if (!isset($_REQUEST['no-assoc'])) { //$toDeleteSection = SectionManager::fetch($toDeleteEntry->get('section_id')); //$toDeleteAssoc = $toDeleteSection->fetchChildAssociations(false); $toDeleteAssoc = SectionManager::fetchChildAssociations($toDeleteEntry->get('section_id'), false); //var_dump($toDeleteAssoc);die; // TODO: find if the toDeleteEntry is linked or not. if (count($toDeleteAssoc) > 1) { $this->_Result['assoc'] = true; $this->_Result['error'] = __('Entry might be link elsewhere. Do you want to continue?'); return; } } // Delete the entry if (!EntryManager::delete($toDeleteEntryId)) { $this->_Result['error'] = __('Could not delete the entry'); return; } $this->_Result['entry-id'] = $entryId; $this->_Result['ok'] = true; }
/** * * Builds the content view */ public function view() { if ($_SERVER['REQUEST_METHOD'] != 'POST') { $this->_Result['status'] = Page::HTTP_STATUS_BAD_REQUEST; $this->_Result['error'] = __('This page accepts posts only'); $this->setHttpStatus($this->_Result['status']); return; } // _context[0] => entry values // _context[1] => fieldId // _context[2] => current entry id if (!is_array($this->_context) || empty($this->_context)) { $this->_Result['error'] = __('Parameters not found'); return; } else { if (count($this->_context) < self::NUMBER_OF_URL_PARAMETERS) { $this->_Result['error'] = __('Not enough parameters'); return; } else { if (count($this->_context) > self::NUMBER_OF_URL_PARAMETERS) { $this->_Result['error'] = __('Too many parameters'); return; } } } // Validate ALL entries ID $rawEntriesId = explode(',', MySQL::cleanValue($this->_context[0])); $entriesId = array_map(array('General', 'intval'), $rawEntriesId); if (!is_array($entriesId) || empty($entriesId)) { $this->_Result['error'] = __('No entry no found'); return; } if (in_array('null', $rawEntriesId)) { $entriesId = array(); } foreach ($entriesId as $entryPos => $entryId) { if ($entryId < 1) { $this->_Result['error'] = sprintf(__('Entry id `%s` not valid'), $rawEntriesId[$entryPos]); return; } } // Validate parent field exists $parentFieldId = General::intval(MySQL::cleanValue($this->_context[1])); if ($parentFieldId < 1) { $this->_Result['error'] = __('Parent id not valid'); return; } $parentField = FieldManager::fetch($parentFieldId); if (!$parentField || empty($parentField)) { $this->_Result['error'] = __('Parent field not found'); return; } // Validate parent entry ID $rawEntryId = MySQL::cleanValue($this->_context[2]); $entryId = General::intval($rawEntryId); if ($entryId < 1) { $this->_Result['error'] = sprintf(__('Parent entry id `%s` not valid'), $rawEntryId); return; } // Validate parent entry exists $entry = EntryManager::fetch($entryId); if ($entry == null || count($entry) != 1) { $this->_Result['error'] = __('Parent entry not found'); return; } if (is_array($entry)) { $entry = $entry[0]; } if ($entry->get('section_id') != $parentField->get('parent_section')) { $this->_Result['error'] = __('Field and entry do not belong together'); return; } $entryData = $entry->getData(); // set new data $entryData[$parentFieldId]['entries'] = implode(',', $entriesId); // check if data are valid $resMessage = null; $res = $parentField->checkPostFieldData($entryData[$parentFieldId], $resMessage, $entryId); if ($res != Field::__OK__) { $this->_Result['error'] = $resMessage; return; } // save the new data $entry->setData($parentFieldId, $entryData[$parentFieldId]); if (!$entry->commit()) { $this->_Result['error'] = __('Could not save entry'); return; } $this->_Result['entry-id'] = $entryId; $this->_Result['ok'] = true; $this->_Result['entries'] = $entryData[$parentFieldId]['entries']; }