예제 #1
0
function savelisting($option)
{
    global $Itemid, $mtconf, $mainframe, $link_id;
    // Check for request forgeries
    JRequest::checkToken() or jexit('Invalid Token');
    $database =& JFactory::getDBO();
    $my =& JFactory::getUser();
    require_once JPATH_COMPONENT_ADMINISTRATOR . DS . 'mfields.class.php';
    require_once JPATH_COMPONENT_ADMINISTRATOR . DS . 'tools.mtree.php';
    $raw_filenames = array();
    # Get cat_id / remove_image / link_image
    $cat_id = JRequest::getInt('cat_id', 0);
    $other_cats = explode(',', JRequest::getString('other_cats', null, 'post'));
    JArrayHelper::toInteger($other_cats);
    if (isset($other_cats) && empty($other_cats[0])) {
        $other_cats = array();
    }
    # Check if any malicious user is trying to submit link
    if ($mtconf->get('user_addlisting') == 1 && $my->id < 1 && $link_id == 0 || $mtconf->get('user_addlisting') == -1 && $link_id == 0 || $mtconf->get('user_allowmodify') == 0 && $link_id > 0) {
        echo _NOT_EXIST;
    } else {
        # Allowed
        $row = new mtLinks($database);
        $post = JRequest::get('post');
        if (!@$row->bind($post)) {
            echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
            exit;
        }
        $isNew = $row->link_id < 1 ? 1 : 0;
        # Assignment for new record
        if ($isNew) {
            $jdate = JFactory::getDate();
            $row->link_created = $jdate->toMySQL();
            $row->publish_up = $jdate->toMySQL();
            $row->ordering = 999;
            // Set an expire date for listing if enabled in configuration
            if ($mtconf->get('days_to_expire') > 0) {
                $jdate->setOffset(intval($mtconf->get('days_to_expire')) * 24);
                $row->publish_down = $jdate->toMySQL(true);
                $jdate->setOffset(intval($mtconf->get('days_to_expire')) * -24);
            }
            if ($my->id > 0) {
                $row->user_id = $my->id;
            } else {
                $database->setQuery('SELECT id FROM #__users WHERE usertype = \'Super Administrator\' LIMIT 1');
                $row->user_id = $database->loadResult();
            }
            if (empty($row->alias)) {
                $row->alias = JFilterOutput::stringURLSafe($row->link_name);
            }
            // Approval for adding listing
            if ($mtconf->get('needapproval_addlisting')) {
                $row->link_approved = '0';
            } else {
                $row->link_approved = 1;
                $row->link_published = 1;
                $row->updateLinkCount(1);
                $cache =& JFactory::getCache('com_mtree');
                $cache->clean();
            }
            # Modification to existing record
        } else {
            # Validate that this user is the rightful owner
            $database->setQuery("SELECT user_id FROM #__mt_links WHERE link_id = '" . $row->link_id . "'");
            $user_id = $database->loadResult();
            if ($user_id != $my->id) {
                echo _NOT_EXIST;
            } else {
                // Get the name of the old photo and last modified date
                $sql = "SELECT link_id, link_modified, link_created FROM #__mt_links WHERE link_id='" . $row->link_id . "'";
                $database->setQuery($sql);
                $old = $database->loadObject();
                // Retrive last modified date
                $old_modified = $old->link_modified;
                $link_created = $old->link_created;
                // $row->link_published = 1;
                $row->user_id = $my->id;
                // Get other info from original listing
                // $database->setQuery( "SELECT link_name, link_desc, link_hits, link_votes, link_rating, link_featured, link_created, link_visited, ordering, publish_down, publish_up, attribs, internal_notes, link_published, link_approved FROM #__mt_links WHERE link_id = '$row->link_id'" );
                $database->setQuery("SELECT * FROM #__mt_links WHERE link_id = '{$row->link_id}'");
                $original = $database->loadObject();
                $original_link_id = $row->link_id;
                $row->link_modified = $row->getLinkModified($original_link_id, $post);
                foreach ($original as $k => $v) {
                    if (in_array($k, array('link_hits', 'link_votes', 'link_rating', 'link_featured', 'link_created', 'link_visited', 'ordering', 'publish_down', 'publish_up', 'attribs', 'internal_notes', 'link_published', 'link_approved'))) {
                        $row->{$k} = $v;
                    }
                }
                if (!isset($row->metadesc) && isset($original->metadesc) && !empty($original->metadesc)) {
                    $row->metadesc = $original->metadesc;
                }
                if (!isset($row->metakey) && isset($original->metakey) && !empty($original->metakey)) {
                    $row->metakey = $original->metakey;
                }
                // Remove any listing that is waiting for approval for this listing
                $database->setQuery('SELECT link_id FROM #__mt_links WHERE link_approved = \'' . -1 * $row->link_id . '\' LIMIT 1');
                $tmp_pending_link_id = $database->loadResult();
                if ($tmp_pending_link_id > 0) {
                    $database->setQuery('SELECT CONCAT(' . $database->quote(JPATH_SITE . $mtconf->get('relative_path_to_attachments')) . ',raw_filename) FROM #__mt_cfvalues_att WHERE link_id = ' . $database->quote($tmp_pending_link_id));
                    $raw_filenames = array_merge($raw_filenames, $database->loadResultArray());
                    $database->setQuery("DELETE FROM #__mt_cfvalues WHERE link_id = '" . $tmp_pending_link_id . "'");
                    $database->query();
                    $database->setQuery("DELETE FROM #__mt_cfvalues_att WHERE link_id = '" . $tmp_pending_link_id . "'");
                    $database->query();
                    $database->setQuery("DELETE FROM #__mt_links WHERE link_id = '" . $tmp_pending_link_id . "' LIMIT 1");
                    $database->query();
                    $database->setQuery("DELETE FROM #__mt_cl WHERE link_id = '" . $tmp_pending_link_id . "'");
                    $database->query();
                    $database->setQuery("SELECT filename FROM #__mt_images WHERE link_id = '" . $tmp_pending_link_id . "'");
                    $tmp_pending_images = $database->loadResultArray();
                    if (count($tmp_pending_images)) {
                        foreach ($tmp_pending_images as $tmp_pending_image) {
                            unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $tmp_pending_image);
                            unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $tmp_pending_image);
                            unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $tmp_pending_image);
                        }
                    }
                    $database->setQuery("DELETE FROM #__mt_images WHERE link_id = '" . $tmp_pending_link_id . "'");
                    $database->query();
                }
                // Approval for modify listing
                if ($original->link_published && $original->link_approved) {
                    if ($mtconf->get('needapproval_modifylisting')) {
                        $row->link_approved = -1 * $row->link_id;
                        $row->link_id = null;
                    } else {
                        $row->link_approved = 1;
                        $cache =& JFactory::getCache('com_mtree');
                        $cache->clean();
                        // Get old state (approved, published)
                        $database->setQuery("SELECT cat_id FROM #__mt_cl AS cl WHERE link_id ='" . $row->link_id . "' AND main = 1 LIMIT 1");
                        $old_state = $database->loadObject();
                        if ($row->cat_id != $old_state->cat_id) {
                            $row->updateLinkCount(1);
                            $row->updateLinkCount(-1, $old_state->cat_id);
                        }
                    }
                }
            }
        }
        // End of $isNew
        # Load field type
        $database->setQuery('SELECT cf_id, field_type, hidden, published FROM #__mt_customfields');
        $fieldtype = $database->loadObjectList('cf_id');
        $hidden_cfs = array();
        foreach ($fieldtype as $ft) {
            if ($ft->hidden && $ft->published) {
                $hidden_cfs[] = $ft->cf_id;
            }
        }
        # Load original custom field values, for use in mosetstree plugins
        $sql = "SELECT cf_id, value FROM #__mt_cfvalues WHERE link_id='" . $row->link_id . "' AND attachment <= 0";
        if (!empty($hidden_cfs)) {
            $sql .= " AND cf_id NOT IN (" . implode(',', $hidden_cfs) . ")";
        }
        $database->setQuery($sql);
        $original_cfs = $database->loadAssocList('cf_id');
        if (!empty($original_cfs)) {
            foreach ($original_cfs as $key_cf_id => $value) {
                $original_cfs[$key_cf_id] = $value['value'];
            }
        }
        # Erase Previous Records, make way for the new data
        $sql = "DELETE FROM #__mt_cfvalues WHERE link_id='" . $row->link_id . "' AND attachment <= 0";
        if (!empty($hidden_cfs)) {
            $sql .= " AND cf_id NOT IN (" . implode(',', $hidden_cfs) . ")";
        }
        $database->setQuery($sql);
        if (!$database->query()) {
            echo "<script> alert('" . $database->getErrorMsg() . "'); window.history.go(-1); </script>\n";
            exit;
        }
        if (!empty($fieldtype)) {
            $load_ft = array();
            foreach ($fieldtype as $ft) {
                if (!in_array($ft->field_type, $load_ft)) {
                    $load_ft[] = $ft->field_type;
                }
            }
            $database->setQuery('SELECT ft_class FROM #__mt_fieldtypes WHERE field_type IN (\'' . implode('\',\'', $load_ft) . '\')');
            $ft_classes = $database->loadResultArray();
            foreach ($ft_classes as $ft_class) {
                eval($ft_class);
            }
        }
        # Collect all active custom field's id
        $active_cfs = array();
        $additional_cfs = array();
        $core_params = array();
        foreach ($post as $k => $v) {
            $v = JRequest::getVar($k, '', 'post', '', 2);
            if (substr($k, 0, 2) == "cf" && (!is_array($v) && (!empty($v) || $v == '0') || is_array($v) && !empty($v[0]))) {
                if (strpos(substr($k, 2), '_') === false && is_numeric(substr($k, 2))) {
                    // This custom field uses only one input. ie: cf17, cf23, cf2
                    $active_cfs[intval(substr($k, 2))] = $v;
                    if (is_array($v) && array_key_exists(intval(substr($k, 2)), $original_cfs)) {
                        $original_cfs[intval(substr($k, 2))] = explode('|', $original_cfs[intval(substr($k, 2))]);
                    }
                } else {
                    // This custom field uses more than one input. The date field is an example of cf that uses this. ie: cf13_0, cf13_1, cf13_2
                    $ids = explode('_', substr($k, 2));
                    if (count($ids) == 2 && is_numeric($ids[0]) && is_numeric($ids[1])) {
                        $additional_cfs[intval($ids[0])][intval($ids[1])] = $v;
                    }
                }
            } elseif (substr($k, 0, 7) == 'keep_cf') {
                $cf_id = intval(substr($k, 7));
                $keep_att_ids[] = $cf_id;
                # Perform parseValue on Core Fields
            } elseif (substr($k, 0, 2) != "cf" && isset($row->{$k})) {
                if (strpos(strtolower($k), 'link_') === false) {
                    $core_field_type = 'core' . $k;
                } else {
                    $core_field_type = 'core' . str_replace('link_', '', $k);
                }
                $class = 'mFieldType_' . $core_field_type;
                if (class_exists($class)) {
                    if (empty($core_params)) {
                        $database->setQuery('SELECT field_type, params FROM #__mt_customfields WHERE iscore = 1');
                        $core_params = $database->loadObjectList('field_type');
                    }
                    $mFieldTypeObject = new $class(array('params' => $core_params[$core_field_type]->params));
                    $v = call_user_func(array(&$mFieldTypeObject, 'parseValue'), $v);
                    $row->{$k} = $v;
                }
            }
        }
        # OK. Store new or updated listing into database
        if (!$row->store()) {
            echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
            exit;
        } else {
            if (!$isNew && $row->link_id > 0) {
                // Find if there are any additional categories assigned to the listinig
                if ($original_link_id != $row->link_id) {
                    $database->setQuery('SELECT DISTINCT cat_id FROM #__mt_cl WHERE link_id = ' . $database->Quote($original_link_id) . ' and main=\'0\' ');
                    $tmp_cats = $database->loadResultArray();
                    if (!empty($tmp_cats)) {
                        foreach ($tmp_cats as $tmp_cat_id) {
                            $database->setQuery('INSERT INTO #__mt_cl (`link_id`,`cat_id`,`main`) VALUES(' . $database->Quote($row->link_id) . ',' . $database->Quote($tmp_cat_id) . ',\'0\')');
                            $database->query();
                        }
                    }
                    unset($tmp_cats);
                }
            }
        }
        # Update "Also appear in these categories" aka other categories
        if ($mtconf->get('allow_user_assign_more_than_one_category')) {
            $mtCL = new mtCL_main0($database);
            $mtCL->load($row->link_id);
            $mtCL->update($other_cats);
        }
        // $files_cfs is used to store attachment custom fields.
        // This will be used in the next foreach loop to
        // prevent it from storing it's value to #__mt_cfvalues
        // table
        $file_cfs = array();
        // $file_values is used to store parsed data through
        // mFieldType_* which will be done in the next foreach
        // loop
        $file_values = array();
        $files = JRequest::get('files');
        foreach ($files as $k => $v) {
            if (substr($k, 0, 2) == "cf" && is_numeric(substr($k, 2)) && $v['error'] == 0) {
                $active_cfs[intval(substr($k, 2))] = $v;
                $file_cfs[] = substr($k, 2);
            }
        }
        if (!empty($active_cfs)) {
            $database->setQuery('SELECT cf_id, params FROM #__mt_customfields WHERE iscore = 0 AND cf_id IN (\'' . implode('\',\'', array_keys($active_cfs)) . '\') LIMIT ' . count($active_cfs));
            $params = $database->loadObjectList('cf_id');
            foreach ($active_cfs as $cf_id => $v) {
                if (class_exists('mFieldType_' . $fieldtype[$cf_id]->field_type)) {
                    $class = 'mFieldType_' . $fieldtype[$cf_id]->field_type;
                } else {
                    $class = 'mFieldType';
                }
                # Perform parseValue on Custom Fields
                $mFieldTypeObject = new $class(array('id' => $cf_id, 'params' => $params[$cf_id]->params));
                if (array_key_exists($cf_id, $additional_cfs) && !empty($additional_cfs[$cf_id])) {
                    $arr_v = $additional_cfs[$cf_id];
                    array_unshift($arr_v, $v);
                    $v =& $mFieldTypeObject->parseValue($arr_v);
                    $active_cfs[$cf_id] = $v;
                } else {
                    $v =& $mFieldTypeObject->parseValue($v);
                }
                if (in_array($cf_id, $file_cfs)) {
                    $file_values[$cf_id] = $v;
                }
                if ((!empty($v) || $v == '0') && !in_array($cf_id, $file_cfs)) {
                    # -- Now add the row
                    $sql = 'INSERT INTO #__mt_cfvalues (`cf_id`, `link_id`, `value`)' . ' VALUES (' . $database->quote($cf_id) . ', ' . $database->quote($row->link_id) . ', ' . $database->quote(is_array($v) ? implode("|", $v) : $v) . ')';
                    $database->setQuery($sql);
                    if (!$database->query()) {
                        echo "<script> alert('" . $database->getErrorMsg() . "'); window.history.go(-1); </script>\n";
                        exit;
                    }
                }
                unset($mFieldTypeObject);
            }
            // End of foreach
        }
        # If this link is pending approval for modification, copy over hidden values
        if (!$isNew && $mtconf->get('needapproval_modifylisting') && !empty($hidden_cfs)) {
            $sql = 'INSERT INTO #__mt_cfvalues (`cf_id`, `link_id`, `value`)' . ' SELECT `cf_id`, \'' . $row->link_id . '\', `value` FROM #__mt_cfvalues WHERE link_id = ' . $original_link_id . ' AND cf_id IN (' . implode(',', $hidden_cfs) . ')';
            $database->setQuery($sql);
            $database->query();
        }
        # Remove all attachment except those that are kept
        if (isset($keep_att_ids) && !empty($keep_att_ids)) {
            $database->setQuery('SELECT CONCAT(' . $database->quote(JPATH_SITE . $mtconf->get('relative_path_to_attachments')) . ',raw_filename) FROM #__mt_cfvalues_att WHERE link_id = ' . $database->quote($row->link_id) . ' AND cf_id NOT IN (\'' . implode('\',\'', $keep_att_ids) . '\')');
            $raw_filenames = array_merge($raw_filenames, $database->loadResultArray());
            $database->setQuery('DELETE FROM #__mt_cfvalues_att WHERE link_id = \'' . $row->link_id . '\' AND cf_id NOT IN (\'' . implode('\',\'', $keep_att_ids) . '\')');
            $database->query();
            $database->setQuery('DELETE FROM #__mt_cfvalues WHERE link_id = \'' . $row->link_id . '\' AND cf_id NOT IN (\'' . implode('\',\'', $keep_att_ids) . '\') AND attachment > 0');
            $database->query();
        } else {
            $database->setQuery('SELECT CONCAT(' . $database->quote(JPATH_SITE . $mtconf->get('relative_path_to_attachments')) . ',raw_filename) FROM #__mt_cfvalues_att WHERE link_id = ' . $database->quote($row->link_id));
            $raw_filenames = array_merge($raw_filenames, $database->loadResultArray());
            $database->setQuery('DELETE FROM #__mt_cfvalues_att WHERE link_id = \'' . $row->link_id . '\'');
            $database->query();
            $database->setQuery('DELETE FROM #__mt_cfvalues WHERE link_id = \'' . $row->link_id . '\' AND attachment > 0');
            $database->query();
        }
        if (!$isNew && isset($keep_att_ids) && !empty($keep_att_ids) && $mtconf->get('needapproval_modifylisting') && $row->link_published == 1) {
            $database->setQuery("SELECT * FROM #__mt_cfvalues_att WHERE link_id = '" . $original_link_id . "' AND cf_id IN ('" . implode("','", $keep_att_ids) . "')");
            $listing_atts = $database->loadObjectList();
            foreach ($listing_atts as $listing_att) {
                $file_extension = pathinfo($listing_att->raw_filename);
                $file_extension = strtolower($file_extension['extension']);
                $database->setQuery('INSERT INTO #__mt_cfvalues_att (`link_id`,`cf_id`,`raw_filename`,`filename`,`filesize`,`extension`) ' . 'VALUES (' . $row->link_id . ', ' . $database->Quote($listing_att->cf_id) . ', ' . $database->Quote($listing_att->raw_filename) . ', ' . $database->Quote($listing_att->filename) . ', ' . $database->Quote($listing_att->filesize) . ', ' . $database->Quote($listing_att->extension) . ')');
                $database->query();
                $att_id = $database->insertid();
                $database->setQuery('UPDATE #__mt_cfvalues_att SET raw_filename = ' . $database->Quote($att_id . '.' . $file_extension) . ' WHERE att_id = ' . $database->Quote($att_id) . ' LIMIT 1');
                $database->query();
                copy($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_attachments') . $listing_att->raw_filename, $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_attachments') . $att_id . "." . $file_extension);
            }
            $database->setQuery('INSERT INTO #__mt_cfvalues (cf_id,link_id,value,attachment) ' . "\nSELECT cf_id,'" . $row->link_id . "',value,attachment " . "FROM #__mt_cfvalues " . "WHERE link_id = '" . $original_link_id . "' AND cf_id IN ('" . implode("','", $keep_att_ids) . "')");
            $database->query();
        }
        jimport('joomla.filesystem.file');
        foreach ($files as $k => $v) {
            if (substr($k, 0, 2) == "cf" && is_numeric(substr($k, 2)) && $v['error'] == 0) {
                $cf_id = intval(substr($k, 2));
                if (array_key_exists($cf_id, $file_values)) {
                    $file = $file_values[$cf_id];
                    if (!empty($file['data'])) {
                        $data = $file['data'];
                    } else {
                        $fp = fopen($v['tmp_name'], "r");
                        $data = fread($fp, $v['size']);
                        fclose($fp);
                    }
                } else {
                    $file = $v;
                    $fp = fopen($v['tmp_name'], "r");
                    $data = fread($fp, $v['size']);
                    fclose($fp);
                }
                $database->setQuery('SELECT CONCAT(' . $database->quote(JPATH_SITE . $mtconf->get('relative_path_to_attachments')) . ',raw_filename) FROM #__mt_cfvalues_att WHERE link_id = ' . $database->quote($row->link_id) . ' AND cf_id = ' . $database->quote($cf_id));
                $raw_filenames = array_merge($raw_filenames, $database->loadResultArray());
                $database->setQuery('DELETE FROM #__mt_cfvalues_att WHERE link_id = ' . $database->quote($row->link_id) . ' AND cf_id = ' . $database->quote($cf_id));
                $database->query();
                $database->setQuery('DELETE FROM #__mt_cfvalues WHERE cf_id = ' . $database->quote($cf_id) . ' AND link_id = ' . $database->quote($row->link_id) . ' AND attachment > 0');
                $database->query();
                $database->setQuery('INSERT INTO #__mt_cfvalues_att (link_id, cf_id, raw_filename, filename, filesize, extension) ' . ' VALUES(' . $database->quote($row->link_id) . ', ' . $database->quote($cf_id) . ', ' . $database->quote($file['name']) . ', ' . $database->quote($file['name']) . ', ' . $database->quote($file['size']) . ', ' . $database->quote($file['type']) . ')');
                if ($database->query() !== false) {
                    $att_id = $database->insertid();
                    $file_extension = strrchr($file['name'], '.');
                    if ($file_extension === false) {
                        $file_extension = '';
                    }
                    if (JFile::write(JPATH_SITE . $mtconf->get('relative_path_to_attachments') . $att_id . $file_extension, $data)) {
                        $database->setQuery('UPDATE #__mt_cfvalues_att SET raw_filename = ' . $database->quote($att_id . $file_extension) . ' WHERE att_id = ' . $database->quote($att_id) . ' LIMIT 1');
                        $database->query();
                        $sql = 'INSERT INTO #__mt_cfvalues (`cf_id`, `link_id`, `value`, `attachment`) ' . 'VALUES (' . $database->quote($cf_id) . ', ' . $database->quote($row->link_id) . ', ' . $database->quote($file['name']) . ',1)';
                        $database->setQuery($sql);
                        $database->query();
                    } else {
                        // Move failed, remove record from previously INSERTed row in #__mt_cfvalues_att
                        $database->setQuery('DELETE FROM #__mt_cfvalues_att WHERE att_id = ' . $database->quote($att_id) . ' LIMIT 1');
                        $database->query();
                    }
                }
            }
        }
        if (!empty($raw_filenames)) {
            JFile::delete($raw_filenames);
        }
        if ($mtconf->get('allow_imgupload') || !$mtconf->get('allow_imgupload') && $mtconf->get('needapproval_modifylisting')) {
            if ($mtconf->get('allow_imgupload')) {
                $keep_img_ids = JRequest::getVar('keep_img', null, 'post');
                JArrayHelper::toInteger($keep_img_ids, array());
                // If image upload is disabled, it will get the image IDs from database and make sure
                // the images are not lost after approval
            } else {
                $database->setQuery('SELECT img_id FROM #__mt_images WHERE link_id = ' . $database->quote($original_link_id));
                $keep_img_ids = $database->loadResultArray();
            }
            $redirectMsg = '';
            if (is_writable($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image')) && is_writable($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image')) && is_writable($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image'))) {
                // Duplicate listing images for approval
                if (!$isNew && !empty($keep_img_ids) && is_array($keep_img_ids) && $mtconf->get('needapproval_modifylisting')) {
                    foreach ($keep_img_ids as $keep_img_id) {
                        $database->setQuery('SELECT * FROM #__mt_images WHERE link_id = ' . $database->quote($original_link_id) . ' AND img_id = ' . $database->quote($keep_img_id) . ' LIMIT 1');
                        $original_image = $database->loadObject();
                        $file_extension = pathinfo($original_image->filename);
                        $file_extension = strtolower($file_extension['extension']);
                        $database->setQuery('INSERT INTO #__mt_images (link_id,filename,ordering) ' . "\n VALUES ('" . $row->link_id . "', '" . $original_image->filename . '_' . $row->link_id . "', '" . $original_image->ordering . "')");
                        $database->query();
                        $new_img_ids[$keep_img_id] = $database->insertid();
                        $database->setQuery("UPDATE #__mt_images SET filename = '" . $new_img_ids[$keep_img_id] . '_' . $row->link_id . '.' . $file_extension . "' WHERE img_id = '" . $new_img_ids[$keep_img_id] . "' LIMIT 1");
                        $database->query();
                        copy($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $original_image->filename, $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $new_img_ids[$keep_img_id] . '_' . $row->link_id . '.' . $file_extension);
                        copy($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $original_image->filename, $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $new_img_ids[$keep_img_id] . '_' . $row->link_id . '.' . $file_extension);
                        copy($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $original_image->filename, $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $new_img_ids[$keep_img_id] . '_' . $row->link_id . '.' . $file_extension);
                    }
                }
                # Remove all images except those that are kept when modification does not require approval
                $image_filenames = array();
                if (!$mtconf->get('needapproval_modifylisting')) {
                    if (isset($keep_img_ids) && !empty($keep_img_ids)) {
                        $database->setQuery('SELECT filename FROM #__mt_images WHERE link_id = \'' . $row->link_id . '\' AND img_id NOT IN (\'' . implode('\',\'', $keep_img_ids) . '\')');
                        $image_filenames = $database->loadResultArray();
                        $database->setQuery('DELETE FROM #__mt_images WHERE link_id = \'' . $row->link_id . '\' AND img_id NOT IN (\'' . implode('\',\'', $keep_img_ids) . '\')');
                        $database->query();
                    } else {
                        $database->setQuery('SELECT filename FROM #__mt_images WHERE link_id = \'' . $row->link_id . '\'');
                        $image_filenames = $database->loadResultArray();
                        $database->setQuery('DELETE FROM #__mt_images WHERE link_id = \'' . $row->link_id . '\'');
                        $database->query();
                    }
                }
                if (!empty($image_filenames)) {
                    foreach ($image_filenames as $image_filename) {
                        unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $image_filename);
                        unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $image_filename);
                        unlink($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $image_filename);
                    }
                }
                $files_exceed_limit = false;
                if (isset($files['image'])) {
                    for ($i = 0; $i < count($files['image']['name']) && ($i < $mtconf->get('images_per_listing') - count($keep_img_ids) || $mtconf->get('images_per_listing') == '0'); $i++) {
                        if ($mtconf->get('image_maxsize') > 0 && $files['image']['size'][$i] > $mtconf->get('image_maxsize')) {
                            // Uploaded file exceed file limit
                            $files_exceed_limit = true;
                        } elseif (!empty($files['image']['name'][$i]) && $files['image']['error'][$i] == 0 && $files['image']['size'][$i] > 0) {
                            $file_extension = pathinfo($files['image']['name'][$i]);
                            $file_extension = strtolower($file_extension['extension']);
                            $mtImage = new mtImage();
                            $mtImage->setMethod($mtconf->get('resize_method'));
                            $mtImage->setQuality($mtconf->get('resize_quality'));
                            $mtImage->setSize($mtconf->get('resize_listing_size'));
                            $mtImage->setTmpFile($files['image']['tmp_name'][$i]);
                            $mtImage->setType($files['image']['type'][$i]);
                            $mtImage->setName($files['image']['name'][$i]);
                            $mtImage->setSquare($mtconf->get('squared_thumbnail'));
                            $mtImage->resize();
                            $mtImage->setDirectory($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image'));
                            $mtImage->saveToDirectory();
                            $mtImage->setSize($mtconf->get('resize_medium_listing_size'));
                            $mtImage->setSquare(false);
                            $mtImage->resize();
                            $mtImage->setDirectory($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image'));
                            $mtImage->saveToDirectory();
                            move_uploaded_file($files['image']['tmp_name'][$i], $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $files['image']['name'][$i]);
                            $database->setQuery('INSERT INTO #__mt_images (link_id, filename, ordering) ' . ' VALUES(' . $database->quote($row->link_id) . ', ' . $database->quote($files['image']['name'][$i]) . ', \'9999\')');
                            $database->query();
                            $img_id = $database->insertid();
                            rename($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $files['image']['name'][$i], $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_small_image') . $img_id . '.' . $file_extension);
                            rename($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $files['image']['name'][$i], $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_medium_image') . $img_id . '.' . $file_extension);
                            rename($mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $files['image']['name'][$i], $mtconf->getjconf('absolute_path') . $mtconf->get('relative_path_to_listing_original_image') . $img_id . '.' . $file_extension);
                            $database->setQuery('UPDATE #__mt_images SET filename = ' . $database->quote($img_id . '.' . $file_extension) . ' WHERE img_id = ' . $database->quote($img_id));
                            $database->query();
                        }
                    }
                }
                if ($files_exceed_limit) {
                    if ($mtconf->get('image_maxsize') > 1048576) {
                        $image_upload_limit = round($mtconf->get('image_maxsize') / 1048576) . 'MB';
                    } else {
                        $image_upload_limit = round($mtconf->get('image_maxsize') / 1024) . 'KB';
                    }
                    $redirectMsg .= sprintf(JText::_('Image is not saved because it exceeded file size limit'), $image_upload_limit);
                }
                $img_sort_hash = JRequest::getVar('img_sort_hash', null, 'post');
                if (!empty($img_sort_hash)) {
                    $arr_img_sort_hashes = split("[&]*img\\[\\]=\\d*", $img_sort_hash);
                    $i = 1;
                    foreach ($arr_img_sort_hashes as $arr_img_sort_hash) {
                        if (!empty($arr_img_sort_hash) && $arr_img_sort_hash > 0) {
                            $sql = 'UPDATE #__mt_images SET ordering = ' . $database->quote($i) . ' WHERE img_id = ';
                            if (isset($new_img_ids) && !empty($new_img_ids)) {
                                $sql .= $database->quote(intval($new_img_ids[$arr_img_sort_hash]));
                            } else {
                                $sql .= $database->quote(intval($arr_img_sort_hash));
                            }
                            $sql .= ' LIMIT 1';
                            $database->setQuery($sql);
                            $database->query();
                            $i++;
                        }
                    }
                }
                $images = new mtImages($database);
                $images->reorder('link_id=' . $row->link_id);
            } else {
                if (isset($files['image'])) {
                    $redirectMsg .= JText::_('Image directories not writable');
                }
            }
        }
        # Send e-mail notification to user/admin upon adding a new listing
        // Get owner's email
        if ($my->id > 0) {
            $database->setQuery("SELECT email, name, username FROM #__users WHERE id = '" . $my->id . "' LIMIT 1");
            $author = $database->loadObject();
        } else {
            if (!empty($row->email)) {
                $author->email = $row->email;
            } else {
                $author->email = JText::_('Not specified');
            }
            $author->username = JText::_('None');
            $author->name = JText::_('Non registered user');
        }
        $uri =& JURI::getInstance();
        if ($isNew) {
            # To User
            if ($mtconf->get('notifyuser_newlisting') == 1 && ($my->id > 0 || !empty($author->email) && preg_match("/[\\w\\.\\-]+@\\w+[\\w\\.\\-]*?\\.\\w{1,4}/", $author->email) == true)) {
                if ($row->link_approved == 0) {
                    $subject = sprintf(JText::_('New listing email subject waiting approval'), $row->link_name);
                    $msg = JText::_('New listing email msg waiting approval');
                } else {
                    $subject = sprintf(JText::_('New listing email subject approved'), $row->link_name);
                    $msg = sprintf(JText::_('New listing email msg approved'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$row->link_id}&Itemid={$Itemid}"), $mtconf->getjconf('fromname'));
                }
                JUTility::sendMail($mtconf->getjconf('mailfrom'), $mtconf->getjconf('fromname'), $author->email, $subject, wordwrap($msg));
            }
            # To Admin
            if ($mtconf->get('notifyadmin_newlisting') == 1) {
                if ($row->link_approved == 0) {
                    $subject = sprintf(JText::_('New listing email subject waiting approval'), $row->link_name);
                    $msg = sprintf(JText::_('Admin new listing msg waiting approval'), $row->link_name, $row->link_name, $row->link_id, $author->name, $author->username, $author->email);
                } else {
                    $subject = sprintf(JText::_('New listing email subject approved'), $row->link_name);
                    $msg = sprintf(JText::_('Admin new listing msg approved'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$row->link_id}&Itemid={$Itemid}"), $row->link_name, $row->link_id, $author->name, $author->username, $author->email);
                }
                mosMailToAdmin($subject, $msg);
            }
        } elseif ($row->link_published == 1) {
            # To User
            if ($mtconf->get('notifyuser_modifylisting') == 1 && $my->id > 0) {
                if ($row->link_approved < 0) {
                    $subject = sprintf(JText::_('Modify listing email subject waiting approval'), $row->link_name);
                    $msg = sprintf(JText::_('Modify listing email msg waiting approval'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$old->link_id}&Itemid={$Itemid}"));
                } else {
                    $subject = sprintf(JText::_('Modify listing email subject approved'), $row->link_name);
                    $msg = sprintf(JText::_('Modify listing email msg approved'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$old->link_id}&Itemid={$Itemid}"), $mtconf->getjconf('fromname'));
                }
                JUTility::sendMail($mtconf->getjconf('mailfrom'), $mtconf->getjconf('fromname'), $author->email, $subject, wordwrap($msg));
            }
            # To Admin
            if ($mtconf->get('notifyadmin_modifylisting') == 1) {
                $diff_desc = diff_main($original->link_desc, $row->link_desc, true);
                diff_cleanup_semantic($diff_desc);
                $diff_desc = diff_prettyhtml($diff_desc);
                $msg = "<style type=\"text/css\">\n";
                $msg .= "ins{text-decoration:underline}\n";
                $msg .= "del{text-decoration:line-through}\n";
                $msg .= "</style>";
                if ($row->link_approved < 0) {
                    $subject = sprintf(JText::_('Modify listing email subject waiting approval'), $row->link_name);
                    $msg .= nl2br(sprintf(JText::_('Admin modify listing msg waiting approval'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$old->link_id}&Itemid={$Itemid}"), $row->link_name, $row->link_id, $author->name, $author->username, $author->email, $diff_desc));
                } else {
                    $subject = sprintf(JText::_('Modify listing email subject approved'), $row->link_name);
                    $msg .= nl2br(sprintf(JText::_('Admin modify listing msg approved'), $row->link_name, $uri->toString(array('scheme', 'host', 'port')) . JRoute::_("index.php?option=com_mtree&task=viewlink&link_id={$old->link_id}&Itemid={$Itemid}"), $row->link_name, $row->link_id, $author->name, $author->username, $author->email, $diff_desc));
                }
                mosMailToAdmin($subject, $msg, 1);
            }
        }
        // Fire mosetstree onAfterModifyListing plugin
        $dispatcher =& JDispatcher::getInstance();
        JPluginHelper::importPlugin('mosetstree');
        $dispatcher->trigger('onAfterModifyListing', array((array) $original, $original_cfs, (array) $row, $active_cfs, $old->link_id, $cat_id));
        if (isset($original) && $original->link_published && $original->link_approved) {
            if ($isNew && $mtconf->get('needapproval_addlisting')) {
                $redirect_url = "index.php?option={$option}&task=listcats&cat_id={$cat_id}&Itemid={$Itemid}";
            } elseif (!$isNew && $mtconf->get('needapproval_modifylisting')) {
                $redirect_url = "index.php?option={$option}&task=viewlink&link_id={$old->link_id}&Itemid={$Itemid}";
            } else {
                $redirect_url = "index.php?option={$option}&task=viewlink&link_id={$row->link_id}&Itemid={$Itemid}";
            }
        } else {
            $redirect_url = "index.php?option={$option}&task=mypage&Itemid={$Itemid}";
        }
        $mainframe->redirect(JRoute::_($redirect_url), ($isNew ? $mtconf->get('needapproval_addlisting') ? JText::_('Listing will be reviewed') : JText::_('Listing have been added') : ($mtconf->get('needapproval_modifylisting') ? JText::_('Listing modification will be reviewed') : JText::_('Listing have been updated'))) . (!empty($redirectMsg) ? '<br /> ' . $redirectMsg : ''));
    }
}
예제 #2
0
function diff_main($text1, $text2, $checklines = true)
{
    // Find the differences between two texts.  Return an array of changes.
    // If checklines is present and false, then don't run a line-level diff first to identify the changed areas.
    // Check for equality (speedup)
    if ($text1 == $text2) {
        return array(array(DIFF_EQUAL, $text1));
    }
    if (!isset($checklines)) {
        $checklines = true;
    }
    // Trim off common prefix (speedup)
    $a = diff_prefix($text1, $text2);
    $text1 = $a[0];
    $text2 = $a[1];
    $commonprefix = $a[2];
    // Trim off common suffix (speedup)
    $a = diff_suffix($text1, $text2);
    $text1 = $a[0];
    $text2 = $a[1];
    $commonsuffix = $a[2];
    $longtext = strlen($text1) > strlen($text2) ? $text1 : $text2;
    $shorttext = strlen($text1) > strlen($text2) ? $text2 : $text1;
    if (!$text1) {
        // Just add some text (speedup)
        $diff = array(array(DIFF_INSERT, $text2));
    } else {
        if (!$text2) {
            // Just delete some text (speedup)
            $diff = array(array(DIFF_DELETE, $text1));
        } else {
            if (($i = strpos($longtext, $shorttext)) != false) {
                // Shorter text is inside the longer text (speedup)
                $diff = array(array(DIFF_INSERT, substr($longtext, 0, $i)), array(DIFF_EQUAL, $shorttext), array(DIFF_INSERT, substr($longtext, $i + strlen($shorttext))));
                // Swap insertions for deletions if diff is reversed.
                if (strlen($text1) > strlen($text2)) {
                    $diff[0][0] = DIFF_DELETE;
                    $diff[2][0] = DIFF_DELETE;
                }
            } else {
                $longtext = null;
                $shorttext = null;
                // Garbage collect
                // Check to see if the problem can be split in two.
                $hm = diff_halfmatch($text1, $text2);
                if ($hm) {
                    // A half-match was found, sort out the return data.
                    $text1_a = $hm[0];
                    $text1_b = $hm[1];
                    $text2_a = $hm[2];
                    $text2_b = $hm[3];
                    $mid_common = $hm[4];
                    // Send both pairs off for separate processing.
                    $diff_a = diff_main($text1_a, $text2_a, $checklines);
                    $diff_b = diff_main($text1_b, $text2_b, $checklines);
                    // Merge the results.
                    $diff = array_merge($diff_a, array(array(DIFF_EQUAL, $mid_common)), $diff_b);
                } else {
                    // Perform a real diff.
                    if ($checklines && strlen($text1) + strlen($text2) < 250) {
                        $checklines = false;
                    }
                    // Too trivial for the overhead.
                    if ($checklines) {
                        // Scan the text on a line-by-line basis first.
                        $a = diff_lines2chars($text1, $text2);
                        $text1 = $a[0];
                        $text2 = $a[1];
                        $linearray = $a[2];
                    }
                    $diff = diff_map($text1, $text2);
                    if (!$diff) {
                        // No acceptable result.
                        $diff = array(array(DIFF_DELETE, $text1), array(DIFF_INSERT, $text2));
                    }
                    if ($checklines) {
                        diff_chars2lines($diff, $linearray);
                        // Convert the diff back to original text.
                        diff_cleanup_semantic($diff);
                        // Eliminate freak matches (e.g. blank lines)
                        // Rediff any replacement blocks, this time on character-by-character basis.
                        array_push($diff, array(DIFF_EQUAL, ''));
                        // Add a dummy entry at the end.
                        $pointer = 0;
                        $count_delete = 0;
                        $count_insert = 0;
                        $text_delete = '';
                        $text_insert = '';
                        while ($pointer < count($diff)) {
                            if ($diff[$pointer][0] == DIFF_INSERT) {
                                $count_insert++;
                                $text_insert .= $diff[$pointer][1];
                            } else {
                                if ($diff[$pointer][0] == DIFF_DELETE) {
                                    $count_delete++;
                                    $text_delete .= $diff[$pointer][1];
                                } else {
                                    // Upon reaching an equality, check for prior redundancies.
                                    if ($count_delete >= 1 && $count_insert >= 1) {
                                        // Delete the offending records and add the merged ones.
                                        $a = diff_main($text_delete, $text_insert, false);
                                        array_splice($diff, $pointer - $count_delete - $count_insert, $count_delete + $count_insert);
                                        $pointer = $pointer - $count_delete - $count_insert;
                                        for ($i = count($a) - 1; $i >= 0; $i--) {
                                            array_splice($diff, $pointer, 0, array($a[$i]));
                                        }
                                        $pointer = $pointer + count($a);
                                    }
                                    $count_insert = 0;
                                    $count_delete = 0;
                                    $text_delete = '';
                                    $text_insert = '';
                                }
                            }
                            $pointer++;
                        }
                        array_pop($diff);
                        // Remove the dummy entry at the end.
                    }
                }
            }
        }
    }
    if ($commonprefix) {
        array_unshift($diff, array(DIFF_EQUAL, $commonprefix));
    }
    if ($commonsuffix) {
        array_push($diff, array(DIFF_EQUAL, $commonsuffix));
    }
    diff_cleanup_merge($diff);
    return $diff;
}