Добрый вечер, Гость! Представляем Вам наши форумы. Вы можете зарегистрироваться чтобы писать на форумах или зайдите под своим именем, если Вы уже регистрировались.
   
   


Форум
 CMS Status-X | Основная тема
         Планировщик заданий (SyncImport)

Похожие темы  |  Печать страницы

Планировщик заданий (SyncImport)


События Четверг, 27.06.2013, 19:24

IKZOKZ

Группа: Пользователь
Ранг: Продвинутый
Cообщений: 115
Регистрация: 16.04.2010
Город: IKZOKZ
Подскажите, как решить.

Нужно посредством планировщика задания каждые пару часов копировать/обновлять определенные поля таблиц.

Из «shop_produkte» в «shop_produkte_2»

В «Class.Cron.php» дописал
PHP-код
case 'sysyes'
                    
Core::getUpdateTableY('shop_produkte_2');
                    
self::update($val$time);
                    break;

В «Class.Core.php» дописал
PHP-код
/**
     * Обновленние товаров 
     */
    
public static function getUpdateTableY($table) {
        
        
$sql DB::getDB()->Query("SELECT * FROM " PREFIX "_shop_produkte");
        while (
$row $sql->Result_Fetch_Object()) {
        if (!empty(
$table)) {
            
DB::getDB()->Query("UPDATE " PREFIX "_" $table " SET 
            Artikelnummer = '" 
s($row->Artikelnummer) . "',
            Titel_1 = '" 
s($row->Titel_1) . "',
            Titel_2 = '" 
s($row->Titel_2) . "',
            Erstellt = '" 
s($row->Erstellt) . "',
            Bild = '" 
s($row->Bild) . "',
            Bilder = '" 
s($row->Bilder) . "',
            EAN_Nr = '" 
s($row->EAN_Nr) . "',
            ISBN_Nr = '" 
s($row->ISBN_Nr) . "',            
            Beschreibung_1 = '" 
s($row->Beschreibung_1) . "',
            Beschreibung_2 = '" 
s($row->Beschreibung_2) . "',
            Beschreibung_lang_1 = '" 
s($row->Beschreibung_lang_1) . "',
            Beschreibung_lang_2 = '" 
s($row->Beschreibung_lang_2) . "',
            Aktiv = '" 
s($row->Aktiv) . "',
            Preis_Liste_Ab = '" 
s($row->Preis_Liste_Ab) . "',
            Preis_Liste_Gueltig = '" 
s($row->Preis_Liste_Gueltig) . "',
            Preis_Liste = '" 
s($row->Preis_Liste) . "',
            Preis = '" 
s($row->Preis) . "',
            Preis_EK = '" 
s($row->Preis_EK) . "',
            Hersteller = '" 
s($row->Hersteller) . "',
            Kategorie = '" 
s($row->Kategorie) . "',
            Kategorie_Multi = '" 
s($row->Kategorie_Multi) . "',
            Gewicht = '" 
s($row->Gewicht) . "',
            Gewicht_Ohne = '" 
s($row->Gewicht_Ohne) . "',
            Schlagwoerter = '" 
s($row->Schlagwoerter) . "',
            Lagerbestand = '" 
s($row->Lagerbestand) . "',
            MaxBestellung = '" 
s($row->MaxBestellung) . "',
            Startseite = '" 
s($row->Startseite) . "',            
            Position = '" 
s($row->Position) . "',
            Spez_1 = '',
            Spez_2 = '',
            Spez_3 = '',
            Spez_4 = '',
            Spez_5 = '',
            Spez_6 = '',
            Spez_7 = '',
            Spez_8 = '',
            Spez_9 = '',
            Spez_10 = '',
            Spez_11 = '',
            Spez_12 = '',
            Spez_13 = '',
            Spez_14 = '',
            Spez_15 = '',
            Spez_2_2 = '',
            Spez_3_2 = '',
            Spez_4_2 = '',
            Spez_5_2 = '',
            Spez_6_2 = '',
            Spez_7_2 = '',
            Spez_8_2 = '',
            Spez_9_2 = '',
            Spez_10_2 = '',
            Spez_11_2 = '',
            Spez_12_2 = '',
            Spez_13_2 = '',
            Spez_14_2 = '',
            Spez_15_2 = ''
            
            
            WHERE Id = '" 
$row->Id "'");
            
        }
        }
        
$sql->Result_Close();
}

