Перейти к содержанию
sergeantpepper

[Решено] Вызов функции модели или контроллера из файла cron.php

Рекомендуемые сообщения

Добрый день!

 

В корне сайта есть файл cron.php с кодом:

<?php

    error_reporting (E_ALL);
    
    // Version
    define('VERSION', '1.5.5.1.2');
    
    // Configuration
    if (file_exists('config.php')) {
        require_once('config.php');
    }
    
    // VirtualQMOD
    require_once('./vqmod/vqmod.php');
    VQMod::bootup();
    
    // VQMODDED Startup
    require_once(VQMod::modCheck(DIR_SYSTEM . 'startup.php'));
    
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/customer.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/affiliate.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/currency.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/tax.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/weight.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/length.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/cart.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/ocstore.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/proudly_define.php'));
    require_once(VQMod::modCheck(DIR_SYSTEM . 'library/proudly_common.php'));
    
    // Registry
    $registry = new Registry();
    
    // Loader
    $loader = new Loader($registry);
    $registry->set('load', $loader);
    
    // Config
    $config = new Config();
    $registry->set('config', $config);
    
    // Database
    $db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
    $registry->set('db', $db);
    
    // currency
    $currency = new cbCurrency();
    $dollar = $currency->GetDollarRubCourse();
    $euro = $currency->GetEuroRubCourse();
    if($dollar) $db->query('UPDATE ' . DB_PREFIX .'product SET price=price_dollar*'.$dollar.' WHERE price_dollar<>0');
    if($euro) $db->query('UPDATE ' . DB_PREFIX .'product SET price=price_euro*'.$euro.' WHERE price_euro<>0');  
 
?>

В конце кода необходимо запустить функцию модели (или контроллера). Пытался гуглить это, но тщетно.

В контроллере я бы это сделал так:
$this->load->model('catalog/category');

$this->model_catalog_category->syncAllCategoriesManufacturers();

 

Не знаю от имени чего запускать :oops:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


//Вроде так.

$loader->model('catalog/category');

$model_catalog_category = $regisry->get('model_catalog_category');

$model_catalog_category->syncAllCategoriesManufacturers();

// $this -> Это если из контроллера вызываем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
//Вроде так.
$loader->model('catalog/category');
$model_catalog_category = $regisry->get('model_catalog_category');
$model_catalog_category->syncAllCategoriesManufacturers();

// $this -> Это если из контроллера вызываем.

halfhope, спасибо помогло!

Только в коде неб опечатка в registry. Вот поправленный рабочий код:

$loader->model('catalog/category');
$model_catalog_category = $registry->get('model_catalog_category');
$model_catalog_category->syncAllCategoriesManufacturers();

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
//Вроде так.
$loader->model('catalog/category');
$model_catalog_category = $regisry->get('model_catalog_category');
$model_catalog_category->syncAllCategoriesManufacturers();

// $this -> Это если из контроллера вызываем.

 

halfhope, подскажите, пожалуйста, вы привели код, который запускает функцию модели. Не могли бы помочь с подобной ситуацией — необходимо запустить функцию контроллера. Речь правда идет о функции index().

Для примера необходимо подключить этот котроллер: feed -> yandex_market

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


$action = new Action('feed/yandex_market');

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

$action = new Action('feed/yandex_market');

 

Как при этом вызвать функцию index()?

 

halfhope, большое спасибо за статьи! Долго искал нечто похожее для знакомства с движком.

Только здесь http://halfhope.ru/2015/02/09/полезный-код-для-разработчиков-opencart-2/ не работает якорная навигация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Смотрите index.php и system/startup.php, там все это есть.

 

В помощь:

  1. Серия статей. OpenCart для разработчиков. Часть 1.
  2. Серия статей. OpenCart для разработчиков. Часть 2.

 

Уважаемый, halfhope, прошу прощения, если туплю на ровном месте. Но пока так и не разобрался с запуском функции. Файл index.php и system/startup.php смотрел (в последнем, кстати, кажется нет таких вызовов, по крайней мере в моей версии opencart 1.5.5).

Подскажите, пожалуйста, мб я вообще имею какую стороннюю проблему, так как дебаггинг выводит, что приведенная строчка норм работает, но die() в начале файла контроллера не срабатывает.

Изменено пользователем sergeantpepper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу помочь советом,

$yandex_market = new Action('feed/yandex_market');
echo 'a';

Нормально отрабатывает, выводится «a».

 

Однако код

die('controller');

В начале файла контроллера  по адресу catalog/controller/feed/yandex_market.php не срабатывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, ок. Вот рабочий код (версия 1.5.5):

