Свои функции show_404 и т.п. через hooks

Вопросы об установке, настройке и работе самого фреймворка

Свои функции show_404 и т.п. через hooks

Сообщение Viper » 30 апр 2010, 09:08

Собстно столкнулся с такое задачей. Нужно дописать пару функций show_403 и show_402
Делать это нужно через хуки?

Сделал в hooks.php
Код: Выделить всё
$hook['pre_controller'] = array(
    'class'    => 'Errors',
    'function' => 'show_403',
    'filename' => 'errors.php',
    'filepath' => 'hooks',
    'params'   => array($_SERVER['PHP_SELF'])
);
 


далее в errors.php

Код: Выделить всё
class Errors {
    function show_403($page='') {
        $heading = "403 Forbidden";
        $message = "You do not have access to this page.";
        log_message('error', '403 Forbidden --> '.$page);
        echo show_error($heading, $message, 'error_403', 403);
        exit;
    }
}
 


но идет ругательство
Status codes must be numeric


Что я не так делаю?
Viper
 
Сообщения: 14
Зарегистрирован: 20 апр 2010, 14:27

Re: Свои функции show_404 и т.п. через hooks

Сообщение snake.nf » 30 апр 2010, 16:30

Вместо CI_Exceptions::show_error() вызывается show_error() из Common.php
Вызовы идут show_error() -> CI_Exception::show_error() -> set_status_header() в который в итоге предаётся неверный параметр, вызывающий ошибку:
Код: Выделить всё
show_error('Status codes must be numeric', 500); 


P.S. Как смог, объяснил, надеюсь понятно :)

P.P.S. Попробуй, такой код:
Код: Выделить всё

class Errors 
{
    function show_403($page='') {
        $heading = "403 Forbidden";
        $message = "You do not have access to this page.";
        log_message('error', '403 Forbidden --> '.$page);
        $error =& load_class('Exceptions');
        echo $error->show_error($heading, $message, 'error_403', 403);
        exit;
    }
}
 
Аватара пользователя
snake.nf
 
Сообщения: 40
Зарегистрирован: 16 фев 2010, 11:36

Re: Свои функции show_404 и т.п. через hooks

Сообщение snake.nf » 30 апр 2010, 17:43

Лучше всё, таки сделать не хуком, а хотя бы хэлпером :)

show_errors_helper.php
Код: Выделить всё
<?php   if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('show_403'))
{
    function show_403($page='')
    {
        $heading = "403 Forbidden";
        $message = "You do not have access to this page.";
        log_message('error', '403 Forbidden --> '.$page);
        $error =& load_class('Exceptions');
        echo $error->show_error($heading, $message, 'error_403', 403);
    }
}
 


В местах где планируется вызывать необходимо сначала подгрузить хэлпер:
Код: Выделить всё

$this
->load->helper('show_errors');
 


Вызывается просто:
show_403();

P.S. Необходимо, что бы в application/errors был error_403.php с вашим кодом страницы.
show_402() пишется точно так же. Добавляем в хэлпер функцию show_402() и в application/errors создаём error_402.php.

P.P.S. В CodeIgniter 2.0 Exceptions загружать:
Код: Выделить всё
 $error =& load_class('Exceptions''core'); 
Аватара пользователя
snake.nf
 
Сообщения: 40
Зарегистрирован: 16 фев 2010, 11:36

Re: Свои функции show_404 и т.п. через hooks

Сообщение Viper » 10 июн 2010, 13:48

Заработало. НО как-то некрасиво код выглядит :) Решил переделать в свою library все функции класса exceptions. Но запнулся в самом начале...

Создал файл application/libraries/ME_Exceptions.php
в него прописал
Код: Выделить всё
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class ME_Exceptions extends CI_Exceptions {
    function show_403() {
        echo 'passed';
    }
}
 


в конфиге
Код: Выделить всё
$config['subclass_prefix'] = 'ME_'; 


в своем контролере вызываю
Код: Выделить всё
$this->load->library('ME_Exceptions'); 


и в результате получаю Fatal error: Class 'CI_Exceptions' not found in D:\WWW\htdocs\vhosts\viper.local\conference\meet\libraries\ME_Exceptions.php on line 3

Перерыл гуглю по этому поводу... Даже готовый пример с codeigniter.com копировал... Никак не хочет он его видеть. Если же проекстендить CI_Input к примеру, то все нормально видиться.

В чем же грабли?
PS! CI 1.7.2 (ядро не менялось).
Viper
 
Сообщения: 14
Зарегистрирован: 20 апр 2010, 14:27

Re: Свои функции show_404 и т.п. через hooks

Сообщение Viper » 10 июн 2010, 16:29

Усе... Разобрался с костылями :)

файл application/libraries/MY_Exceptions.php
Код: Выделить всё
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions {
    function __construct() {
        $this->ci =& get_instance();
    }

    function show_403($page='') {
        header('HTTP/1.0 403 Forbidden');
        $heading = '403 Forbidden';
        $message = "You don't have permission to access ".$page." on this server.";
        log_message('error', '403 Forbidden --> '.$page);
        echo $this->ci->show_error($heading, $message, 'error_403', 403);
        exit;
    }
}
 


далее в контроллере в после parent::Controller пишем
Код: Выделить всё
$error =& load_class('Exceptions', 'core');
$this->load->library('MY_Exceptions'); 


и далее по коду просто
Код: Выделить всё
$this->my_exceptions->show_403($_SERVER['REQUEST_URI']); 


обязательно создаем в errors/ файл error_403.php
Viper
 
Сообщения: 14
Зарегистрирован: 20 апр 2010, 14:27


Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0