1 Отредактировано Соглядатай S (21-05-2015 04:25:26)

Тема: Разработка модуля imageCMS (вопросы)

День добрый!

Создаю первый модуль, за основу взял модуль редиректа (/modules/trash).
Свою таблицу вывел, удаление сделал. С редактированием и добавлением начались проблемы.

Мой код на удаление (еще не доделано):

function edit_city($id)
    {
        $query = $this->db->get_where('mod_mez_cities', array('id' => $id));
        //$this->template->add_array(array('mod_mez_cities' => $query->row()));

        if (!$this->ajaxRequest) {
            $this->display_tpl('edit_city');
        }
    }

При редактировании в админке получаю ошибку:

Fatal error: Call to undefined method Admin::display_tpl() in C:\OpenServer\domains\prot.loc\application\modules\mez_cities\admin.php on line 47

Перепроверил все в модуле trash - этот же код вызова шаблона там успешно работает.
Что я делаю не так?

Thumbs up Thumbs down

2

Re: Разработка модуля imageCMS (вопросы)

Покажите функцию display_tpl в Admin.php

Когда то разрабатывал модули для ImageCMS Corporate

Re: Разработка модуля imageCMS (вопросы)

Sempai пишет:

Покажите функцию display_tpl в Admin.php

А её у меня и не было!
Я подумал, что это встроенная в ядро ф-ция, что ищет шаблоны в определенной папке. Ну и что её дополнительно определять не нужно, соответственно.

Теперь все работает.
Большое спасибо!

Thumbs up Thumbs down

4 Отредактировано Соглядатай S (17-05-2015 15:11:05)

Re: Разработка модуля imageCMS (вопросы)

Еще такой вопрос.
Есть следующий код при установке:

$this->db->where('name', 'mod_mez_cities');
        $this->db->update('components', array('enabled' => 0, 'autoload' => 1));

Как я понял из документации, он отключает доступ по URL к модулю и включает автозагрузку.

Тем не менее, после установки я наблюдаю три отключенных чекбокса в списках модулей.
Почему нет автозагрузки?

Thumbs up Thumbs down

5

Re: Разработка модуля imageCMS (вопросы)

Попробуйте так:

$this->db->update('components', array('autoload' => '1', 'enabled' => '0'));

Без доступа по URL, autoload походу клинит... smile

Когда то разрабатывал модули для ImageCMS Corporate

Re: Разработка модуля imageCMS (вопросы)

Sempai пишет:

Попробуйте так:

$this->db->update('components', array('autoload' => '1', 'enabled' => '0'));

Без доступа по URL, autoload походу клинит... smile

Нашел проблему. В таблице модулей модуль обзывается уже без префикса "mod_", а я искал с префиксом.
Теперь работает.

Thumbs up Thumbs down

Re: Разработка модуля imageCMS (вопросы)

А как добавить всплывающее сообщение при изменении: изменения сохранены, запросов в базу: x ?

Thumbs up Thumbs down

8

Re: Разработка модуля imageCMS (вопросы)

Ты модули стандартные вообще смотрел?

В первую очередь, структура модуля должна быть стандартной как минимум
http://docs.imagecms.net/razrabotchikam … ie-modulei

код файла admin.php примерно такой


class Admin extends BaseAdminController {

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

        //Подкулючаем модель из папки models
        $this->load->model('pricer_model');

