Главное меню
все форумы все темы форума добавить тему
Настройка своего модуля.
Добрый вечер, собственно вопрос.
Есть сайтик на своем скрипте, хочу перенести этот скрипт как модуль на вашу cms. Разбираюсь в логике вашего скрипта. Появились вопросы:
Добавил по примеру с предыдущей темы :
1) файл xml.
2)в папке модуля:
LabCMS::instance()->setModuleTemplate('mytemplate.tpl');
Tpl::instance()->assign('myvar', '1234');
3) В mytemplate.tpl :
{$_component}
{$myvar}
.
Не полностью понятны настройки при установке модуля через админку.
Главный вопрос: как вывести в определенное место на сайте мой модуль?
Спасибо.
Структура папки с дизайном у Вас будет выглядеть следующим образом:
Text

-/skins/
--/mydesign/
---/default.tpl //"сборочный" шаблон
---/mymodule/   //такое же название как у папки модуля
----/mytemplate.tpl // шаблон модуля
 

 
в mytemplate.tpl должна быть строчка {$myvar}
а {$_component} должна быть в шаблоне default.tpl ("сборочным" я его называю потому, что в нем собирается результат работы всех модулей).
Если в настройках Вашего модуля он не помечен как "компонент", то в default.tpl нужно вставить строку {$_module_mymodule} в то место, где должен отображаться модуль.
Теперь вроде бы стали понятны нюансы с технической стороны.Спасибо Вам за быстрый ответ. Тогда в админке нужно установить его, и добавить путь к папке с модулем в настройках пункта меню. Все верно?
Нет, никаких путей добавлять не надо: просто создать подкаталог модуля в каталоге kernel/modules/
Туда положить файл index.php и config.xml
После этого можно инсталлировать и подключить модуль через веб-интерфейс.
Понятно, большое Вам спасибо!
Привет,
Начал писал свой модуль. Столкнулся с проблемой: не доходит до меня, как разобраться правильно с правами? Вылетает ошибка, что нету доступа, хотя залогинен.
 
Вот код index.php:
PHP

$_GET['var1']=(!empty($_GET['var1']))?$_GET['var1']:0;
 
$adv_info=array();
switch($_GET['action'])
{
    //добавление
    case('new'):
    case(''):
        //if($_GET['var1']) $adv_info=Db::instance()->selectRow("INSERT INTO id,id_users,description FROM ?_realt_adver WHERE id_users=?",$_GET['var1']);
        break;
}
 
   
//права
 
Tpl::instance()->assign('access_add', access("add"));
 
switch (true){
    case($_GET['action']=='new' && (access("add") && $adv_info['id_users']==User::instance()->id)):
      if(!access('add')) LabCMS::instance()->error403();
      $mode="new";
      include dirname(__FILE__)."/edit_adv.php";
   
    default:
        include dirname(__FILE__)."/show.php";
}
Tpl::instance()->assign('adv_info', $adv_info);
 

..
В самом шаблоне:
Smarty

{if ($access_add && $show_advs.id_users)}
<a title="добавить" href="{url action="new" var1=$show_advs.id_users}">Добавить</a>
{/if}
 

Потом должна вылететь форма.
 
..
при клике по ссылке вылетает ошибка, "нету прав".
Извините, возможно за тупой вопрос, я просто только учусь.
1. У Вас генерация переменной $adv_info закомментирована, так что она всегда пустая.
2. можно ли взглянуть на config.xml?
3. Тестируете из под админа или из под пользователя?
 
Это лишнее:
PHP

Tpl::instance()->assign('access_add', access("add"));
 

Так имеет смысл делать, когда условие получения прав какое-то сложное. В Вашем случае эту строчку можно убрать вовсе и писать прямо в шаблоне:
Smarty

{if access('add')}...
 
поправил в шаблоне на {if access('add')},- ничего не показывает.
Тестирую из под пользователя.
Вот сам config.xml:
<module>
<name>Новый модуль</name>
<describe>Новый модуль</describe>
<version>0</version>
<component>1</component>
<access>
<permis>
<name>read</name>
<type>boolean</type>
<describe>Вывод инфы</describe>
</permis>
<permis>
<name>add</name>
<type>boolean</type>
<describe>Добавление инфы</describe>
</permis>
<permis>
<name>edit</name>
<type>boolean</type>
<describe>Редактирование своей инфы</describe>
</permis>
<permis>
<name>delete</name>
<type>boolean</type>
<describe>Удаление своей инфы</describe>
</permis>
</access>
</module>
А права группе, в которой находится пользователь, назначены?
Нет,  это нужно прописать в сам код? пользователь  в станд. группе.
Defari:
Нет,  это нужно прописать в сам код? пользователь  в станд. группе.