Может быть кого-то рассмешит мой код )
Всё же буду благодарен за подсказку


Пользователь офлайн
События Четверг, 27.06.2013, 20:54

Status-X

Группа: Администратор
Cообщений: 3005
Регистрация: 23.10.2009
Город: Санкт-Петербург
Для добавления своих заданий, можно и не трогать класс крон, вроде писал об этом на форуме, но не помню где. Ща разберем, тока найду заготовку


Пользователь офлайн
События Четверг, 27.06.2013, 21:26

Status-X

Группа: Администратор
Cообщений: 3005
Регистрация: 23.10.2009
Город: Санкт-Петербург
Итак как сделать собственное запускаемое по расписанию задание. Разбираем задачу ТС, главное принцип понять, все просто:)

Итак идем в админку и создаем новое задание. Все поля заполняем по логике, поле модуль - выбираем функция.
Вписываем в поле функция SyncImport::update, в поле параметры функции - вписываем имя таблицы (этот параметр будет в переменной $table, метода update)
Далее создаем новый класс
PHP-код
<?php
if (!defined('STATUS_DIR')) exit('Доступ запрещен');

class 
SyncImport {

    public static function 
update($table) {
        
$allow = array('table1''table2''table3'); // Проверять разрешенные таблицы
    
        
if (!empty($table) && in_array($table$allow)) {
            
$sql DB::getDB()->Query("SELECT * FROM " PREFIX "_shop_produkte");
            while (
$row $sql->Result_Fetch_Object()) {
                
DB::getDB()->Query("UPDATE " PREFIX "_" $table " SET  
                    Artikelnummer = '" 
s($row->Artikelnummer) . "', 
                    Titel_1 = '" 
s($row->Titel_1) . "', 
                    Titel_2 = '" 
s($row->Titel_2) . "', 
                    Erstellt = '" 
s($row->Erstellt) . "', 
                    Bild = '" 
s($row->Bild) . "', 
                    Bilder = '" 
s($row->Bilder) . "', 
                    EAN_Nr = '" 
s($row->EAN_Nr) . "', 
                    ISBN_Nr = '" 
s($row->ISBN_Nr) . "',             
                    Beschreibung_1 = '" 
s($row->Beschreibung_1) . "', 
                    Beschreibung_2 = '" 
s($row->Beschreibung_2) . "', 
                    Beschreibung_lang_1 = '" 
s($row->Beschreibung_lang_1) . "', 
                    Beschreibung_lang_2 = '" 
s($row->Beschreibung_lang_2) . "', 
                    Aktiv = '" 
s($row->Aktiv) . "', 
                    Preis_Liste_Ab = '" 
s($row->Preis_Liste_Ab) . "', 
                    Preis_Liste_Gueltig = '" 
s($row->Preis_Liste_Gueltig) . "', 
                    Preis_Liste = '" 
s($row->Preis_Liste) . "', 
                    Preis = '" 
s($row->Preis) . "', 
                    Preis_EK = '" 
s($row->Preis_EK) . "', 
                    Hersteller = '" 
s($row->Hersteller) . "', 
                    Kategorie = '" 
s($row->Kategorie) . "', 
                    Kategorie_Multi = '" 
s($row->Kategorie_Multi) . "', 
                    Gewicht = '" 
s($row->Gewicht) . "', 
                    Gewicht_Ohne = '" 
s($row->Gewicht_Ohne) . "', 
                    Schlagwoerter = '" 
s($row->Schlagwoerter) . "', 
                    Lagerbestand = '" 
s($row->Lagerbestand) . "', 
                    MaxBestellung = '" 
s($row->MaxBestellung) . "', 
                    Startseite = '" 
s($row->Startseite) . "',             
                    Position = '" 
s($row->Position) . "', 
                    Spez_1 = '', 
                    Spez_2 = '', 
                    Spez_3 = '', 
                    Spez_4 = '', 
                    Spez_5 = '', 
                    Spez_6 = '', 
                    Spez_7 = '', 
                    Spez_8 = '', 
                    Spez_9 = '', 
                    Spez_10 = '', 
                    Spez_11 = '', 
                    Spez_12 = '', 
                    Spez_13 = '', 
                    Spez_14 = '', 
                    Spez_15 = '', 
                    Spez_2_2 = '', 
                    Spez_3_2 = '', 
                    Spez_4_2 = '', 
                    Spez_5_2 = '', 
                    Spez_6_2 = '', 
                    Spez_7_2 = '', 
                    Spez_8_2 = '', 
                    Spez_9_2 = '', 
                    Spez_10_2 = '', 
                    Spez_11_2 = '', 
                    Spez_12_2 = '', 
                    Spez_13_2 = '', 
                    Spez_14_2 = '', 
                    Spez_15_2 = '' 
                    WHERE Id = '" 
$row->Id "'");
            }
            
$sql->Result_Close();
        }
    }
}
?>


