Файл: adultscript-2.0.3-pro/files/admin/modules/tools/components/synonyms.php
Строк: 203
<?php
defined('_VALID') or die('Restricted Accesss!');
set_time_limit(0);
class VComponent_Admin_tools_synonyms
{
private $db;
public function __construct()
{
$this->db = VF::factory('database');
}
public function render()
{
$errors = array();
$messages = array();
$warnings = array();
$filter = VF::factory('filter');
$import = array('url' => '', 'method' => 'url', 'separator' => ',');
if (isset($_POST['submit_import'])) {
$url = trim($_POST['url']);
$method = $filter->get('method');
$separator = $filter->get('separator');
if ($method == 'file') {
if (isset($_FILES['file']) && $_FILES['file']['tmp_name']) {
$file = $_FILES['file']['tmp_name'];
} else {
$errors[] = 'Please select synonyms a file to upload!';
}
} elseif ($method == 'url') {
if ($url == '') {
$errors[] = 'Please enter the URL for your synonyms file!';
} elseif (!VValid::url($url)) {
$errors[] = 'Synonyms File URL is not a valid URL address!';
} else {
$file = TMP_DIR.'/downloads/'.VText::random();
if (!VCurl::file($url, $file)) {
$errors[] = 'Failed to download file!';
}
}
} else {
$errors[] = 'Invalid import method specified!';
}
if (!$errors) {
$contents = file($file);
$total = 0;
$already = 0;
$added = 0;
$failed = 0;
foreach ($contents as $line) {
$line = trim($line);
$processed = array();
$synonyms = $this->get_synonyms($line, $separator);
$words = explode($separator, $synonyms);
foreach ($words as $word) {
$word = trim($word);
if (!$word) {
continue;
}
if ($word_id = $this->get_word_id($word)) {
++$already;
$processed[$word] = $word_id;
} elseif ($word_id = $this->add_word($word)) {
++$added;
$processed[$word] = $word_id;
} else {
++$failed;
}
++$total;
foreach ($processed as $word => $word_id) {
foreach ($processed as $synonym => $synonym_id) {
$this->add_synonym($word_id, $synonym_id);
}
}
}
}
VF::cache_del('words', 'config');
$messages[] = 'Processed '.$total.' words! '.$already.' were already in the database, '.$added.' were added and '.$failed.' failed!';
}
}
$synonyms = '';
if (isset($_POST['submit_add'])) {
$synonyms = $filter->get('synonyms');
if ($synonyms == '') {
$errors[] = 'Please enter a comma separated list of words (all synonyms)!';
} elseif (strpos($synonyms, ',') === false) {
$errors[] = 'Please enter at least two words!';
} else {
// we make sure we have a complete list of available synonyms
$synonyms = $this->get_synonyms($synonyms);
}
if (!$errors) {
$words = explode(',', $synonyms);
$processed = array();
$added = array();
$already = array();
$failed = array();
foreach ($words as $word) {
$word = trim($word);
if (!$word) {
continue;
}
if ($word_id = $this->get_word_id($word)) {
$already[$word] = 1;
$processed[$word] = $word_id;
} else if ($word_id = $this->add_word($word)) {
$added[$word] = 1;
$processed[$word] = $word_id;
} else {
$failed[$word] = 1;
}
}
foreach ($processed as $word => $word_id) {
foreach ($processed as $synonym => $synonym_id) {
$this->add_synonym($word_id, $synonym_id);
}
}
$message = 'Processed total '.count($processed).' words.';
if ($added) {
$message .= ' Added: '.implode(', ', array_keys($added)).'.';
}
if ($already) {
$warnings[] = 'Already added: '.implode(', ', array_keys($already)).'!';
}
VF::cache_del('words', 'config');
$messages[] = $message;
$synonyms = '';
}
}
if (isset($_POST['word_id']) && isset($_POST['action'])) {
$action = trim($_POST['action']);
$word_id = (int) trim($_POST['word_id']);
if ($action == 'delete') {
$this->db->query("DELETE FROM #__words WHERE word_id = ".$word_id." LIMIT 1");
VF::cache_del('words', 'config');
$messages[] = 'Word deleted!';
} else {
$errors[] = 'Invalid action!';
}
}
if (isset($_POST['submit_actions'])) {
$action = trim($_POST['action']);
$ids = (isset($_POST['checked'])) ? (array) $_POST['checked'] : array();
if ($ids) {
if ($action == 'delete') {
$this->db->query("DELETE FROM #__words WHERE word_id IN (".implode(',', array_keys($ids)).")");
VF::cache_del('words', 'config');
$messages[] = 'Selected words deleted!';
} else {
$errors[] = 'Invalid action!';
}
} else {
$errors[] = 'Please select at least one word!';
}
}
$page = (isset($_GET['page'])) ? (int) $_GET['page'] : 1;
$query = (isset($_GET['s'])) ? $filter->get('s', 'STRING', 'GET') : false;
$type = (isset($_GET['t'])) ? trim($_GET['t']) : 'start';
$order = (isset($_GET['o'])) ? $filter->get('o', 'STRING', 'GET') : 'ASC';
$display = (isset($_GET['d'])) ? (int) trim($_GET['d']) : 50;
$where = '';
if ($query) {
$where = ($type == 'fixed')
? " WHERE w.word = '".$this->db->escape($query)."' "
: " WHERE w.word LIKE '".$this->db->escape($query)."%' ";
}
$sql = "SELECT COUNT(*) AS total_words
FROM #__words AS w".$where;
$total_words = $this->db->get_field($sql, 'total_words');
$pagination = VPagination::get($page, $total_words, $display);
$sql = "SELECT w.word_id, w.word, GROUP_CONCAT(ws.word) AS synonyms
FROM #__words AS w
LEFT JOIN #__synonyms AS s ON (s.word_id = w.word_id AND s.synonym_id != w.word_id)
LEFT JOIN #__words AS ws ON (ws.word_id = s.synonym_id)".$where."
GROUP BY w.word_id
ORDER BY w.word_id DESC
LIMIT ".$pagination['limit'];
$tpl = VF::factory('template');
$tpl->menu = 'main';
$tpl->submenu = 'tools';
$tpl->meta_title = 'Tools::Synonyms Database';
$tpl->errors = $errors;
$tpl->messages = $messages;
$tpl->warnings = $warnings;
$tpl->import = $import;
$tpl->query = $query;
$tpl->type = $type;
$tpl->order = $order;
$tpl->display = $display;
$tpl->synonyms = $synonyms;
$tpl->words = $this->db->get_rows($sql);
$tpl->pagination = $pagination;
$tpl->load(array('header', 'tools_synonyms', 'footer'));
$tpl->display();
}
private function get_word_id($word)
{
$this->db->query("SELECT word_id
FROM #__words
WHERE word = '".$this->db->escape($word)."'
LIMIT 1");
if ($this->db->affected_rows()) {
return $this->db->fetch_field('word_id');
}
return false;
}
private function add_word($word)
{
$this->db->query("INSERT INTO #__words
SET word = '".$this->db->escape($word)."'");
if ($this->db->affected_rows()) {
return $this->db->get_last_insert_id('#__words');
}
return false;
}
private function synonym_exists($word_id, $synonym_id)
{
$this->db->query("SELECT word_id
FROM #__synonyms
WHERE word_id = ".$word_id."
AND synonym_id = ".$synonym_id."
LIMIT 1");
return $this->db->affected_rows();
}
private function add_synonym($word_id, $synonym_id)
{
if (!$this->synonym_exists($word_id, $synonym_id)) {
$this->db->query("INSERT INTO #__synonyms (word_id, synonym_id)
VALUES (".$word_id.", ".$synonym_id.")
ON DUPLICATE KEY UPDATE word_id = word_id");
}
}
private function get_synonyms($words, $separator = ',')
{
$words = explode($separator, $words);
$all = array();
$in = array();
foreach ($words as $word) {
$word = trim($word);
$all[$word] = 1;
$in[] = "'".$this->db->escape(trim($word))."'";
}
$this->db->query("SELECT word_id FROM #__words WHERE word IN (".implode(',', $in).")");
if (!$this->db->affected_rows()) {
return implode($separator, array_keys($all));
}
$ids = array();
$rows = $this->db->fetch_rows();
foreach ($rows as $row) {
$ids[] = $row['word_id'];
}
$this->db->query("
SELECT s.synonym_id, w.word
FROM #__synonyms AS s
LEFT JOIN #__words AS w ON (w.word_id = s.synonym_id)
WHERE s.word_id IN (".implode(',', array_values($ids)).")
GROUP BY s.synonym_id"
);
if (!$this->db->affected_rows()) {
return implode($separator, array_keys($all));
}
foreach ($this->db->fetch_rows() as $row) {
$word = $row['word'];
if (!isset($all[$word])) {
$all[$word] = 1;
}
}
return implode($separator, array_keys($all));
}
}