0

これが私のモデルの codeigniter のコードです。

<?php

$catalogo = (object) array (
    "name" => "catalogo",
    "url" => "url_catalogo"
);
$categorias = (object)array (
    "name" => "categorias",
    "titulo" => "varchar_titulo",
);

$novedades = (object)array (
    "name"      => "novedades",
    "titulo"    => "varchar_titulo",
    "fecha"     => "fecha_publicacion",
    "descripcion"   => "text_descripcion",
    "categoria" => "fk_categoria"
);

$img_nov =(object) array (
    "name"      => "imagenes_novedades",
    "url"       => "url_img",
    "novedad"   => "fk_novedad"
);  
$marcas = (object) array(
    "name"      => "marcas",
    "titulo"    => "varchar_titulo",
    "url"       => "url_imagen"
);
$img_slide  = (object) array (
    "name"  => "slide_destacados",
    "url"   => "url_img"
);

$users = (object) array (
    "db"    => "users",
    "user"  => "username",
    "pass"  => "password"
);
class Model extends CI_Model 
{

    function __construct()
    {
        parent::__construct();
    }

    function check_user ( $username, $password )
    {
        global $users;
        if ( $username == "" || $password == "" )
            return FALSE;

        $hashed_password = md5( $password ); 

        $this->db->where($users->user, $username );
        $this->db->where($users->pass, $hashed_password );

        $query = $this->db->get($users->name);

        if ( $query->num_rows() > 0 )
            return TRUE;
        return FALSE;
    }

    /*
     * Slide de destacados de la pagina principal.
     * no creo que necesitemos mas que esto
     */

    function imagenes_slide ( $id = -1 )
    {
        global $img_slide;
        if ( $id == -1 )
            $this->db->where( 'id', $id);
        $query = $this->db->get( $img_slide->name);

        return $query->result_array();
    }

    function borrar_imagen_slide( $id )
    {
        global $img_slide;
        $image_to_delete = $this->imagenes_slide( $id );

        $this->db->where('id', $id);
        $this->db->delete($img_slide->name);

        return $image_to_delete[0][$img_slide->url];
    }

    function agregar_imagen_slide( $url )
    {
        global $img_slide;
        $this->db->insert( $img_slide->name, array( $img_slide->url => $url ));
    }

    function cambiar_imagen_slide ( $id, $url )
    {
        global $img_slide;
        $this->db->where( 'id', $id );
        $this->db->update( $img_slide->name, array( $img_slide->url, $url ) );
    }

    /*
     * Url del catalogo.
     */

    function url_catalogo( $id = -1 )
    {
        global $catalogo;
        if ( $id !== -1 )
            $this->db->where( 'id', $id );

        $query = $this->db->get( $catalogo->name );
        return $query->result_array();
    }

    function add_catalogo ( $url )
    {
        global $catalogo;
        $this->db->insert( $catalogo->name, array( $catalogo->url, $url) );
    }

    function remove_catalogo ( $id )
    {
        global $catalogo;
        $url_catalogo = $this->url_catalogo( $id );

        $this->db->where( 'id', $id );
        $this->db->delete( $catalogo->name );

        # Es solo que queremos el primero, ya que buscamos por id
        # y este es unico.
        return $url_catalogo[0][$catalogo->url];
    }

    function update_catalogo ( $id, $url )
    {
        global $catalogo;
        $this->db->where( 'id', $id );
        $this->db->update( $catalogo->name, array( $catalogo->url, $url ) );
    }

    /*
     * Marcas.
     */

    function get_marcas ( $id = -1)
    {
        global $marcas;
        if( $id !== -1 )
            $this->db->where( 'id', $id );
        $query = $this->db->get( $marcas->name );
        return $query->result_array();
    }   

    function add_marca ( $titulo, $url )
    {
        global $marcas;
        $n = array( $marcas->titulo => $titulo, $marcas->url => $url );
        $this->db->insert( $marcas->name, $n );
    }