И кидаем в папку класс с именем class.SyncImport.php и все класс будет запускаться по расписанию и будет выполнять метод update.

Можно собрать в один класс все нужные задания и различать их только названиями методов в поле вызова функции SyncImport::update2, SyncImport::update3 и тд.

Не забываем что это статическая функция в классе и следовательно нельзя применять $this->,
Что бы это обойти используем такой фокус

PHP-код
    static public function update() {
        new 
self;
    }

    private function 
__construct() {
        
// а здесь уже можно использовать $this->
    
}



Пользователь офлайн
События Воскресенье, 30.06.2013, 15:51

IKZOKZ

Автор текущей темы
Группа: Пользователь
Ранг: Продвинутый
Cообщений: 115
Регистрация: 16.04.2010
Город: IKZOKZ
Спасибо за подержку! Все отлично работает!

Еще, чтобы новые добавлялись сделал так
PHP-код
<?php
if (!defined('STATUS_DIR')) exit('Доступ запрещен');

class 
SyncImport {

    public static function 
update($table) {
        
$allow = array('shop_produkte_2''shop_produkte_4''shop_produkte_5'); // Проверять разрешенные таблицы
    
        
if (!empty($table) && in_array($table$allow)) {
            
$sql DB::getDB()->Query("SELECT * FROM " PREFIX "_shop_produkte");
            while (
$row $sql->Result_Fetch_Object()) {
                
DB::getDB()->Query("INSERT INTO " PREFIX "_" $table " SET
                    Id = '" 
s($row->Id) . "', 
                    Artikelnummer = '" 
s($row->Artikelnummer) . "', 
                    Titel_1 = '" 
s($row->Titel_1) . "', 
                    Titel_2 = '" 
s($row->Titel_2) . "', 
                    Erstellt = '" 
s($row->Erstellt) . "', 
                    Bild = '" 
s($row->Bild) . "', 
                    Bilder = '" 
s($row->Bilder) . "', 
                    EAN_Nr = '" 
s($row->EAN_Nr) . "', 
                    ISBN_Nr = '" 
s($row->ISBN_Nr) . "',                     
                    Beschreibung_1 = '" 
s($row->Beschreibung_1) . "', 
                    Beschreibung_2 = '" 
s($row->Beschreibung_2) . "', 
                    Aktiv = '" 
s($row->Aktiv) . "', 
                    Preis_Liste_Ab = '" 
s($row->Preis_Liste_Ab) . "', 
                    Preis_Liste_Gueltig = '" 
s($row->Preis_Liste_Gueltig) . "', 
                    Preis_Liste = '" 
s($row->Preis_Liste) . "', 
                    Preis = '" 
s($row->Preis) . "'
            ON DUPLICATE KEY UPDATE
                    Id = '" 
$row->Id "',
            Artikelnummer = '" 
s($row->Artikelnummer) . "', 
                    Titel_1 = '" 
s($row->Titel_1) . "', 
                    Titel_2 = '" 
s($row->Titel_2) . "', 
                    Erstellt = '" 
s($row->Erstellt) . "', 
                    Bild = '" 
s($row->Bild) . "', 
                    Bilder = '" 
s($row->Bilder) . "', 
                    EAN_Nr = '" 
s($row->EAN_Nr) . "', 
                    ISBN_Nr = '" 
s($row->ISBN_Nr) . "',                     
                    Beschreibung_1 = '" 
s($row->Beschreibung_1) . "', 
                    Beschreibung_2 = '" 
s($row->Beschreibung_2) . "', 
                    Aktiv = '" 
s($row->Aktiv) . "', 
                    Preis_Liste_Ab = '" 
s($row->Preis_Liste_Ab) . "', 
                    Preis_Liste_Gueltig = '" 
s($row->Preis_Liste_Gueltig) . "', 
                    Preis_Liste = '" 
s($row->Preis_Liste) . "', 
                    Preis = '" 
s($row->Preis) . "'
                   
                    "
);
            }
            
$sql->Result_Close();
        }
    }
}
?>


