Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] Вызов функции модели или контроллера из файла 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:

Надіслати
Поділитися на інших сайтах


//Вроде так.
$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');

 

Как при этом вызвать функцию 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'));
	
	
 
?>
Надіслати
Поділитися на інших сайтах


  • 9 months later...
  • 7 months later...

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

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

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

Надіслати
Поділитися на інших сайтах


  • ArtemPitov changed the title to [Решено] Вызов функции модели или контроллера из файла cron.php
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
Надіслати
Поділитися на інших сайтах


В 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.

 

Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

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

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

 

Надіслати
Поділитися на інших сайтах


  • 6 months later...

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

 

//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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.