<?php

	error_reporting (E_ALL); 
	
	// Version
	define('VERSION', '1.5.5.1.2');
	
	// Configuration
	if (file_exists('config.php')) {
		require_once('config.php');
	} 
	
	// VirtualQMOD
	require_once('./vqmod/vqmod.php');
	VQMod::bootup();
	
	// VQMODDED Startup
	require_once(VQMod::modCheck(DIR_SYSTEM . 'startup.php'));
	
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/customer.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/affiliate.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/currency.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/tax.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/weight.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/length.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/cart.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/ocstore.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/proudly_define.php'));
	require_once(VQMod::modCheck(DIR_SYSTEM . 'library/proudly_common.php'));
	
	// Registry
	$registry = new Registry();	
	
	// Loader
	$loader = new Loader($registry);
	$registry->set('load', $loader);
	
	// Config
	$config = new Config();
	$registry->set('config', $config);
	
	// Database 
	$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
	$registry->set('db', $db);
	
	// Store
	if (isset($_SERVER['HTTPS']) && (($_SERVER['HTTPS'] == 'on') || ($_SERVER['HTTPS'] == '1'))) {
		$store_query = $db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`ssl`, 'www.', '') = '" . $db->escape('https://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
	} else {
		$store_query = $db->query("SELECT * FROM " . DB_PREFIX . "store WHERE REPLACE(`url`, 'www.', '') = '" . $db->escape('http://' . str_replace('www.', '', $_SERVER['HTTP_HOST']) . rtrim(dirname($_SERVER['PHP_SELF']), '/.\\') . '/') . "'");
	}
	
	if ($store_query->num_rows) {
		$config->set('config_store_id', $store_query->row['store_id']);
	} else {
		$config->set('config_store_id', 0);
	}
			
	// Settings
	$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0' OR store_id = '" . (int)$config->get('config_store_id') . "' ORDER BY store_id ASC");
	
	foreach ($query->rows as $setting) {
		if (!$setting['serialized']) {
			$config->set($setting['key'], $setting['value']);
		} else {
			$config->set($setting['key'], unserialize($setting['value']));
		}
	}
	
	if (!$store_query->num_rows) {
		$config->set('config_url', HTTP_SERVER);
		$config->set('config_ssl', HTTPS_SERVER);	
	}
	
	// Url
	$url = new Url($config->get('config_url'), $config->get('config_secure') ? $config->get('config_ssl') : $config->get('config_url'));	
	$registry->set('url', $url);
	
	// Log 
	$log = new Log($config->get('config_error_filename'));
	$registry->set('log', $log);
	
	function error_handler($errno, $errstr, $errfile, $errline) {
		global $log, $config;
		
		switch ($errno) {
			case E_NOTICE:
			case E_USER_NOTICE:
				$error = 'Notice';
				break;
			case E_WARNING:
			case E_USER_WARNING:
				$error = 'Warning';
				break;
			case E_ERROR:
			case E_USER_ERROR:
				$error = 'Fatal Error';
				break;
			default:
				$error = 'Unknown';
				break;
		}
			
		if ($config->get('config_error_display')) {
			echo '<b>' . $error . '</b>: ' . $errstr . ' in <b>' . $errfile . '</b> on line <b>' . $errline . '</b>';
		}
		
		if ($config->get('config_error_log')) {
			$log->write('PHP ' . $error . ':  ' . $errstr . ' in ' . $errfile . ' on line ' . $errline);
		}
	
		return true;
	}
		
	// Error Handler
	set_error_handler('error_handler');
	
	// Request
	$request = new Request();
	$registry->set('request', $request);
	 
	// Response
	$response = new Response();
	$response->addHeader('Content-Type: text/html; charset=utf-8');
	$response->setCompression($config->get('config_compression'));
	$registry->set('response', $response); 
			
	// Cache
	$cache = new Cache();
	$registry->set('cache', $cache); 
	
	// Session
	$session = new Session();
	$registry->set('session', $session);
	
	// Language Detection
	$languages = array();
	
	$query = $db->query("SELECT * FROM `" . DB_PREFIX . "language` WHERE status = '1'");
	
	foreach ($query->rows as $result) {
		$languages[$result['code']] = $result;
	}
	
	$detect = '';
	
	if (isset($request->server['HTTP_ACCEPT_LANGUAGE']) && $request->server['HTTP_ACCEPT_LANGUAGE']) { 
		$browser_languages = explode(',', $request->server['HTTP_ACCEPT_LANGUAGE']);
		
		foreach ($browser_languages as $browser_language) {
			foreach ($languages as $key => $value) {
				if ($value['status']) {
					$locale = explode(',', $value['locale']);
	
					if (in_array($browser_language, $locale)) {
						$detect = $key;
					}
				}
			}
		}
	}
	
	if (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']) {
		$code = $session->data['language'];
	} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
		$code = $request->cookie['language'];
	} elseif ($detect) {
		$code = $detect;
	} else {
		$code = $config->get('config_language');
	}
	
	if (!isset($session->data['language']) || $session->data['language'] != $code) {
		$session->data['language'] = $code;
	}
	
	if (!isset($request->cookie['language']) || $request->cookie['language'] != $code) {	  
		setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $request->server['HTTP_HOST']);
	}			
	
	$config->set('config_language_id', $languages[$code]['language_id']);
	$config->set('config_language', $languages[$code]['code']);
	
	// Language	
	$language = new Language($languages[$code]['directory']);
	$language->load($languages[$code]['filename']);	
	$registry->set('language', $language); 
	
	// Document
	$registry->set('document', new Document()); 		
	
	// Customer
	$registry->set('customer', new Customer($registry));
	
	// Affiliate
	$registry->set('affiliate', new Affiliate($registry));
	
	if (isset($request->get['tracking'])) {
		setcookie('tracking', $request->get['tracking'], time() + 3600 * 24 * 1000, '/');
	}
			
	// Currency
	$registry->set('currency', new Currency($registry));
	
	// Tax
	$registry->set('tax', new Tax($registry));
	
	// Weight
	$registry->set('weight', new Weight($registry));
	
	// Length
	$registry->set('length', new Length($registry));
	
	// Cart
	$registry->set('cart', new Cart($registry));
	
	// ocStore features
	$registry->set('ocstore', new ocStore($registry));
	//  Encryption
	$registry->set('encryption', new Encryption($config->get('config_encryption')));
	
	// Front Controller 
	$controller = new Front($registry);
	
	// Maintenance Mode
	$controller->addPreAction(new Action('common/maintenance'));
		
	
	
	
	/** CRON actions */		
		
	// yandex market yml
	$yandex_market = new Action('feed/yandex_market');
	$controller->dispatch($yandex_market, new Action('error/not_found'));
	
	
 
