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

Как обратится к функциям Controller или Model с файла лежащего в корне или в другой папке

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

Приветствую всех гуру! Подскажите как с файла лежащего к примеру www/file.php обратится к функциям контроллера и модели? Заранее благодарен))

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


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

никак.

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


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

Подробно напишите какая задача.

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


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

Подробно напишите какая задача.

 

Задача следующая: необходимо с файла лежащего к примеру ./pay/pay.php обратится к функции update() лежащей в файле ./catalog/model/checkout/order.php. Файл pay.php это обработчик, т.е. после обращения к этому файлу скажем: http://test.ru/pay/pay.php необходимо занести коммент к заказу, что делает функция update(). Спасибо!

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


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

Примерно как-то так...

 

// Ищем и подключаем файл с классом

if (file_exists('путь к файку' . 'order.php')) {
    require_once('путь к файку' . 'order.php');
}

 

// создаём новый объект класса

$my = new ModelCheckoutOrder(параметры если нужны);

 

..................

//что-то делаем

$my->update(параметры);

.................

// уничтожаем переменную

unset($my);

=========================

 

Ну и дальше уже смотреть по ситуации.

 

Можно предварительно конфиг движка подключить, чтобы доступ к константам путей иметь. Можно ./pay/pay.php сделать в виде класса, который будет наследоваться от стандартного класса контроллера движка (Controller), тем самым наследуя функционал контроллера.

 

В общем дальше уже от конкретной реализации зависит и там уже просто знание PHP нужно и знание ООП в PHP

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


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

Примерно как-то так...

Не забыть про то, что ModelCheckoutOrder extend Model

 

require_once(system/engine/model.php');

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


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

ага. и еще куча связей.

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

 

потому и ответ мой был "никак".

ибо оно того не стоит.

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


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

Если это обработчик оплаты, то почему бы не сделать платежным модулем?

Посмотрите директорию /catalog/controller/payment/, примеров там куча

Простейший случай /catalog/controller/payment/pay.php:

<?php
class ControllerPaymentPay extends Controller {
  public function index() {
    /* ваш код */
    $this->load->model('checkout/order');
    $this->model_checkout_order->update(/* данные для обновления */);
  }
}

Вызываться это будет не http://test.ru/pay/pay.php, а http://test.ru/index.php?route=payment/pay

  • +1 2

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


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

Все ребята спасибо разобрался. Получилось следуещее:

Два файла pay.php и payController.php

Листинг pay.php:

<?


if (file_exists('../../config.php')) {
    require_once('../../config.php');
} else {echo 'Не удалось найти файл конфигурации'; exit;}


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


// Application Classes
require_once(DIR_SYSTEM . 'library/customer.php');
require_once(DIR_SYSTEM . 'library/affiliate.php');
require_once(DIR_SYSTEM . 'library/currency.php');
require_once(DIR_SYSTEM . 'library/tax.php');
require_once(DIR_SYSTEM . 'library/weight.php');
require_once(DIR_SYSTEM . 'library/length.php');
require_once(DIR_SYSTEM . 'library/cart.php');
require_once(DIR_SYSTEM . 'library/taobao.php');
require_once(DIR_SYSTEM . 'library/translator.php');
require_once(DIR_SYSTEM . 'library/bingtranslator.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_use_ssl') ? $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"); 


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($request->get['language']) && array_key_exists($request->get['language'], $languages) && $languages[$request->get['language']]['status']) {
$code = $request->get['language'];
} elseif (isset($session->data['language']) && array_key_exists($session->data['language'], $languages)) {
$code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages)) {
$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
$document = new Document();
$registry->set('document', $document);  


// Customer
$registry->set('customer', new Customer($registry));


// Affiliate
$affiliate = new Affiliate($registry); 
$registry->set('affiliate', $affiliate);


if (isset($request->get['tracking']) && !isset($request->cookie['tracking'])) {
setcookie('tracking', $request->get['tracking'], time() + 3600 * 24 * 1000, '/');
}


// Currency
$registry->set('currency', new Currency($registry));


// Tax
$tax = new Tax($registry);
$registry->set('tax', $tax);


// Weight
$registry->set('weight', new Weight($registry));


// Length
$registry->set('length', new Length($registry));


// Cart
$registry->set('cart', new Cart($registry));


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




require_once('payController.php');




$payProvider = new ControllerPayProvider($registry);


echo $payProvider->index();








?>

В общем взял почти все с файла index.php кроме вывода (это позволило мне пользоваться функционалом класса Controller)

 

Ну и непосредственно сам класс в файле payController.php:

<?php
class ControllerPayProvider extends Controller {
public function index() {
/* ваш код */
$this->load->model('checkout/order');
$this->model_checkout_order->update(/* данные для обновления */);
}
}

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


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

Я же написал как правильно сделать, не превращайтке свою работу в говнокод, тем более, что времени займет не больше 2 минут:

pay.php - лишний

payController.php переименовать в payprovider.php, положить в /catalog/controller/payment/ и вызывать как /index.php?route=payment/payprovider

  • +1 2

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


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

Больше, больше копипаста! Чем больше строк кода, тем у индуса выше зарплата.

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


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

Да уж... Большой и ненужный копипаст. По сути, /index.php продублировали

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


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

Вы не понимаете смысл созданной темы необходимо чтоб файл лежал не в /catalog/controller/payment/, а именно в корне к примеру /pay/pay.php и при всем этом в сылке не должны присутствовать другие get переменные. Потому что к файлу pay.php будет обращатся не пользователь а платежная система. В связи с изложеным, поставленная задача решена, а если есть предложение по поводу оптимизации кода и прочего, излагайте буду рад почитать. Но в любом случае спасибо за обсуждение данной темы, без критики не будет и прогресса)))

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


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

А так?

.htaccess:

RewriteRule ^payprovider/$ index.php?route=payment/payprovider [L,QSA] 

/catalog/controller/payment/payprovider.php:

<?php
class ControllerPayProvider extends Controller {
  public function index() {
    print_r($_GET);
  }
}

http://site.ru/payprovider/?test=1

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


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

А так?

.htaccess:



RewriteRule ^payprovider/$ index.php?route=payment/payprovider [L,QSA] 

/catalog/controller/payment/payprovider.php:



<?php
class ControllerPayProvider extends Controller {
  public function index() {
    print_r($_GET);
  }
}

http://site.ru/payprovider/?test=1

 

 

Отличный вариант приму во внимание)) Только в моем случае мне было необходимо чтоб файл лежал в папке pay

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


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

RewriteRule ^pay/payprovider/$ index.php?route=payment/payprovider [L,QSA] 

А разве в панели платежной системы нельзя указать url?

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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