Opencart 2.x - Создаем Модуль (ocmod)

Тема в разделе "Модули и дополнения", создана пользователем admin, 6 ноя 2016.

  1. TopicStarter Overlay
    Online

    admin Команда форума Администратор

    Сообщения:
    1.659
    Симпатии:
    31.429
    Репутация:
    129
    Для понимания сути, немного предисловия…

    Расширения в OpenCart 2.х это новые возможности, позволяющие создавать модули с возможностью безопасного изменения файлов шаблона, системы и сторонних модулей.

    Раньше установка модулей в OpenCart до версии 2.х происходила простым копированием директорий с файлами модуля в CMS. Желательно, чтобы файлы модуля не заменяли уже существующие файлы системы.

    Я описывал ранее, как создавать модули для OpenCart до версии 2.х. Если в вкратце, то задача заключалась в создание 6-и файлов:
    1. файл представления модуля: catalog\view\theme\default\template\module\myModul.tpl
    2. контроллер модуля: catalog\controller\module\myModul.php
    3. языковой файл: catalog\language\russian\module\myModul.php
    4. файл представления модуля для панели администратора: admin\view\template\module\myModul.tpl
    5. контроллер модуля для панели администратора: admin\controller\module\myModul.php
    6. языковой файл модуля для панели администратора: admin\language\russian\module\myModul.php
    Это идеальный случай, т.к. эти файлы контроллеров и представлений носят имя модуля и поэтому они не заменяют файлы других модулей.

    Но иногда, необходимо, когда модуль должен изменить функционал в уже существующих файлах шаблона, а то и системным файлов движка OpenCart. Раньше, приходилось создавать файлы в модуле, которые заменяли файлы в CMS, называть этот процесс безопасным нельзя, т.к. мы лезли не в свою колокольню. Эти замены могли негативно повлиять на работу системы, приходилось быть очень аккуратным. В случае краха, для отката назад, было необходимо обратно копировать замененные файлы, что не удобно.

    Этот момент в OpenCart 2.х был продуман, как результат, была разработана система установки модулей OCMOD, модули стали называть расширениями.

    Итак, как создавать модули (расширения) для OpenCart 2.x?

    Итак, расширение в OpenCart 2.х это PHP, SQL и XML файлы в zip архиве, с именем имя_модуля.ocmod.zip.

    Расширение состоит из:

    • upload (директория)
    • install.sql (файл)
    • install.php (файл)
    • install.xml (файл)
    upload
    Директория в которой расположены файлы, они будут загружены в корень директории OpenCart

    install.sql
    Файл sql запроса, который будет выполнен при установке расширения

    install.php
    PHP скрипт, который выполниться при установке расширения

    install.xml
    XML файл модификатор (что это такое, об этом позже)

    Теперь важный момент! Наличие полного набора вышеуказанных файлов в расширение не обязательно, т.е. не обязательно иметь PHP, SQL и XML файлы в модуле. Рассмотрим два крайних варианта, из чего может состоять расширение:

    1. Расширение может состоять только из директории upload в архиве. В этом случае, расширение представляет собой «класический» модуль в OpenCart до версий 2.х, т.е. просто файлы, который скопируются в корень системы.
    2. Расширение может состоять из одного файла install.xml. В этом случае, файл должен иметь имя имя_модуля.ocmod.xml, загружается он в панель управления в «чистом» виде, не в архиве.

    Вариант №1 — расширение состоит только из директории upload


    Внутри директории, мы создадим 6 файлов как в статье «создаем модуль в OpenCart», но с поправками для OpenCart 2.х.

    1. Языковой файл: catalog\language\russian\module\mymodul.php

    Код:
    <?php
    $_['heading_title']='Заголовок модуля';
    В данном файле, мы описываем переменные с данными (обычно текстом), которые будем использовать в нашем модуле.

    2. Контроллер: catalog\controller\module\mymodul.php

    Код:
    <?php
    classControllerModulemymodulextendsController{
    publicfunctionindex(){
    
    $this->load->language('module/mymodul');//подключаем любой языковой файл
    $data['heading_title']=$this->language->get('heading_title');//объявляем переменную heading_title с данными из языкового файла
    
    $data['content']="Ваш контент";//можно задать данные, сразу в контроллере
    
    $this->load->model('catalog/product');//подключаем любую модель из OpenCart
    
    $data['product_info']=$this->model_catalog_product->getProduct(42);//используем метод подключенной модели, например getProduct(42) – информация о продукте id 42
    
    //стандартная процедура для контроллеров OpenCart, выбираем файл представления модуля для вывода данных
    if(file_exists(DIR_TEMPLATE.$this->config->get('config_template').'/template/module/mymodul.tpl')){
    return$this->load->view($this->config->get('config_template').'/template/module/mymodul.tpl',$data);
    }else{
    return$this->load->view('default/template/module/mymodul.tpl',$data);
    }
    
    }
    }?>
    Первое, на что стоит обратить внимание, на имя класса «ControllerModulemymodul», первая часть «ControllerModule» стандартная, вторая «mymodul» это имя вашего модуля. В каждом файле нужно придерживаться одного имени.

    В контроллере, с помощью массива $data[‘имя’] объявляют переменные, которые будут видны в файле представления модуля. Как правило, это данные (текст) полученные из языкового файла или данные полученные из моделей.

    Если мы хотим получить данные из языкового файла, сначала, его необходимо подключить с помощью метода

    Код:
    $this->load->language('директория/файл');
    Где
    • «директория» это имя директории, где находится языковой файл (обычно лежат в catalog/language/russian и в catalog/language/english)
    • «файл» это имя языкового файла без «.php»
    Также в контролере модуля, можно сразу задать какие либо данные, используя

    Код:
    $data[‘имя’]=«моя строка»
    Но это не рекомендуется, т.к. данные желательно хранить в БД или в языковых файлах, а не в контроллерах.

    В своем контроллере модуля, мы можем использовать любые модели OpenCart. Для этого, необходимо подключить модель с помощью метода:

    Код:
    $this->load->model('директория/модель');
    Где
    • «директория» это имя директории где находится модель (модели располагаются в директории catalog/model)
    • «модель» это имя модели, по сути это имя файла модели без «.php».

    Далее, можно использовать методы подключенной модели

    Код:
    $results=$this->model_директория_модель->метод_модели(параметры);
    P.S. Для того что-бы узнать, какие есть методы у модели, придется смотреть файл модели.

    В примере, метод getProduct возвращает массив данных с информацией по продукту, аргумент метода — id номер продукта. Под id 42, в свежем установленном OpenCart-е, должен быть монитор «Apple Cinema 30″».

    3. Файл представления: модуля catalog\view\theme\default\template\module\mymodul.tpl

    Код:
    <?phpecho$heading_title;?>
    <br>
    <?phpecho$content;?>
    <br>
    <?phpecho$product_info['name'];?>
    Эти минимальный вариант файла представления, я просто вывожу все переменные, которые я объявил в контроллере. В вашем случае, должен быть html код с php.

    4. Языковой файл модуля для панели администратора: admin\language\russian\module\mymodul.php

    Код:
    <?php
    // Имя модуля, такой он будет виден на вкладке «модули» в панели управления и внутри настроек модуля
    $_['heading_title']='Мой модуль';
    
    //Текст внутри настроек модуля
    $_['text_module']='Модули';
    $_['text_edit']='Настройки модуля';
    $_['entry_status']  ='Статус';
    Комментировать думаю нечего, данные текстовые данные будут видны в представление модуля для панели администратора.

    5. Контроллер модуля для панели администратора: admin\controller\module\mymodul.php

    Код:
    <?php
    classControllerModulemymodulextendsController{
    private$error=array();
    
    publicfunctionindex(){
    $this->load->language('module/mymodul');//подключаем наш языковой файл
    
    $this->load->model('setting/setting');  //подключаем модель setting, он позволяет сохранять настройки модуля в БД
    
    if(($this->request->server['REQUEST_METHOD']=='POST')&&$this->validate()){//если мы нажали "Сохранить" в панели, мы сохраняем текущие настройки
    $this->model_setting_setting->editSetting('mymodul',$this->request->post);
    $this->response->redirect($this->url->link('extension/module','token='.$this->session->data['token'],'SSL'));
    }
    
      // ваши переменные
    $data['heading_title']=$this->language->get('heading_title');
    $data['text_edit']=$this->language->get('text_edit');
    $data['text_enabled']=$this->language->get('text_enabled');
    $data['text_disabled']=$this->language->get('text_disabled');
    
    $data['entry_status']=$this->language->get('entry_status');
    
    // если метод validate вернул warning, передадим его представлению
    if(isset($this->error['warning'])){
    $data['error_warning']=$this->error['warning'];
    }else{
    $data['error_warning']='';
    }
    
    // далее идет формирование массива breadcrumbs (хлебные крошки)
    $data['breadcrumbs']=array();
    $data['breadcrumbs'][]=array(
    'text'=>$this->language->get('text_home'),
    'href'=>$this->url->link('common/dashboard','token='.$this->session->data['token'],'SSL')
    );
    $data['breadcrumbs'][]=array(
    'text'=>$this->language->get('text_module'),
    'href'=>$this->url->link('extension/module','token='.$this->session->data['token'],'SSL')
    );
    $data['breadcrumbs'][]=array(
    'text'=>$this->language->get('heading_title'),
    'href'=>$this->url->link('module/category','token='.$this->session->data['token'],'SSL')
    );
    
    //ссылки для формы и кнопки "cancel"
    $data['action']=$this->url->link('module/mymodul','token='.$this->session->data['token'],'SSL');
    $data['cancel']=$this->url->link('extension/module','token='.$this->session->data['token'],'SSL');
    
    //переменная с статусом модуля
    if(isset($this->request->post['mymodul_status'])){
    $data['mymodul_status']=$this->request->post['mymodul_status'];
    }else{
    $data['mymodul_status']=$this->config->get('mymodul_status');
    }
    
    //ссылки на контроллеры header,column_left,footer, иначе мы не сможем вывести заголовок, подвал и левое меню в файле представления
    $data['header']=$this->load->controller('common/header');
    $data['column_left']=$this->load->controller('common/column_left');
    $data['footer']=$this->load->controller('common/footer');
    
    //в качестве файла представления модуля для панели администратора использовать файл mymodul.tpl
    $this->response->setOutput($this->load->view('module/mymodul.tpl',$data));
    }
    
    //обязательный метод в контроллере, он запускается для проверки разрешено ли пользователю изменять настройки данного модуля
    protectedfunctionvalidate(){
    if(!$this->user->hasPermission('modify','module/category')){
    $this->error['warning']=$this->language->get('error_permission');
    }
    return!$this->error;
    }
    }
    В качестве донора я взял контроллер админки модуля категорииadmin\controller\module\category.php, единственное что я заменил:

    Имя класса

    Код:
    classControllerModuleCategoryextendsController{
    на

    Код:
    classControllerModulemymodulextendsController{
    Имя языкового файла

    Код:
    $this->load->language('module/category');
    на

    Код:
    $this->load->language('module/mymodul');
    Имя модуля, в методе редактирования настроек модуля

    Код:
    $this->model_setting_setting->editSetting('category',$this->request->post);
    на

    Код:
    $this->model_setting_setting->editSetting('mymodul',$this->request->post);
    Имя представления данного модуля для панели администратора

    Код:
    $this->response->setOutput($this->load->view('module/category.tpl',$data));
    на

    Код:
    $this->response->setOutput($this->load->view('module/mymodul.tpl ',$data));
    Имя модуля в определение переменной ‘action’

    Код:
    $data['action']=$this->url->link('module/category','token='.$this->session->data['token'],'SSL');
    на

    Код:
    $data['action']=$this->url->link('module/mymodul','token='.$this->session->data['token'],'SSL');
    Имя параметра в приеме POST/GET сообщений

    Код:
    if(isset($this->request->post['category_status'])){
    
      $data['category_status']=$this->request->post['category_status'];
    
    }else{
    
      $data['category_status']=$this->config->get('category_status');
    
    }
    на

    Код:
    if(isset($this->request->post['mymodul_status'])){
    
      $data['mymodul_status']=$this->request->post['mymodul_status'];
    
    }else{
    
    $data['mymodul_status']=$this->config->get('mymodul_status');
    
    }
    Имя модуля в методе validate()

    Код:
    if(!$this->user->hasPermission('modify','module/category')){
    на

    Код:
    if(!$this->user->hasPermission('modify','module/mymodul ')){
    Контроллер модуля для панели управления, это самая сложная часть. Он состоит из двух методов:
    • index()
    • validate()
    Метод index() – принимает POST данные с файла представления модуля в админке (в настройках модуля), за это отвечает код до комментария «//ваши переменные», он обязателен для всех контроллеров.

    После комментария «//ваши переменные», идет объявление переменных
    • $data[‘heading_title’],
    • $data[‘text_edit’],
    • $data[‘text_enabled’],
    • $data[‘text_disabled’],
    • $data[‘entry_status’]
    Вы можете добавить свои переменные.

    Текст берутся из языкового файла «module/mymodul», который был подключен ранее.

    Данные переменные используются в файле представления модуля в админке, здесь я привел минимум что нужно.

    Далее, идет проверка разрешено-ли пользователю изменять настройки данного модуля (проверка есть ли переменная «warning»), если нет, формируем переменную $data[‘error_warning’] с текстом ошибки. Этот фрагмент кода обязателен.

    После чего формируется массив «breadcrumbs», другими словами это «хлебные крошки» для файла представления.




    mymodul_breadcrumbs.jpg
    В конце метода index(), выбираем файл представления для вывода данных $data.

    Метод index() вызывает метод validate(), он служит для проверки разрешено ли пользователю изменять настройки данного модуля, он обязателен.

    6. Файл представления модуля для панели администратора: admin\view\template\module\mymodul.tpl

    Код:
    <?phpecho$header;?><?phpecho$column_left;?>
    <div id="content">
    <div class="page-header">
    <div class="container-fluid">
    <div class="pull-right">
    <button type="submit"form="form-mymodul"data-toggle="tooltip"title="<?phpecho$button_save;?>"class="btn btn-primary"><i class="fa fa-save"></i></button>
    <a href="<?phpecho$cancel;?>"data-toggle="tooltip"title="<?phpecho$button_cancel;?>"class="btn btn-default"><i class="fa fa-reply"></i></a></div>
    <h1><?phpecho$heading_title;?></h1>
    <ul class="breadcrumb">
    <?phpforeach($breadcrumbsas$breadcrumb){?>
    <li><a href="<?phpecho$breadcrumb['href'];?>"><?phpecho$breadcrumb['text'];?></a></li>
    <?php}?>
    </ul>
    </div>
    </div>
    <div class="container-fluid">
    <?phpif($error_warning){?>
    <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?phpecho$error_warning;?>
    <button type="button"class="close"data-dismiss="alert">&times;</button>
    </div>
    <?php}?>
    <div class="panel panel-default">
    <div class="panel-heading">
    <h3 class="panel-title"><i class="fa fa-pencil"></i> <?phpecho$text_edit;?></h3>
    </div>
    <div class="panel-body">
    <form action="<?phpecho$action;?>"method="post"enctype="multipart/form-data"id="form-mymodul"class="form-horizontal">
    <div class="form-group">
    <label class="col-sm-2 control-label"for="input-status"><?phpecho$entry_status;?></label>
    <div class="col-sm-10">
    <select name="mymodul_status"id="input-status"class="form-control">
    <?phpif($mymodul_status){?>
    <option value="1"selected="selected"><?phpecho$text_enabled;?></option>
    <option value="0"><?phpecho$text_disabled;?></option>
    <?php}else{?>
    <option value="1"><?phpecho$text_enabled;?></option>
    <option value="0"selected="selected"><?phpecho$text_disabled;?></option>
    <?php}?>
    </select>
    </div>
    </div>
    </form>
    </div>
    </div>
    </div>
    </div>
    <?phpecho$footer;?>
    Донором был — модуль категории (admin\view\template\module\category.tpl), единственное что я сделал:

    Заменил в теге <button>

    Код:
    form="form-category"
    на

    Код:
    form="form-mymodul"
    Заменил в теге <form>

    Код:
    id="form-category"
    на

    Код:
    id="form-mymodul"
    Заменил в теге <select>

    Код:
    name="category_status"
    на

    Код:
    name="mymodul_status"
    Хочу обратить внимание, что связка контроллера модуля для админки (пункт 5) и представления модуля для админки (пункт 6) в данном случае, обеспечивают минимальную страницу настройки модуля. в данном случае будет выбор статуса «Включено» или «Отключено».

    Для дополнительных полей — опций, нужно смотреть контроллеры и представления других модулей, делайте все по образцу.

    Поместим выше созданных 6-есть файлов в соответствующие директории (так, как бы они размещались в системе OpenCart), далее помещаем эти директории в директорию «upload», архивируем её в zip формат с именем с именем «mymodule.ocmod.zip»

    Далее зайдем в панель администрирования, далее «Установка расширений», нажимаем загрузить и выбираем наш zip файл.


    mymodul_setting.jpg

    Система покажет нам, какие файлы будут загружены. Нажимаем «продолжить«.

    Теперь, если перейти на вкладку «Модули», мы увидим наш модуль «Мой модуль».


    mymodul_setting_2.jpg



    За имя модуля в панели управления отвечает параметр $_[‘heading_title’] языкового файла «admin\language\russian\module\mymodul.php»

    Далее, все как обычно, мы активируем модуль, заходим в его настройки и изменяем статус на «Включено«.



    mymodul_setting_3.jpg
    Повторюсь, в модуле должна быть как минимум опция «статус», этим мы даем системе знать, использоватьнаш модуль или нет. При желание, можно дописать еще опции, но в этом случае, придется править файл представления.

    Код:
    admin\view\template\module\mymodul.tpl
    и контроллер

    Код:
    admin\controller\module\mymodul.php
    Действовать также, по аналогии с другими модулями.

    Далее нужно выбрать для какого макета (до версии 2.x это называлось «схемы») применить данный модуль. Переходим в «Макеты», выбираем в качестве примера макет главной страницы «Home» -> «Редактировать», нажимаем «Добавить», выбираем «Мой модуль», нажимаем «Сохранить».

    mymodul_install.jpg

    Теперь, если мы зайдем на главную страницу, то мы должны увидеть примерно следующие:

    mymodul_work.jpg

    На главной, в красной рамке я обвел, то-что вывел наш модуль. Модуль работает.

    Вариант №2 — расширение это файл «имя_модуля.ocmod.xml»

    Файл «имя_модуля.ocmod.xml» называют «модификатор», согласно нему, происходит создание виртуальных копий файлов, которые требуют изменений. Примерно так написано в переводе на русский в официальной документации. Другими словами, в этом файле написано, что «на лету» нужно добавить или убрать в выбранных файлах, т.е. изменения будут виртуальными, файлы останутся без изменений.

    Это решает проблему, которую я обозначил в начале статьи, что иногда, приходится править файлы системы и для отката назад, необходимо копировать оригинальные файлы обратно. В случае использования «модификаторов», для отката назад, мы просто отключаем его.

    Файл «имя_модуля.ocmod.xml» имеет следующую структуру:

    Код:
    <?xml version="1.0"encoding="utf-8"?>
    <modification>
    <name>Modification Default</name>
    <code>mymodule</code>
    <version>1.0</version>
    <author>OpenCart Ltd</author>
    <link>http://www.opencart.com</link>
    <filepath="catalog/controller/common/home.php">
    <operation>
    <search trim="true|false"index="1"><![CDATA[
    $data['column_left']=$this->load->controller('common/column_left');
    ]]></search>
    <add position="replace"offset="1"><![CDATA[
    test123
    ]]></add>
    </operation>
    </file>
    </modification>
    Теги name, code, version, author, link носят информационный характер, не буду на них акцентировать внимание.

    Нам важен тег file и все его содержимое. Атрибут path указывает путь к изменяемому файлу, также есть возможность использовать маски и множественный выбор сразу несколько файлов (см. php функцию glob, модификаторы используют данную функцию). Тегов file может быть несколько.

    Тег operation согласно документации не имеет атрибутов

    Тег search, говорит, что нужно найти в вышеуказанном файле. Атрибут trim (true|false) указывает удалять ли пробелы, index – номер найденной позиции (например, по данному search найдутся три строки, так index это выбор с какой именно мы работаем). Атрибут regex (true|false) говорит, будут ли использоваться регулярные выражения при поиске.

    В теле <![CDATA[ … ]]> мы указываем, что нам нужно найти, обычно это фрагмент кода.

    Тег add говорит, что нужно сделать с найденной строкой, атрибут position описывает:
    • replace – заменить;
    • before – вставить до;
    • after – вставить после.
    Атрибут trim указывает удалять ли пробелы, offset позволяет перейти на указанное количество строкотносительно найденной строки. Значение может быть отрицательное.

    В теле <![CDATA[ … ]]> мы прописываем на что мы хотим заменить найденную строку (или что хотим вставить до или после найденной строки).

    Создадим пробный модификатор — файл mymodul2.ocmod.xml. Его задача очень простая, модуль «категории» выводит список категорий с количеством позиций в скобках.



    category_before.jpg

    Мы хотим, чтобы модуль больше не выводил количество позиций в категориях (т.е. без скобок). Для этого нужно, в контроллере модуля (catalog/controller/module/category.php) 58 строку:

    Код:
    'name' =>$category['name'].($this->config->get('config_product_count')?' ('.$this->model_catalog_product->getTotalProducts($filter_data).')':''),
    заменить на

    Код:
    'name' =>$category['name'],
    Файл «mymodul2.ocmod.xml» наполним следующим содержимым:

    Код:
    <?xml version="1.0"encoding="utf-8"?>
    <modification>
    <name>Категории без количества</name>
    <code>mymodule</code>
    <version>1.0</version>
    <author>lowenet</author>
    <link>lowenet.biz</link>
    <file path="catalog/controller/module/category.php">
    <operation>
    <search><![CDATA[
    'name' =>$category['name'].($this->config->get('config_product_count')?' ('.$this->model_catalog_product->getTotalProducts($filter_data).')':''),
    ]]></search>
    <add position="replace"><![CDATA[
    'name' =>$category['name'],
    ]]></add>
    </operation>
    </file>
    </modification>
    Для установки модификатора, как обычно заходим в «установка расширений», нажимаем «загрузить» и выбираем наш xml файл. Теперь наш модификатор установлен, если мы зайдем в «модификаторы», то в списке мы увидим наш модификатор с именем «Категории без количества».

    modificator_list.jpg
    Модификатор включен, но для его запуска, необходимо обновить кэш, для этого жмем кнопку «Обновить» (при каждом включение/выключение модификаторов необходимо обновлять кэш.).

    Теперь модуль «категории» выводит список категорий без количества наименований.



    category_after.jpg

    Если нам нужно вернуть как было раньше, отключаем модификатор и жмем «Обновить».

    Для отладки, думаю вам захочется посмотреть, как выглядит измененный файл. В директории system/storage/modification находятся директории с файлами, это результат работы модификаторов. Наш файл находится по адресу system/storage/modification/catalog/controller/module/category.php. Если мы в него заглянем, то на 58 строке увидим:

    Код:
    'name' =>$category['name'],
    Т.е. модификатор сработал, так как мы задумывали.

    Итог

    Теперь, когда мы рассмотрели два крайних варианта модуля, не составит труда создавать «смешанные» модули, где есть папка upload и файл install.xml. Если вы хотите, чтобы ваш модуль использовал свои таблицы в БД или свои столбцы в уже созданных таблицах, то вы, можете обогатить его, с помощью файла install.sql. Он содержит SQL запрос, который выполнится при установке модуля.

    Про install.php могу сказать, что он запускается при установке модуля, пример применения я привести не могу, т.к. не использовал его на практике.
     
    cssgnom, Kostroma-Andrey, irk3n и ещё 1-му нравится это.
  2. Offline

    Serega PS

    Сообщения:
    28
    Симпатии:
    18
    Репутация:
    0
    админ ты слишком сложно разъясняешь суть создания модуля! он у тебя выглядит сложным хоть это и не так!
    там все гораздо проще в зависимости от функционала!
    да и когда пишиеш подобное

    PHP:
    $results=$this->model_директория_модель->метод_модели(параметры);
    ты пиши и оригинал многие люди не опытны и понятие программирования им сложно дается

    если ты делаеш для тех кто пытается создать с нуля модуль не имея опыт ты им объясни что такое переменные
    В данном файле, мы описываем переменные с данными (обычно текстом), которые будем использовать в нашем модуле.

    касательно сообщений тыб вставку php html и тд вывел в отдельные строки чтоли!

    раз пошла такая пьянка мб любям покажеш как выводить текст с админки через модуль в футер и хедер? создавать новые позиции с выводом тут или там и с креплением к тому и другому?)
    помница я создавал тему позиций но в новом сайте его потеряли как и мои данные)
     
    admin нравится это.
  3. TopicStarter Overlay
    Online

    admin Команда форума Администратор

    Сообщения:
    1.659
    Симпатии:
    31.429
    Репутация:
    129
    спасибо за критику. учтем обязательно. хочется дать людям не только модули и шаблоны. а еще и знания, как и что сделать своими руками. думаю все поддержат и будем продвигать.
     
  4. Offline

    Serega PS

    Сообщения:
    28
    Симпатии:
    18
    Репутация:
    0
    если ты забыл ты меня и модером делал а после кинул в вип когда еще на старом был дарк джокер!

    на счет подобных я сам буду стараться по времени писать и давать людям советы! как выводить в хеадере футере и тд и тп! но пока занят заказами! еще 7 сайтов по расписанию!
     
    Последнее редактирование модератором: 6 ноя 2016
    admin нравится это.
  5. TopicStarter Overlay
    Online

    admin Команда форума Администратор

    Сообщения:
    1.659
    Симпатии:
    31.429
    Репутация:
    129
    ждем от тебя понятных и добрых статей с модулями! удачной работы во фрилансе ;) Джокер забанен навсегда.
     
  6. Offline

    Serega PS

    Сообщения:
    28
    Симпатии:
    18
    Репутация:
    0
    @Serega PS,
    это я вкурсе! по мне не по людски когда у 1 ломают сайт, а тот вывешивает свой с тем у кого ломанули! блядство и не более! прошу прощение за мат! такую гниль в топку!
     
    admin нравится это.
  7. Offline

    Serega PS

    Сообщения:
    28
    Симпатии:
    18
    Репутация:
    0
    спасибо друг! обязательно вывешу! как вешать в футер, хеадер и тд и тп! и делать текстовые блоки! хотя модуль тоже вывешу! но хочу доработать! чтобы все было сразу в настройках!
     
    admin нравится это.
  8. Offline

    апа Пользователь

    Сообщения:
    19
    Симпатии:
    4
    Репутация:
    0
    для наглядности примеров
    чик, логика работы
    1.controller
    2.view
    3.language
    4.model
    [​IMG]
    чик, структура папок
    [​IMG]
     
    admin нравится это.
  9. Offline

    cssgnom Пользователь

    Сообщения:
    15
    Симпатии:
    0
    Репутация:
    0
    Спасибо
    Очень интересная статья )