В админке зайти в управление группами, для нужной группы кликнуть по иконке "настроить права доступа". Там будет список модулей, имеющих настройки прав. Среди них будет и Ваш. Надо проставить права и сохранить.
А я это как раз и упустил. Спасибо Вам, за очень оперативную помощь, буду решать поставленные задачи дальше.)
Доброго времени суток!
Вот дошел до добавления AJAX в модуль)
Ну и вопрос: каким образом правильно прикрепить его в движок?
То бишь как правильно передать запрос с файла .tpl ?
$.getJSON('regions.php', {action:'getCity', region:select.value}
Ничего не происходит.. Может не правильно путь указан?
 
<form action="regions.php" method="post">
        <select name="region" onchange="loadCity(this)">
                    <option>Выберите регион</option>
                    {foreach $region as $regions}
                    <option value="{$regions.id}">
                    {$regions.name}
                    </option>
                    {/foreach}
                    
         </select>
          <select name="city" disabled="disabled">
            <option>Город</option>
        </select>
 
        <input type="hidden" name="action" value="postResult" />
        <input type="submit" value="отправить" />
         </form>
Спасибо.
Да, путь указан неправильно: надо указать вместо regions.php в структуре сайта, где подключен ajax модуль. Что-то типа /path-action.json (для типов json, xml и js не выводится отладочная информация, так что ajax ответ будет корректный).
В общем, обратиться напрямую к regions.php не получится, так как все запросы перенаправляются на index.php.
Loki:
Да, путь указан неправильно: надо указать вместо regions.php в структуре сайта, где подключен ajax модуль. Что-то типа /path-action.json (для типов json, xml и js не выводится отладочная информация, так что ajax ответ будет корректный).
В общем, обратиться напрямую к regions.php не получится, так как все запросы перенаправляются на index.php.

Мне просто нужно организовать зависимый список, который тянется из бд. А в ajax я не силен.  
Значит организовать это javascript в данном случае тоже не получится? (Например библиотекой JsHttpRequest)?
Можете посоветовать, пожалуйста, как проще выйти из данного тупика?
Значит организовать это javascript в данном случае тоже не получится?

Конечно получится - ведь JS работает на клиенте, а php -  на сервере. Просто надо прописать правильные пути в JS  и правильно настроить модуль (в данном случае компонент) на сервере.
Давайте попробуем с другой стороны подойти: какие трудности у Вас вызывает написание модуля?
Loki:

Давайте попробуем с другой стороны подойти: какие трудности у Вас вызывает написание модуля?

В принципе на данный момент по логике все понятно. Вчера поставил задачу написать зависимые списки. Сейчас имею трудности:
-как в js правильно задавать пути к php файлам т.к. tpl-ки и php файлы абсолютно в разных директориях?
-
правильно настроить модуль (в данном случае компонент)?
?
Спасибо
Прежде всего: из браузера нет никакого "обращения к файлам", есть обращение к некоему узлу в структуре сайта. К узлу подключен набор модулей. Модулям передается набор параметров, а уже модули могут обращаться к файлам.
Например, в Вашем случае это могло бы выглядеть так:
файл /kernel/modules/my_module/index.php
PHP

<?
if ($_GET['adtion']=='regions')
{
 include dirname(__FILE__).'/regions.php';
}
else
{
//действия по умолчанию
}
 

 
а из JS обращение происходит по адресу /myurl-regions.json
При этом, для простоты понимания, в regions.php можно шаблон не использовать - ограничиться просто echo и exit на конце.
Спасибо Вам большое за помощь)
Да, это все понятно. Ступор у меня произошел именно в js. Например есть "файл.js", который инклудиться в tpl - ку, как в "файл.js" правильно задать адрес сценария в серверной части (тот же regions.php)
Например:
 
<!--адрес сценария в серверной части-->
JsHttpRequest.query(
'regions.php'          - так правильно?
)
Вот так будет правильно
Javascript

JsHttpRequest.query(
'/myurl-regions.json'
)
 

так же можно воспользоваться функцией для генерации url:
Smarty

если весь обмен данными происходит в пределах модуля
{url action="regions" type="json"}
или так, если один модуль обслуживает весь сайт
{url href="/myurl" action="regions" type="json"}
 
Loki:
Вот так будет правильно
Javascript

JsHttpRequest.query(
'/myurl-regions.json'
)
 

так же можно воспользоваться функцией для генерации url:
Smarty

если весь обмен данными происходит в пределах модуля
{url action="regions" type="json"}
или так, если один модуль обслуживает весь сайт
{url href="/myurl" action="regions" type="json"}
 

мда.. все тяжелее чем я думал. Придеться учить матчасть), спасибо за направление.
А где при этом всем нужно делать запрос к бд, для подзагрузки данных во второй список?
Извините возможно за нубский вопрос. Раньше не имел дела с .json.
Defari:
А где при этом всем нужно делать запрос к бд, для подзагрузки данных во второй список?

