Полезное (с комментариями)

10 views
Skip to first unread message

ButscH

unread,
Feb 19, 2009, 2:05:14 AM2/19/09
to Open Constructor
За время работы с ОК пришлось многое делать и узнавать, вот некоторые
весчи которые узнал.

Думаю будут очень полезны

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вытаскиваем название папки страницы в объекте "список страниц"
{*
Где это может пригодится?
Например для создания графического меню, название картинки будет
соответствовать названию папки!

Примечание: pid - это id страницы, а не произвольное слово
*}

{foreach_row from=$pages item=p key=pid}

{$idMap.$pid.name}

{/foreach}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Структура + список ГД, выводим название категории в списке, выбранной
в структуре
{*
В списке страниц вставляем код
*}
{$ctx->crumbs->get('id узла')}

{*
В карте сайта на этой странцие для объекта структуры ставим крошки
*}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{*
onclick используем для генерации нового изображения
*}

{set cid=$ctx->newCaptchaId() form_error=0}

<img onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date
()).getTime();" src="/res/captcha/{$cid}.png" />
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Инъекция списка ГД в объект структуры + инъекция списка в список ГД
{*---------------------------------------------
Для чего это нужно: Есть список ГД документов с полем допустим массив
ГД,
в котором для каждого документа ГД перечисленны ID через запятую
выбранных документов другого раздела.
И нам нужно их вывести.

Первым делом нужно настроить объекты. Во-первых список ГД и объект
структуры должны иметь одинаковый раздел каталога.

Объект структуры:
Идентификатор узла(Ctx): node_id

Объект списка ГД:
Идентификатор узла(Ctx): node_id
Помещаем объект списка в стуб блок на одну страницу с объектом
структуры

{run_block id=....} - вписываем сюда ID стуб блока

Помещаем на страницу в стуб блок объект списка добавляемых документов
value=$ctx->getObjectAt('...') - вписываем ID стуб блока списка
from=$doc.ids|explode:"," - $doc.ids - поле типа список ID через
запятую
---------------------------------------------*}

{*Шаблон структуры*}
{assign_by_ref var=stub value=$ctx->getObjectAt('...')}
{set documents=$stub->getDocuments()}

{foreach from=$tree item=node}
{$ctx->setParam('node_id', $node.key)}

{run_block id=....}
{/foreach}


{*Шаблон Списка страниц*}
{foreach from=$docs item=doc}
{$doc|@debug_print_var}

{foreach from=$doc.ids|explode:"," item=fid}
{if $documents.$fid}
{$documents.$fid|@debug_print_var}
{/if}
{/foreach}

{/foreach}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Инъекция списка ГД в объект структуры
{*---------------------------------------------
Первым делом нужно настроить объекты. Во-первых список ГД и объект
структуры должны иметь одинаковый раздел каталога.

Объект структуры:
Идентификатор узла(Ctx): node_id

Объект списка ГД:
Идентификатор узла(Ctx): node_id
Помещаем объект списка в стуб блок на одну страницу с объектом
структуры

{run_block id=....} - вписываем сюда ID стуб блока
---------------------------------------------*}

{*Шаблон структуры*}
{foreach from=$tree item=node}
{$ctx->setParam('node_id', $node.key)}

{run_block id=....}
{/foreach}


{*Шаблон Списка страниц*}
{foreach from=$docs item=doc}
{$doc|@debug_print_var}
{/foreach}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Выпадающее меню ОК

{*
1. Для работы выпадающего меню, ОК олжен быть с посл. обновлениями
2. Нужно поставить галочку "выводить подразделы"
*}

<ul>
{foreach from=$pages item=p}
{if $p.at == 2} {*Если выбран пункт родительского меню*}
<li><b>{$p.header}</b>
{if $p.children} {*Если есть подменю*}
<ul>
{foreach from=$p.children item=ch}
<li><a href="{$ch.href}" title="{$ch.header}">{$ch.header}</a></
li>
{/foreach}
</ul>
{/if}
</li>
{elseif $p.at == 1} {*Если выбран пункт подменю*}
<li><a href="{$p.href}" title="{$p.header}"><b>{$p.header}</b></a>
{if $p.children} {*Если есть подменю*}
<ul>
{foreach from=$p.children item=ch}
{if $ch.at == 2}
<li><b>{$ch.header}</b></li>
{else}
<li><a href="{$ch.href}" title="{$ch.header}">{$ch.header}</a></
li>
{/if}
{/foreach}
</ul>
{/if}
</li>
{else} {*Если не выбран пункт меню*}
<li><a href="{$p.href}" title="{$p.header}">{$p.header}</a>
{if $p.children}
<ul>
{foreach from=$p.children item=ch}
<li><a href="{$ch.href}" title="{$ch.header}">{$ch.header}</a></
li>
{/foreach}
</ul>
{/if}
</li>
{/if}
{/foreach}
</ul>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Обновление ГД документа
<?
global $_wchome, $_host, $_libdir;

require_once($_libdir.'/wcdatasource._wc');
require_once($_libdir.'/dsmanager._wc');
require_once($_libdir.'/wccommons._wc');
error_reporting(E_ALL);

$ds = &$dsm->load(..); //Загружаем по ID ГД раздел
$doc = $ds->getDocument(..); //Вставляем сюда ID редактируемого
документа ГД

$value = array ( //Вставляем в массив редактируемые поля
'header' => ...,
'published' => 1,
'f_....' => .....
);

$orders->readValues($value);
$ds->updateDocument($doc);
WCS::stopRunAs();

?>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Инъекция массива документов в массив ГД

{*
Для чего это нужно, например у вас есть ГД раздел, с полем массив док-
тов либо раздел данных....
Когда мы в документе выбираем добавляемые файлы, в шаблоне они
выводятся как id через запятую прикрепленных док-тов.

В стуб блок помещаем объект списка выводимых док-тов, который мы
указали в ГД разделе и делаем в него инъекцию
*}

{foreach from=$docs item=doc}
{if $doc.image.id}
{set file_ids = "`$file_ids`,`$doc.image.id`"}
{/if}
{/foreach}

{if $file_ids}
{inject block='other' field='ids' value="-1`$file_ids`"}
{assign_by_ref var=stub value=$ctx->getObjectAt('other')}
{set files=$stub->getDocuments()}
{/if}

{if $files.$fid}
{$files.$fid.header}....
{/if}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Скрипт создания в ОК документа в ГД разделе
<?
global $_wchome, $_host, $_libdir;

require_once($_libdir.'/wcdatasource._wc');
require_once($_libdir.'/dsmanager._wc');
require_once($_libdir.'/wccommons._wc');
error_reporting(E_ALL);

WCS::runAs(WCS_ROOT_ID);

$dsm = new DSManager(); //Создаем класс
$ds = &$dsm->load(..); //Загружаем ID нужного ГД

$values = array ( //Пишем сюда поля, в которые необходимо вставить
ифнормацию
'header' => ...,
'published' => 1,
'f_...' => $_POST['...'], //f_ название поля в ГД
документе созданное вручную начинается именно с этого
);

$doc = $ds->getEmptyDocument(); //Берем пустой документ
$doc->readValues($values); //Читаем данные из массива $values

$ds->createDocument($doc); //Записываем в новый документ

WCS::stopRunAs();
?>

Reply all
Reply to author
Forward
0 new messages