?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, на что поменять код для крона? Нужно переиндексировать для мегафильтра товары

Mfilter_Plus::getInstance( $this )->updateProduct($result['product_id']);

Ругается Undefined variable: this

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, Vallium сказал:

Ругается Undefined variable: this

А в каком файле изначально у вас эта строка была?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, Dotrox сказал:

А в каком файле изначально у вас эта строка была?

 

Файл такой

<?

require_once(dirname(__FILE__).'/config.php');
require_once(DIR_SYSTEM . 'startup.php');

require_once DIR_SYSTEM . 'library/mfilter_plus.php';

$registry = new Registry();
$loader = new Loader($registry);
$registry->set('load', $loader);
$config = new Config();
$registry->set('config', $config);

$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$registry->set('db', $db);

$query = $db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE status = 1 limit 0,10"); 
foreach ($query->rows as $resulti) 
{
	Mfilter_Plus::getInstance( $this )->updateProduct($resulti['product_id']);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я спрашивал о том файле, из которого вы эту строку сюда скопировали, а не о файле, где возникает ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Dotrox сказал:

Я спрашивал о том файле, из которого вы эту строку сюда скопировали, а не о файле, где возникает ошибка.

 Файл самодельный. А строку скопировал из документации по мегафильтру

Изменено пользователем Vallium

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 часов назад, Vallium сказал:

строку скопировал из документации по мегафильтру

Тогда покажите тот фрагмент документации, откуда копировали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 09.10.2017 в 01:04, Dotrox сказал:

Тогда покажите тот фрагмент документации, откуда копировали.

 Integrate Mega Filter PLUS with external module to import / export / edit products.

Manual entry of products to store data base is tidersome that is why users of OpenCart often use modules allowing import, export and editing many products at the same time.

Mega Filter Plus gives an opportunity of easy integration with this modules thanks to it during entering or updating products by Mega Filter Plus relevant information will be updated as well.

In order to provide for this move the below code to the suitable position in a module capable of updating or importing products.

if( $this->config->get( 'mfilter_plus_version' ) ) {
     require_once DIR_SYSTEM . 'library/mfilter_plus.php';
     
     Mfilter_Plus::getInstance( $this )->updateProduct( $product_id );
}											

This code must be induced after updating each product in data base.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написано про интеграцию с другими модулями, значит, вероятно, речь идёт про контроллеры. Тогда так:
 

$controller = new Front($registry);
Mfilter_Plus::getInstance($controller)->updateProduct($product_id);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят подскажите, создал по аналогии крон файл, который должен запускать контроллер (админки).

 

//Front controller
$controller = new Front($registry);

$privathistory = new Action('sale/privathistory');
$controller->dispatch($privathistory, new Action('error/not_found'));

 

Отображает ошибку (в логах сервера, в логах скрипта число):

PHP Parse error:  syntax error, unexpected '$privathistory' (T_VARIABLE) .

 

Судя по ошибке, не может найти $privathistory (при этом файл admin/controller/sale/privathistory существует)

 

Полный код: 

<?php

/*
 * CSV Price import/export 3 CLI - v 1.0.1 (18.09.2015)
 *
 * changes:
 * 1.0.1 - first release
 *
 */

// debug
define('AVTO_STATUS_DEBUG', '0');

define('OPENCART_ADMIN_DIR', '');

// Config file
if ( file_exists(OPENCART_ADMIN_DIR . 'config.php') ) {
	require_once (OPENCART_ADMIN_DIR . 'config.php');
} else {
	die("ERROR: Avto_Status cannot access to config.php");
}

// Configuration
require_once (DIR_SYSTEM . 'startup.php');

// Registry
$registry = new Registry();

// Loader
$obj = new Loader($registry);
$registry->set('load', $obj);

// Config
$config = new Config();
$registry->set('config', $config);

// Database
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$registry->set('db', $db);

// Settings
$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0'");

foreach ( $query->rows as $setting ) {
	if ( !$setting['serialized'] ) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], unserialize($setting['value']));
	}
}

