Jump to content
Sign in to follow this  
rovers

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

никак.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

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

 

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

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

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

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

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

unset($my);

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

Посмотрите директорию /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

Share this post


Link to post
Share on other sites

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

Два файла 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(/* данные для обновления */);
}
}

Share this post


Link to post
Share on other sites

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

pay.php - лишний

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

  • +1 2

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

А так?

.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

Share this post


Link to post
Share on other sites

А так?

.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

Share this post


Link to post
Share on other sites

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

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

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.