Главное меню
Настройка своего модуля.
Добрый вечер, собственно вопрос.
Есть сайтик на своем скрипте, хочу перенести этот скрипт как модуль на вашу 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