    function remove_marca ( $id )
    {
        global $marcas;
        # Get the url to delete the image
        $url_to_delete = $this->get_marcas( $id );

        $this->db->where( 'id', $id );
        $this->db->delete( $marcas->name );

        # Es solo que queremos el primero, ya que buscamos por id
        # y este es unico.
        return $url_to_delete[0][$marcas->url];
    }

    function update_marca ( $id, $titulo = FALSE, $url = FALSE )
    {
        global $marcas;
        $to_update = array ();

        if ( $titulo != FALSE )
            $to_update[$marcas->titulo] = $titulo;
        if ( $url != FALSE )
            $to_update[$marcas->url] = $url;

        if ( $to_update !== array() )
        {
            $this->db->where( 'id', $id );
            $this->db->update($marcas->name, $to_update );
        }
    }

    /*
     * Categorias!
     */
    function get_categorias ( $id = -1 )
    {
        global $categorias;
        if ( $id != -1 )
            $this->db->where('id', $id);
        $query = $this->db->get( $categorias->name );
        return $query->result_array();
    }

    function remove_categoria ( $id )
    {
        global $categorias;
        # Conseguimos todos los items de las categorias.
        $novedades = $this->get_novedades( $id );
        foreach( $novedades as $novedad )
        {
            $this->delete_novedad ( $novedad["id"] );
        }

        $this->db->where( 'id', $id );
        $this->db->delete( $categorias->name );
    }

    function add_categoria ( $titulo )
    {
        global $categorias;
        $data = array( $categorias->titulo, $titulo );
        $this->db->insert ($categorias->name, $data);
    }

    function update_categoria ( $id, $titulo )
    {
        global $categorias;
        $this->db->where( 'id', $id);
        $this->db->update( $categorias->name, array( $categorias->titulo, $titulo ) );
    }

    /*
     * Novedades ! (Esto va a ser largo)
     */

    function get_novedades ( $id_categoria, $id_novedad = FALSE, $offset = FALSE )
    {
        global $novedades;
        $this->db->where( $novedades->categoria, $id_categoria );
        if ( $id_novedad !== FALSE )
            $this->db->where ( 'id', $id_novedad );
        if ( $offset !== FALSE )
            $this->db->limit( 10, $offset );
        $query = $this->db->get( $novedades->name );

        return $query->result_array();
    }

    function add_novedad ( $titulo, $descripcion, $id_categoria )
    {
        global $novedades;
        # Hay que crear la fecha actual.
        $date = new Date();

        $to_add = array (
            $novedades->titulo  => $titulo,
            $novedades->fecha   => $date,
            $novedades->descripcion => $descripcion,
            $novedades->categoria   => $id_categoria
        );
        $this->db->insert( $novedades->name, $to_add );
    }

    function delete_novedad ( $id )
    {
        global $novedades;

        # Y ahora sacamos de la base de datos.
        $this->db->where( 'id', $id );
        $this->db->delete( $novedades->name );

        # Retornamos todas las urls de las imagenes.
    }

    function update_novedad ( $id, $titulo = FALSE, $descripcion = FALSE )
    {
        global $novedades;
        $to_update = array();
        $this->db->where ( 'id' , $id );
        if ( $titulo != FALSE )
            $to_update[$novedades->titulo] = $titulo;
        if ( $descripcion != FALSE )
            $to_update[$novedades->descripcion] = $descripcion;

        if ( $to_update === array() )
            return FALSE;
        $this->db->update( $novedades->name, $to_update );
    }

    /*
     * Aca van las imagenes de las novedades.
     */

    function get_images_novedad ( $id_novedad, $amount = 0 )
    {
        global $img_nov;
        if ( $amount != 0 )
            $this->db->limit( $amount );
        $this->db->where( $img_nov->novedad, $id_novedad );
        $query = $this->db->get( $img_nov->name );

        return $query->result_array();
    }

