Jump to content
Sign in to follow this  
sergeantpepper

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

Recommended Posts

Добрый день!

 

В корне сайта есть файл 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:

Share this post


Link to post
Share on other sites


//Вроде так.

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

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

$model_catalog_category->syncAllCategoriesManufacturers();

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

Share this post


Link to post
Share on other sites
//Вроде так.
$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();

Share this post


Link to post
Share on other sites
//Вроде так.
$loader->model('catalog/category');
$model_catalog_category = $regisry->get('model_catalog_category');
$model_catalog_category->syncAllCategoriesManufacturers();

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

 

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

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

Share this post


Link to post
Share on other sites


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

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites

 

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

 

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

 

В помощь:

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

 

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

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

Edited by sergeantpepper

Share this post


Link to post
Share on other sites

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

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

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

 

Однако код

die('controller');

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

Share this post


Link to post
Share on other sites

Ладно, ок. Вот рабочий код (версия 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'));
	
	
 
?>

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
7 минут назад, Vallium сказал:

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

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

Share this post


Link to post
Share on other sites
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']);
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
10 часов назад, Dotrox сказал:

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

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

Edited by Vallium

Share this post


Link to post
Share on other sites
14 часов назад, Vallium сказал:

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

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

Share this post


Link to post
Share on other sites
В 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.

 

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

 

//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'));


?>

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

 

Share this post


Link to post
Share on other sites
В 30.04.2018 в 14:11, mesateri сказал:

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

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

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

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

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

  • +1 1

Share this post


Link to post
Share on other sites
В 06.05.2018 в 02:02, Dotrox сказал:

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.