        // Подключаем языковые пакеты
        $lang = new MY_Lang();
        $lang->load('pricer');

    }
    //То что показывыем при переходе в сам модуль
    public function index() {
        \CMSFactory\assetManager::create()
            ->setData(array(
                'categories' => $this->getCategoryListItemTree()
            ))
            ->renderAdmin('category/list');
    }

    public function addCategory(){

        if ($this->input->post()) {

            $this->load->library('Form_validation');
            $this->form_validation->set_rules('name', lang('Название', 'pricer'), 'trim|required|xss_clean');
            $this->form_validation->set_rules('parent_id', lang('Родитель', 'pricer'), 'trim|xss_clean|numeric');

            if ($this->form_validation->run($this) !== FALSE) {

                $data = array(
                    'name' => $_POST['name'],
                    'parent_id' => (int)$_POST['parent_id'],
                    'status' => (int)$_POST['status'],
                );

                try {

                    $lid = $this->pricer_model->addCategory($data);

                    showMessage(lang('Создано', 'pricer'));

                    if ($this->input->post('action') == 'tomain') {
                        pjax('/admin/components/cp/pricer');
                    } elseif ($this->input->post('action') == 'toedit') {
                        pjax('/admin/components/cp/pricer/editCategory/' . $lid);
                    }

                } catch (Exception $e) {
                    showMessage($e->getMessage(), '', 'r');
                }
            } else {
                showMessage(validation_errors(), false, 'r');
            }
        } else {

            \CMSFactory\assetManager::create()
                ->setData(array(
                    'categories' => $this->pricer_model->getCategoryListItem()
                ))
                ->renderAdmin('category/add');
        }
    }

    public function editCategory($id){

        if ($_POST) {

            $this->load->library('Form_validation');
            $this->form_validation->set_rules('name', lang('Name', 'pricer'), 'trim|required|xss_clean');
            $this->form_validation->set_rules('parent_id', lang('Родитель', 'pricer'), 'trim|xss_clean|numeric');

            if ($this->form_validation->run($this) != FALSE) {

                $data = array(
                    'id' => (int)$id,
                    'parent_id' => (int)$_POST['parent_id'],
                    'name' => $_POST['name'],
                    'status' => (int)$_POST['status'],
                );

                $this->pricer_model->editCategory($data);


                showMessage(lang('Отредактировано', 'pricer'));

                if ($this->input->post('action') == 'tomain') {
                    pjax('/admin/components/cp/pricer');
                }

            } else {
                showMessage(validation_errors(), false, 'r');
            }
        } else {

            \CMSFactory\assetManager::create()
                ->setData(array(
                    'category' => $this->pricer_model->getCategoryItem($id),
                    'categories' => $this->pricer_model->getCategoryListItem()
                ))
                ->renderAdmin('category/edit');
        }

    }

    public function deleteCategory(){

        if (!empty($_POST['ids'])) {

            foreach ($_POST['ids'] as $id) {
                $this->db->delete('mod_pricer_category', array('id' => $id));
            }

            showMessage(lang("Удалено", 'pricer'));
        } else {
            showMessage(lang('Обьект не найден', 'pricer'), '', 'r');
        }
    }
}

Все операции с БД выносим в модели

class Pricer_model extends CI_Model{

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

    public function addCategory($data) {
        $this->db->insert('mod_pricer_category', $data);

        if ($this->db->_error_message()) {
            throw new Exception($this->db->_error_message());
        }

        $lid = $this->db->insert_id();

        return $lid;
    }

    public function editCategory($data) {

        $this->db
            ->where('id', $data['id'])
            ->update('mod_pricer_category', $data);

        if ($this->db->_error_message()) {
            throw new Exception($this->db->_error_message());
        }

    }

    public function getCategoryItem($id) {

        $this->db
            ->where('id', $id)
            ->from('mod_pricer_category');
        $query = $this->db->get();

        $category = $query->result_array();

        if ($this->db->_error_message()) {
            throw new Exception($this->db->_error_message());
        }

        return $category[0];

    }

    public function getCategoryListItem() {

        $this->db->from('mod_pricer_category');

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

        $category_row = $query->result_array();

        if ($this->db->_error_message()) {
            throw new Exception($this->db->_error_message());
        }

        return $category_row;
    }
}

В  большинстве случаев этого достаточно.

Все шаблоны лежат в папке asset/admin
Для публичной части в папки asset/public

9 Отредактировано Соглядатай S (19-05-2015 16:39:20)

Re: Разработка модуля imageCMS (вопросы)

RainMEN пишет:

Ты модули стандартные вообще смотрел?

Конечно, указанную статью также. На основе стандартных модулей и делаю.
Я как раз и задаю конкретные вопросы, если что-то найти не получается.

С отображением сообщения разобрался, необходимо было добавить это:

if ($this->input->post('action')) {
            showMessage("Изменения сохранены!");
        }

Только количество запросов больно большое - 21 штука. Один на обновление моей записи, а остальные на что тогда?

Thumbs up Thumbs down

10 Отредактировано Соглядатай S (21-05-2015 06:12:35)

Re: Разработка модуля imageCMS (вопросы)

Народ, а как вызывать функции модуля без его загрузки?

Сейчас я каждый раз пишу так:

{$CI->load->module('my_module')->my_func();}

У меня включена автозагрузка модуля... как сократить код?

например:

{module('my_module')->my_func();}

Также как я могу узнать, установлен/подключен ли модуль? Это нужно перед его выводом.

Thumbs up Thumbs down