// log File
$log = new Log(date("Y-m-d") . '_avtostatus.log');
$registry->set('log', $log);

function error_handler($errno, $errstr, $errfile, $errline) {
	global $log, $config;

	switch ($errno) {
		case E_NOTICE :
		case E_USER_NOTICE :
			$error = 'Notice';
			break;
		case E_WARNING :
		case E_USER_WARNING :
			$error = 'Warning';
			break;
		case E_ERROR :
		case E_USER_ERROR :
			$error = 'Fatal Error';
			break;
		default :
			$error = 'Unknown';
			break;
	}

	if ( AVTO_STATUS_DEBUG ) {
		$log->write('PHP ' . $error . ':  ' . $errstr . ' in ' . $errfile . ' on line ' . $errline);
	}

	return true;
}

// Error Handler
set_error_handler('error_handler');

// Settings
$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting");
foreach ( $query->rows as $setting ) {
	if ( !$setting['serialized'] ) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], unserialize($setting['value']));
	}
}
$query = $db->query("UPDATE `mo_product` SET `isbn` = IF (`quantity` > 20, 20, `quantity`) WHERE `quantity` IS NOT NULL");
$query = $db->query("UPDATE `mo_product` SET `mpn` = TRUNCATE(`price`* (SELECT `value` FROM `mo_currency` WHERE `currency_id` = 4),2) WHERE `quantity` IS NOT NULL");

// Cache
$registry->set('cache', new Cache());

// Language Detection
$languages = array();
$query = $db->query("SELECT * FROM `" . DB_PREFIX . "language`");
foreach ( $query->rows as $result ) {
	$languages[$result['code']] = $result;
}
$config->set('config_language_id', $languages[$config->get('config_admin_language')]['language_id']);

// Language
$language = new Language($languages[$config->get('config_admin_language')]['directory']);
$language->load($languages[$config->get('config_admin_language')]['filename']);
$registry->set('language', $language);

// Default Store
$config->set('config_store_id', 0);

//Front controller
$controller = new Front($registry);

$privathistory = new Action('sale/privathistory');
$controller->dispatch($privathistory, new Action('error/not_found'));


?>

Направьте на путь истинный, как запустить по крону контроллер.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 30.04.2018 в 14:11, mesateri сказал:

Судя по ошибке, не может найти $privathistory (при этом файл admin/controller/sale/privathistory существует)

Даже близко не то!

Дословно в ошибке говорится о том, что интерпретатор PHP не ожидал встретить переменную $privathistory там, где он её встретил.

Обычно такие ошибки возникают, если в предыдущем коде что-то пропущено (точка с запятой в конце строки, закрывающая скобка и т.д.), но я в этом коде проблем на предшествующих строках увидеть не могу.

Вы уверены, что ошибка возникает именно в том файле, который вы выложили, то есть, что у него нет версии в кеше окмод, где и возникает ошибка?

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 06.05.2018 в 02:02, Dotrox сказал:

Даже близко не то!

Дословно в ошибке говорится о том, что интерпретатор PHP не ожидал встретить переменную $privathistory там, где он её встретил.

Обычно такие ошибки возникают, если в предыдущем коде что-то пропущено (точка с запятой в конце строки, закрывающая скобка и т.д.), но я в этом коде проблем на предшествующих строках увидеть не могу.

Вы уверены, что ошибка возникает именно в том файле, который вы выложили, то есть, что у него нет версии в кеше окмод, где и возникает ошибка?

 

Внес изменения в контроллер sale/privathistoryи все заработало нормально. Благодарю за отклик на сообщение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.