    function delete_imagen_novedad ( $id )
    {

        global $img_nov;
        # Primero que nada, eliminamos todas las imagenes. :)
        $images = $this->get_imagenes_novedad ( $id );
        $to_delete_permantenlty = array();
        foreach ( $images as $image )
        {
            $to_delete_permantenlty[] = $image[$img_nov->url];
        }

        $this->db->where( $img_nov->novedad, $id );
        $this->db->delete( $img_nov->name );
        return $to_delete_permantenlty;
    }

}
/* End of Model class */

モデルのグローバル スコープでオブジェクトを表示したい。私はこれを行うために多くの方法を試しました。しかし仕方がない。

これは、意味をなさないモデルにアクセスしたときのエラーです。

Message: Trying to get property of non-object

PD: 代替手段は必要ありません。私は代替手段を知っており、10分で機能させることができます:)これが機能するかどうかに興味があります。

4

1 に答える 1

3

できません、不可能です。Chuck Norris でさえ、クラス定義内のグローバル変数にアクセスできません。
これらのオブジェクトが必要な場合は、それらをコンストラクターまたはメソッドに渡す必要があります。考えてみてください: OOP の背後にある全体的な考え方は、どこにでも配置できるコードを 1 回書くことです。そのコードが、グローバル スコープで定義される $foo というグローバル変数に依存している場合、コードはできません。グローバルスコープに目的のオブジェクトがあり、それらの特定の名前が付いていない限り、再利用できます...これが許可されている場合、OOPコードはデバッグするのが大変です:現在、何かが定義されていないというエラーが表示された場合、 class ファイルを見ると、プロパティにアクセスしようとしていることがわかります。グローバル $foo の代わりに $foo を書いたことを見つけるためだけに、コードのすべての行を歩き回らなければならないことの恐怖を想像してみてください。

おまけ:
これを機能させるちょっとしたハックな方法を考えてみました: オブジェクトをスーパーグローバル変数 ($_GLOBALS など) に割り当てると、アクセスできるようになります (スーパーグローバル変数はクラス内からアクセスできます)。しかし、それはひどい習慣であり、非常にエラーが発生しやすいです。すべてのクラスがこれらのオブジェクトにアクセスでき、データを再割り当てまたは変更する可能性があるため、オブジェクトがまだ存在するという保証はありません...

率直に言って、グローバル変数にアクセスする必要がある場合は、時間をかけて実際に何をしたいのかを考えたほうがよいでしょう。あなたのために、そして実際にすべての人のために、OO をすべて書くか、何も書かないかのどちらかを選択したほうがよいでしょう。2つを混ぜ合わせても、最終的には悲しみを引き起こすだけです.

あなたは codeigniter を使用しているので、時間をかけてフレームワークを理解し、意図したとおりに使用してみませんか。そうすれば、車輪の再発明を避けることができます。結局のところ、それがフレームワークの目的です。フレームワークは、面倒な作業や核心的な作業をすべて実行する (かなり) よく開発されたバックボーンを提供するため、その必要はありません。
フレームワークを使用して MVC パターンを調べるだけです。それが私がすることです...

編集:
あなたが得ているエラーは絶対に理にかなっています:グローバル変数を使用できないため、非オブジェクトのプロパティへのアクセスは予想されます。PHP はこのような大失敗を犯し、すべてを機能させようとする傾向があるため、おそらくローカル変数を定義します (初期化されていないため、NULL が割り当てられます)。null はオブジェクトではないため、次のことができます。プロパティにアクセスしないでください。したがって、非オブジェクトのプロパティにアクセスします。

@fireeyedboy
が私に指摘したように、これを行うことは可能です (コードパッドへのリンクについてはコメントを確認してください)。私は今でも、これはひどいコーディング方法であり、これをバグと呼ぶほどであり、できるだけ早くつぶす必要があると主張しています。
シアン化物錠剤に相当するコードを見たことがあれば、これがそれです。特定のグローバル変数が存在する場合にのみ機能するオブジェクト指向コードを書くことは、人類に対する犯罪です!

于 2012-12-28T19:59:40.120 に答える