Запрос к БД в Вашем regions.php. В какой момент от подключается я написал выше.
Defari:
Извините возможно за нубский вопрос. Раньше не имел дела с .json.

Это не "настоящий json" в данном случае это просто указание движку не выводить отладочную информацию, чтобы не поломать работу ajax парсера. Для этих целей так же используются типы xml и js - можно использовать один из них, если Вам так больше нравится. Так что json там будет только если Вы сами так решите.
Здравствуйте! Вот написал код. Зделал все как и было сказано выше. Организовал сначала с помощью jQuery. Попробовал "вне движка - все ок." Функция написана правильно. Но уже в движке ничего не работает. Firebug выбрасывает ошибку "$ is not defined " при начале функции, получается что библиотека не подключается вообще, хотя я её подключил.
Потом попробовал с библиотекой JsHttpRequest. - тоже самое, ошибка "JsHttpRequest is not defined", в строчке где " JsHttpRequest.query", хотя пути прописаны тоже. Что уже не так - не пойму..?
Заранее, спасибо.
Defari:
Здравствуйте! Вот написал код. Зделал все как и было сказано выше. Организовал сначала с помощью jQuery. Попробовал "вне движка - все ок." Функция написана правильно. Но уже в движке ничего не работает. Firebug выбрасывает ошибку "$ is not defined " при начале функции, получается что библиотека не подключается вообще, хотя я её подключил.
Потом попробовал с библиотекой JsHttpRequest. - тоже самое, ошибка "JsHttpRequest is not defined", в строчке где " JsHttpRequest.query", хотя пути прописаны тоже. Что уже не так - не пойму..?
Заранее, спасибо.

Есть тут кто?.. Так ничего и не получается...
Не находит функцию $
Проверяйте, подключен ли в Вас jQuery и отключен ли mootools.
Loki:
Не находит функцию $
Проверяйте, подключен ли в Вас jQuery и отключен ли mootools.

Спасибо, проблема решена. Оказалось что при подкл. библиотеки нужно указывать полный путь к файлу, все происходит в отдельном файлике.
Smarty

href="{url action='getcity' type="js"}"
 

Javascript

<script type="text/javascript" src="/skins/my_skin/js/JsHttpRequest.js"></script>
 

Может кому-то пригодится.
Добрый день. Сейчас дошел до разбивки контента на страницы. Все получилось так как нужно.
Есть вопрос:
 
PHP

    $advs = Db::instance()->select("SELECT r.id as total_id, UNIX_TIMESTAMP(r.datenow) as add_time, r.comment as comments, p.upload_path as upl_path
FROM ?_rent_ads r LEFT JOIN ?_realt_adv_photo_upload p ON r.id=p.id_adv ORDER BY add_time DESC LIMIT ?d, ?d"
, $pager['sql_start'], $pager['sql_limit']);
 

 
Как из p.upload_path выбрать только 1 запись, если в бд:
 
id_adv|upload_path
167   |601_50.jpg
167   |3484_64.jpg
 
Получается что pager выводит в цикле foreach с 1 id 2 раза тот же блок но с разным фото.
Большое спасибо.
Ну pager в общем-то и предназначен для вывода списков. Если надо выбрать одну строку, то pager и не нужен вовсе:
PHP

$adv = Db::instance()->selectRow("SELECT r.id as total_id, UNIX_TIMESTAMP(r.datenow) as add_time, r.comment as comments, p.upload_path as upl_path
FROM ?_rent_ads r LEFT JOIN ?_realt_adv_photo_upload p ON r.id=p.id_adv WHERE id_adv=?"
, $someId);
 
Именно список я и вывожу, выбираю из бд по уник. id, потом разделяю по n-блоков на страницу.
PHP

foreach($advs as $key=>$theme)
    {  
        $advs[$key]['adverts']    =    ceil($theme['total_id']/LabConfig::$mcfg['adv_at_page']);
    }
    Tpl::instance()->assign('pager', $pager);
    Tpl::instance()->assign('advs', $advs);
 

Получается, что выводит 2 блока(второй - копия, только с разным  p.upload_path) с id 167(например), потому что к этому id в другой табл. относится 2 фото. Нужно вывести каждый блок с уник. id 1 раз...
С selectRow так не получится...
Похоже что у Вас просто ошибка в sql запросе - там не обозначена группировка. Если id не должны повторяться, то должна присутствовать группировка по этому полю:
MySQL

SELECT r.id as total_id, UNIX_TIMESTAMP(r.datenow) as add_time, r.comment as comments, p.upload_path as upl_path
FROM ?_rent_ads r
LEFT JOIN ?_realt_adv_photo_upload p ON r.id=p.id_adv
GROUP BY total_id
ORDER BY add_time DESC
LIMIT ?d, ?d