Теперь столкнулся с новой задачей. Талица "shop_produkte" находится в другой базе на том же хосте.
Возможно заставить
Код
$sql = DB::getDB()->Query("SELECT * FROM " . PREFIX . "_shop_produkte");

считать с одной базы и записывать в другую "_shop_produkte_2"

типа такого
Код
$db2 = mysql_connect('адрес_сервера2', 'пользователь2', 'пароль2') or die (mysql_error());
mysql_select_db('имя_базы_данных2',$db2) or die (mysql_error())

Код
$q2 = mysql_query("SELECT * FROM `table`",$db2);


Отредактировано IKZOKZ: 01.07.2013, 02:20:37
Пользователь офлайн
События Понедельник, 01.07.2013, 11:28

Status-X

Группа: Администратор
Cообщений: 3005
Регистрация: 23.10.2009
Город: Санкт-Петербург
Первая версия не умеет работать одновременно с несколькими базами, поэтому силами класса не получится реализовать, но с помощью стандартных функций реализовать можно


Пользователь офлайн
События Понедельник, 01.07.2013, 11:49

IKZOKZ

Автор текущей темы
Группа: Пользователь
Ранг: Продвинутый
Cообщений: 115
Регистрация: 16.04.2010
Город: IKZOKZ
Цитата
Автор: Status-X
Первая версия не умеет работать одновременно с несколькими базами, поэтому силами класса не получится реализовать, но с помощью стандартных функций реализовать можно


Значит, в том же классе бесполезно писать!?
«с помощью стандартных функций» это, в каких файлах?
А если продублировать в «db.config.php» $config['dbhost'] на $config['dbhost2'] итп в «Class.DB.php» подобно.
Такое получится?
Пользователь офлайн
События Понедельник, 01.07.2013, 12:17

Status-X

Группа: Администратор
Cообщений: 3005
Регистрация: 23.10.2009
Город: Санкт-Петербург
Оказывается наврал, делал я метод в 1.04 для работы с любым количеством баз, был видать в каком то заказе.
Для ранних версий смотреть наличие метода getADB в классе с базой, подправить его так
PHP-код
    /**
     * Функция для использования альтернативных баз
     */
    
public static function getADB($config NULL) {
        static 
$instance;
        if (empty(
$config)) return self::getDB();
        
$name $config['dbname'] . $config['dbprefix'];
        if (!isset(
$instance[$name])) $instance[$name] = new self($config);
        return 
$instance[$name];
    }


Подключение выполняется так

PHP-код
$config = array('dbhost' => 'адрес подключения','dbuser' => 'пользователь','dbname' => 'название базы','dbpass' => 'пароль','dbprefix' => 'префикс базы');
$db2 DB::getADB($config);


В $db2 будет находится ссылка на экземпляр класса другой базы.

Пример запроса

PHP-код
$sql $db2->Query("SELECT * FROM " $db2->Prefix() . "_shop_produkte2");

Константу PREFIX использовать нельзя, так как в ней хранится префикс первого подключения, поэтому используем метод $db2->Prefix()


Пользователь офлайн
События Понедельник, 01.07.2013, 12:22

Status-X

Группа: Администратор
Cообщений: 3005
Регистрация: 23.10.2009
Город: Санкт-Петербург
Функцию s() так же нельзя использовать при работе с другой базой, вместо нее иследует использовать оригинальный метод $db2->Escape()


Благодарности IKZOKZ
Пользователь офлайн


Похожие темы  |  Печать страницы  |   Предыдущая тема  |   Следующая тема

Быстрый переход:  
 

 Сейчас на сайте


Пользователей: 0, Гостей: 5

Поисковые боты: 12
Googlebot(5), Inktomi Slurp, BingBot(3), Unknown Bot, oBot(2)

 Статистика форума


  Темы Сообщения Пользователи
За сутки:
За неделю:
За месяц:
Всего:
Мы приветствуем нового участника: Lesya

 Дни рождения


kostia.vinnychuk (34)
Печать | Copyright © 2009 - 2016 Status-X All rights reserved | Powered by CMS Status-X 1.05 | Контакты