Codeigniter -> Редактировать страницу - PullRequest
0 голосов
/ 12 апреля 2011

Я получаю следующую ошибку при попытке доступа:

domain.co.nz / администратор / editpage / дома /

Я получаю следующую ошибку:

PHP Fatal error:  Call to a member function getCMSPage() on a non-object in controllers/home.php on line 22 

Проблема в том, что я не могу понять, почему он возвращается обратно в главный «домашний» контроллер - главный контроллер.

Все мои модели загружены по умолчанию - http://cl.ly/2U1F3a2B0s2K0i3k3g13

Идеальная ситуация

То, что я пытаюсь сделать, это загрузить содержимое в текстовую область для редактирования, и когда нажата кнопка «Отправить», я хочу, чтобы он вернулся на ту же страницу с сообщением об обновлении содержимого.

Администраторский шаблон

<li><?php echo anchor('#','Edit Pages');?>
            <?php if(is_array($cms_pages)): ?>
                    <ul>
                        <?php foreach($cms_pages as $page): ?>
                        <li><a >permalink?>"><?=$page->name?></a></li>
                        <?php endforeach; ?>
                    </ul>
                <?php endif; ?>
                </li> 

Страница модели

function updatePage($data){
        $data = array('content' => $content);
        $this ->db->where('id',$id);
        $this->db->update('pages',$data);
    } 

Вид:

<?php
//Setting form attributes
$formpageEdit = array('id' => 'pageEdit', 'name' => 'pageEdit');
$formInputTitle = array('id' => 'title', 'name' => 'title');
$formTextareaContent = array('id' => 'content', 'name' => 'content');
?>

<section id = "validation"><?php echo validation_errors();?></section>

<h4><?= $title ?> </h4>
<?php
echo form_open('admin/editpage/'.$page->permalink, $formpageEdit);
echo form_fieldset();
echo form_label ('Content', 'content');
echo form_textarea("content", $page['content']);
echo form_submit('submit','Submit');
echo form_fieldset_close();
echo form_close();
?> 

Контроллер:

function index(){
        if($this->session->userdata('logged_in')){

        }else{
            redirect('admin/home');
        }
       $page = $this->navigation_model->getCMSPage($this->uri->segment(3));
        $data['cms_pages'] = $this->navigation_model->getCMSPages();
        $data['title'] = $page->name;
        $data['content'] = $this->load->view('admin/editpage', array('page' => $page, TRUE));

        $this->load->view('admintemplate', $data);

    } 

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Я еще не проверял это, но это должно дать вам хорошее начало. То, что вы просите, - это совсем немного работы, чтобы быстро полностью закодировать.

Это модель page_model, это, по сути, то, что вы опубликовали с несколькими незначительными изменениями. Лучше всего использовать идентификаторы, а не строки. Вы также можете выполнить некоторые проверки htmlspecialchars или mysql hijack перед передачей их в свою БД.

<?php
/**
 * This is the Page_model model, this model handles the retrieval and modification of all pages.
 *
 **/
class Page_model extends CI_Model {
/**
 * the getCMSPage function retrieves the data from the db given the ID that was passed via $id.
 **/
    function getCMSPage($id = NULL) {
        $this->db->where('permalink', $permalink);
        $query = $this->db->get('pages', 1);

        #check to make sure row's were returned, if so continue, otherwise return false.
        if ($query->num_rows() > 0){
            #set the results into an array and return $row, should return $row['content'], and $row['id'];
            #if you were editing more than one page this is where you would use a foreach($query)
            $row = $query->result_array();
            return $row;
        }else{
            return false;
        }// END if ($query->num_rows() > 0)
    }// END function getCMSPage()
}// END Page_model class
?>

Это контроллер сайта, и ради времени я просто добавил вашу форму form_textarea прямо из функции редактирования ... вы не должны делать это, поскольку это идет вразрез со стандартами MVC. Вы должны создать представление для этой части раздела.

<?php
/**
 * This is the Site controller, primary controller for your site.
 *
 **/
class Site extends CI_Controller {
/**
 * construct function, in our case we are going to load the Posts_model , you may not want to do this.
 * 
 **/
    function __construct()
    {
        parent::__construct();
        #load Page_model, should be located in app/models/page_model.php
        $this->load->model('Page_model');
    }//END function __construct();

/**
 * edit function, this function handles retrieval of the page from the URI, and the page's content for editing.
 *
 * This function uses $id which auto retrieves the page's ID from the uri. Your URL should look similiar to:
 * http://yourdomain.com/site/edit/3/yourunecessaryinformationhere
 * everything after the id is not really required but could help with SEO.
 * 
 **/
    function edit($id){
        #retrieve the page's content in array form.
        $page = $this->Page_model->getCMSPage($id);
        echo form_textarea("content", $page['content']);
    }
}//END Site Class

Имейте в виду, что я написал это за 5-10 минут, так что это спешно и не очень хорошо прокомментировано или даже проверено, но это даст вам отличный старт. Это только дает вам пример того, как извлечь информацию из БД и отобразить ее в текстовой области. Вам все равно потребуется создать еще одну функцию в вашей page_model для вставки / обновления информации и другой фрагмент кода в вашем контроллере для передачи отредактированного содержимого в модель.

Вы можете связаться со мной по AIM или в твиттере, если у вас есть дополнительные вопросы. ThirdGenSup, твиттер @ gorelative

0 голосов
/ 13 апреля 2011
// this line
$data['content'] = $this->load->view('admin/editpage', $data);
// needs to be
$data['content'] = $this->load->view('admin/editpage', array('page' => $page, TRUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...