Вот код моей модели в 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 минут 🙂 Мне просто интересно, может ли это работать или нет.
Вы не можете, это невозможно, даже Чак Норрис не может получить доступ к глобальным переменным внутри определения класса .
Вам придется передать их конструктору или методу, когда вам нужны эти объекты. Подумайте об этом: вся идея OOP состоит в том, чтобы написать код один раз, который можно развернуть где угодно, если этот код зависит от глобальной переменной, которая называется $ foo, которая будет определена в глобальной области, ваш код нельзя использовать повторно, если глобальная область имеет желаемые объекты с этими конкретными именами … Если бы это было разрешено, OOP-код был бы ад для отладки: в настоящее время, если вы получаете сообщение об ошибке, которое не определено в строке x файла класса, вы знаете, что вы пытаетесь получить доступ к свойству. Представьте себе ужас, связанный с необходимостью пробираться через каждую строку кода, просто чтобы узнать, что вы написали: $ foo вместо глобального $ foo
Дополнительно:
Просто подумал о хакерском способе сортировки – чтобы это получилось: назначение объектов сверхглобальной переменной (например, $ _GLOBALS) даст вам доступ (к супер-глобальным объектам можно получить доступ из класса). Но это просто ужасная практика и очень подвержена ошибкам: каждый класс имеет доступ к этим объектам и может переназначать или изменять данные, поэтому у вас нет гарантии, что объекты все еще существуют …
Честно говоря, если вам нужен доступ к глобальным переменным, вам стоит подумать о том, что вы на самом деле хотите сделать. Для твоего, и в самом деле, ради всего, тебе лучше выбрать либо написать все ОО, либо ничего. Смешивание двух приведет только к горю в конце.
Поскольку вы используете codeigniter, почему бы не потратить время, чтобы узнать структуру и использовать ее так, как она была предназначена. Таким образом, вы избегаете изобретать колесо и, в конце концов: вот для чего нужны рамки: они предлагают вам (справедливо) хорошо развитую основу, которая делает все тяжелые лифчики и ничтожные вещи, поэтому вам это не нужно.
Просто используйте фреймворк и посмотрите на шаблон MVC, вот что я сделал бы …
Редактировать:
Ошибка, которую вы получаете, имеет абсолютный смысл: следует ожидать доступа к объекту не-объекта, потому что вы не можете использовать глобальные переменные. PHP имеет эту тенденцию проделать промах и попытаться заставить все это работать, поэтому он, вероятно, определяет для вас локальную переменную, которая (поскольку она не инициализирована, будет назначена NULL), null не является объектом, и поэтому вы можете Свойства доступа. Следовательно: доступ к свойствам не-объекта.
коррекция
как заметил мне @fireeyedboy, это можно сделать (проверьте комментарии для ссылки на кододелат). Я все еще утверждаю, что это ужасный способ кодирования, и даже дойдет до того, чтобы называть это ошибкой, которая должна быть сжата как можно скорее.
Если когда-нибудь я увижу кодовый эквивалент цианидной таблетки, это все. Напишите код OO, который может работать только в том случае, если существуют определенные глобальные перемены, это преступление снова для человечества!