コード例 #1
0
function nvweb_block_group($vars = array())
{
    global $website;
    global $DB;
    global $current;
    global $webgets;
    global $webuser;
    $webget = 'block_group';
    $out = array();
    $bg = new block_group();
    if (!empty($vars['id']) && is_numeric($vars['id'])) {
        $bg->load($vars['id']);
    } else {
        if (!empty($vars['id']) && !is_numeric($vars['id'])) {
            $bg->load_by_code($vars['id']);
        } else {
            if (!empty($vars['code'])) {
                $bg->load_by_code($vars['code']);
            }
        }
    }
    if (!empty($bg->id) && !empty($bg->blocks)) {
        // start rendering every block in the group
        foreach ($bg->blocks as $bgb) {
            // can be a numeric ID or a string representing the block type
            // note: block group blocks are not allowed, as navigate cms does not know the code to generate them
            if (is_numeric($bgb['id'])) {
                $out[] = nvweb_blocks(array('mode' => 'single', 'id' => $bgb['id']));
            } else {
                $out[] = nvweb_blocks(array('type' => $bgb['id']));
            }
        }
    }
    return implode("\n", $out);
}
コード例 #2
0
ファイル: block_groupnew.php プロジェクト: tang86/discuz-utf8
 function cookparameter($parameter)
 {
     $parameter['orderby'] = 'dateline';
     return parent::cookparameter($parameter);
 }
コード例 #3
0
    public static function save_properties_from_array($object_type, $object_id, $template, $properties_assoc = array(), $ws = null, $node_uid = "")
    {
        global $DB;
        global $website;
        global $theme;
        if (empty($ws)) {
            $ws = $website;
        }
        $dictionary = array();
        $property_object_type = $object_type;
        // object_type: item, structure, block, block_group_block
        if ($object_type == 'block_group_block') {
            // we have to identify the block subtype: block, block_type, block_group_block or extension_block
            // so we can get its properties definition
            if (!is_numeric($object_id)) {
                // assume there can only be one block group of the same type
                $block_group_id = $DB->query_single('MAX(id)', 'nv_block_groups', ' code = ' . protect($template) . ' AND website = ' . $ws->id);
                $object_id = $block_group_id;
                if (empty($block_group_id)) {
                    $object_id = 0;
                }
            }
            if (!empty($node_uid)) {
                $bg = new block_group();
                $bg->load($object_id);
                for ($b = 0; $b < count($bg->blocks); $b++) {
                    if ($bg->blocks[$b]['uid'] == $node_uid) {
                        $block_id = $bg->blocks[$b]['id'];
                        if ($bg->blocks[$b]['type'] == 'extension') {
                            // an extension block
                            $property_object_type = 'block_group-extension-block';
                            // load the extension, if installed in this instance
                            $extension = new extension();
                            $extension->load($bg->blocks[$b]['extension']);
                            // find the property declaration in the extension definition
                            if (isset($extension->definition->blocks)) {
                                for ($eb = 0; $eb < count($extension->definition->blocks); $eb++) {
                                    if ($extension->definition->blocks[$eb]->id == $block_id) {
                                        $block = $extension->definition->blocks[$eb];
                                        break;
                                    }
                                }
                            } else {
                                // ignore this property, extension is not installed or it does not have the requested block definition
                                continue;
                            }
                        } else {
                            // a block group block
                            $property_object_type = 'block_group_block';
                            $block = block::block_group_block($template, $block_id);
                        }
                        // note: standard blocks don't "embed" their properties in a block group,
                        // they have their own separate values
                        break;
                    }
                }
            } else {
                // compatibility with < Navigate 2.1 themes (to be removed)
                $properties_names = array_keys($properties_assoc);
                $block = block::block_group_block_by_property($properties_names[0]);
            }
            if (!isset($block->properties) || empty($block->properties)) {
                return false;
            }
            $properties = $block->properties;
        } else {
            $properties = property::elements($template, $object_type);
        }
        if (!is_array($properties)) {
            $properties = array();
        }
        foreach ($properties as $property) {
            if (!isset($properties_assoc[$property->name]) && !isset($properties_assoc[$property->id])) {
                continue;
            }
            $values_dict = array();
            $value = '';
            // we try to find the property value by "property name", if empty then we try to find it via "property id"
            if (isset($properties_assoc[$property->name])) {
                $value = $properties_assoc[$property->name];
            }
            if (empty($value)) {
                $value = $properties_assoc[$property->id];
            }
            // multilanguage property?
            if (in_array($property->type, array('text', 'textarea', 'link', 'rich_textarea')) || @$property->multilanguage == 'true' || @$property->multilanguage === true) {
                if (isset($properties_assoc[$property->name])) {
                    $values_dict = $properties_assoc[$property->name];
                }
                if (empty($values_dict)) {
                    $values_dict = $properties_assoc[$property->id];
                }
                $value = '[dictionary]';
            }
            if ($property->type == 'coordinates') {
                if (is_array($value)) {
                    $value = $value['latitude'] . '#' . $value['longitude'];
                }
                // if it isn't an array, then we suppose it already has the right format
            }
            // property->type "decimal"; we don't need to reconvert, it should already be in the right format
            if ($property->type == 'webuser_groups' && !empty($value)) {
                $value = 'g' . implode(',g', $value);
            }
            // boolean (checkbox): if not checked,  form does not send the value
            if ($property->type == 'boolean' && empty($value)) {
                $value = 0;
            }
            if (is_null($value)) {
                $value = "";
            }
            // should not be needed because of value_or_default, but doing this here fixes some warnings
            // remove the old property value row
            $DB->execute('
				DELETE FROM nv_properties_items
                	  WHERE property_id = ' . protect($property->id) . '
                        AND element = ' . protect($property_object_type) . '
                        AND node_id = ' . protect($object_id) . (empty($node_uid) ? '' : ' AND node_uid = ' . protect($node_uid)) . '
                        AND website = ' . $ws->id);
            // now we insert a new row
            $DB->execute('
			    INSERT INTO nv_properties_items
				    (id, website, property_id, element, node_id, node_uid, name, value)
				VALUES
				    (   0,
						:website,
						:property_id,
						:type,
						:object_id,
						:node_uid,
						:name,
						:value
                    )', array(':website' => $ws->id, ':property_id' => $property->id, ':type' => $property_object_type, ':object_id' => value_or_default($object_id, 0), ':node_uid' => value_or_default($node_uid, ""), ':name' => $property->name, ':value' => value_or_default($value, "")));
            // $error = $DB->get_last_error();
            // set the dictionary for the multilanguage properties
            $default_language = '';
            if (isset($property->multilanguage) && ($property->multilanguage === 'false' || $property->multilanguage === false)) {
                $default_language = $ws->languages_list[0];
            }
            if (in_array($property->type, array('text', 'textarea', 'rich_textarea', 'link')) || @$property->multilanguage == 'true' || @$property->multilanguage === true) {
                foreach ($ws->languages_list as $lang) {
                    if (!empty($default_language)) {
                        // property is NOT multilanguage, use the first value for all languages
                        $dictionary[$lang]['property-' . $property->id . '-' . $lang] = $values_dict[$default_language];
                    } else {
                        $dictionary[$lang]['property-' . $property->id . '-' . $lang] = $values_dict[$lang];
                    }
                }
            }
        }
        if (!empty($dictionary)) {
            webdictionary::save_element_strings('property-' . $property_object_type, $object_id, $dictionary, $ws->id, $node_uid);
        }
        return true;
    }
コード例 #4
0
 public static function export_sample($a_categories, $a_items, $a_block_groups, $a_blocks, $a_comments, $folder)
 {
     global $website;
     global $theme;
     global $DB;
     @set_time_limit(0);
     $categories = array();
     $items = array();
     $blocks = array();
     $block_groups = array();
     $comments = array();
     $properties = array();
     $files = array();
     $settings = array();
     // structure
     for ($c = 0; $c < count($a_categories); $c++) {
         $tmp = new structure();
         $tmp->load($a_categories[$c]);
         //$properties['structure'][$tmp->id] = property::load_properties_associative('structure', $tmp->template, 'structure', $tmp->id);
         $properties['structure'][$tmp->id] = property::load_properties('structure', $tmp->template, 'structure', $tmp->id);
         $categories[$tmp->id] = $tmp;
         // add files referenced in properties
         if (is_array($properties['structure'][$tmp->id])) {
             foreach ($properties['structure'][$tmp->id] as $property) {
                 if ($property->type == 'image' || $property->type == 'file') {
                     $files[] = $property->value;
                 }
             }
         }
     }
     // comments
     for ($c = 0; $c < count($a_comments); $c++) {
         $tmp = new comment();
         $tmp->load($a_comments[$c]);
         $comments[$tmp->id] = $tmp;
     }
     // items
     for ($i = 0; $i < count($a_items); $i++) {
         $tmp = new item();
         $tmp->load($a_items[$i]);
         $template_id = $tmp->template;
         if ($tmp->association != "free" && $tmp->embedding == 1) {
             // we have to get the template set in the category of the item
             $template_id = $DB->query_single('template', 'nv_structure', ' id = ' . protect($tmp->category) . ' AND website = ' . $website->id);
         }
         $properties['item'][$tmp->id] = property::load_properties('item', $template_id, 'item', $tmp->id);
         list($tmp->dictionary, $files) = theme::export_sample_parse_dictionary($tmp->dictionary, $files);
         // add files referenced in properties
         if (is_array($properties['item'][$tmp->id])) {
             foreach ($properties['item'][$tmp->id] as $property) {
                 if ($property->type == 'image' || $property->type == 'file') {
                     $files[] = $property->value;
                 }
             }
         }
         // add files referenced in gallery
         if (is_array($tmp->galleries[0])) {
             $gallery_images = array_keys($tmp->galleries[0]);
             $files = array_merge($files, $gallery_images);
         }
         $items[$tmp->id] = $tmp;
     }
     // block_groups
     for ($i = 0; $i < count($a_block_groups); $i++) {
         $tmp = new block_group();
         $tmp->load($a_block_groups[$i]);
         $block_groups[$tmp->id] = $tmp;
         if (is_array($tmp->blocks)) {
             foreach ($tmp->blocks as $bgb) {
                 if ($bgb['type'] == 'block_group_block') {
                     $properties['block_group_block'][$a_block_groups[$i]][$bgb['uid']] = property::load_properties($bgb['id'], $tmp->code, 'block_group_block', $bgb['id'], $bgb['uid']);
                 } else {
                     if ($bgb['type'] == 'extension') {
                         $properties['block_group_block'][$a_block_groups[$i]][$bgb['uid']] = property::load_properties(NULL, $bgb['id'], "extension_block", NULL, $bgb['uid']);
                     }
                 }
             }
         }
         // note: maybe not all blocks in the group have been selected in the "blocks" tab
         // here we only export the block group definition, the block group blocks properties and the extension blocks properties, not adding anything else to export
     }
     // blocks
     for ($i = 0; $i < count($a_blocks); $i++) {
         $tmp = new block();
         $tmp->load($a_blocks[$i]);
         $properties['block'][$tmp->id] = property::load_properties('block', $tmp->type, 'block', $tmp->id);
         list($tmp->dictionary, $files) = theme::export_sample_parse_dictionary($tmp->dictionary, $files);
         list($tmp->trigger['trigger-content'], $files) = theme::export_sample_parse_array($tmp->trigger['trigger-content'], $files);
         list($tmp->trigger['trigger-html'], $files) = theme::export_sample_parse_array($tmp->trigger['trigger-html'], $files);
         if (!empty($tmp->trigger['trigger-image'])) {
             $files = array_merge($files, array_values($tmp->trigger['trigger-image']));
         }
         if (!empty($tmp->trigger['trigger-rollover'])) {
             $files = array_merge($files, array_values($tmp->trigger['trigger-rollover']));
         }
         if (!empty($tmp->trigger['trigger-rollover-active'])) {
             $files = array_merge($files, array_values($tmp->trigger['trigger-rollover-active']));
         }
         if (!empty($tmp->trigger['trigger-flash'])) {
             $files = array_merge($files, array_values($tmp->trigger['trigger-flash']));
         }
         if (!empty($tmp->action['action-image'])) {
             $files = array_merge($files, array_values($tmp->action['action-image']));
         }
         if (!empty($tmp->action['action-file'])) {
             $files = array_merge($files, array_values($tmp->action['action-file']));
         }
         // add files referenced in properties
         if (is_array($properties['block'][$tmp->id])) {
             foreach ($properties['block'][$tmp->id] as $property) {
                 if ($property->type == 'image' || $property->type == 'file') {
                     $files[] = $property->value;
                 }
             }
         }
         $blocks[$tmp->id] = $tmp;
     }
     // folders
     // save references and get their files list
     $folders = array();
     $folders_to_check = array();
     if (!empty($folder)) {
         array_push($folders_to_check, $folder);
         while (!empty($folders_to_check)) {
             $f = array_shift($folders_to_check);
             $f = file::filesOnPath($f);
             foreach ($f as $file) {
                 if ($file->type == 'folder') {
                     array_push($folders_to_check, $file->id);
                     array_push($folders, $file);
                 } else {
                     $files[] = $file->id;
                 }
             }
         }
     }
     // add files selected as theme_options
     foreach ($theme->options as $to) {
         if ($to->type == 'image' || $to->type == 'file') {
             $to_value = $website->theme_options->{$to->id};
             if (is_array($to_value)) {
                 $files = array_merge($files, $to_value);
             } else {
                 $files[] = $to_value;
             }
         }
     }
     // include favicon in file list
     if (!empty($website->favicon)) {
         $files[] = $website->favicon;
     }
     // files
     $files = array_unique($files);
     for ($f = 0; $f < count($files); $f++) {
         $file = new file();
         $file->load($files[$f]);
         $files[$f] = $file;
     }
     // settings
     $settings['homepage'] = $website->homepage;
     $settings['favicon'] = $website->favicon;
     $zip = new zipfile();
     $zip->addFile(var_export($website->languages, true), 'languages.var_export');
     $zip->addFile(var_export($website->theme_options, true), 'theme_options.var_export');
     $zip->addFile(var_export($categories, true), 'structure.var_export');
     $zip->addFile(var_export($items, true), 'items.var_export');
     $zip->addFile(var_export($block_groups, true), 'block_groups.var_export');
     $zip->addFile(var_export($blocks, true), 'blocks.var_export');
     $zip->addFile(var_export($comments, true), 'comments.var_export');
     $zip->addFile(var_export($files, true), 'files.var_export');
     $zip->addFile(var_export($folders, true), 'folders.var_export');
     $zip->addFile(var_export($properties, true), 'properties.var_export');
     $zip->addFile(var_export($settings, true), 'settings.var_export');
     foreach ($files as $file) {
         $zip->addFile(file_get_contents($file->absolute_path()), 'files/' . $file->id);
     }
     $contents = $zip->file();
     header('Content-Disposition: attachment; filename="' . $website->theme . '_sample.zip"');
     header("Content-type: application/octet-stream");
     header('Content-Length: ' . strlen($contents));
     echo $contents;
 }
コード例 #5
0
ファイル: blocks.php プロジェクト: NavigateCMS/Navigate-CMS
function blocks_type_form($item)
{
    global $user;
    global $DB;
    global $website;
    global $layout;
    global $events;
    $navibars = new navibars();
    $naviforms = new naviforms();
    if (empty($item['id'])) {
        $navibars->title(t(23, 'Blocks') . ' / ' . t(167, 'Types') . ' / ' . t(38, 'Create'));
    } else {
        $navibars->title(t(23, 'Blocks') . ' / ' . t(167, 'Types') . ' / ' . t(170, 'Edit') . ' [' . $item['id'] . ']');
    }
    $readonly = false;
    if (empty($item['id'])) {
        $navibars->add_actions(array('<a href="#" onclick="$(\'#navigate-content\').find(\'form\').eq(0).submit();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> ' . t(34, 'Save') . '</a>'));
    } else {
        if (!empty($item['id']) && !is_numeric($item['id'])) {
            $layout->navigate_notification(t(432, "Read only mode"), false, true);
            $readonly = true;
        } else {
            $navibars->add_actions(array('<a href="#" onclick="$(\'#navigate-content\').find(\'form\').eq(0).submit();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/accept.png"> ' . t(34, 'Save') . '</a>', '<a href="#" onclick="navigate_delete_dialog();"><img height="16" align="absmiddle" width="16" src="img/icons/silk/cancel.png"> ' . t(35, 'Delete') . '</a>'));
            $layout->add_script('
            function navigate_delete_dialog()
            {
                navigate_confirmation_dialog(
                    function() { window.location.href = "?fid=blocks&act=block_type_delete&id=' . $item['id'] . '"; }, 
                    null, null, "' . t(35, 'Delete') . '"
                );
            }
        ');
        }
    }
    $group_blocks_links = array();
    list($bg_rs, $bg_total) = block_group::paginated_list(0, 10, 'title', 'desc');
    if ($bg_total > 0 && $bg_total <= 10) {
        foreach ($bg_rs as $bg) {
            $group_blocks_links[] = '<a href="?fid=' . $_REQUEST['fid'] . '&act=block_group_edit&id=' . $bg['id'] . '"><i class="fa fa-fw fa-caret-right"></i> ' . $bg['title'] . '</a>';
        }
        $events->add_actions('blocks', array('item' => null, 'navibars' => &$navibars), $group_blocks_links, '<a class="content-actions-submenu-trigger" href="?fid=' . $_REQUEST['fid'] . '&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> ' . t(506, 'Groups') . ' &#9662;</a>');
    }
    $navibars->add_actions(array('<a href="?fid=' . $_REQUEST['fid'] . '&act=0"><img height="16" align="absmiddle" width="16" src="img/icons/silk/brick.png"> ' . t(23, 'Blocks') . '</a>', !empty($group_blocks_links) ? '' : '<a href="?fid=' . $_REQUEST['fid'] . '&act=block_groups_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/bricks.png"> ' . t(506, 'Groups') . '</a>'));
    $navibars->add_actions(array(!empty($item->id) ? '<a href="?fid=' . $_REQUEST['fid'] . '&act=block_type_edit"><img height="16" align="absmiddle" width="16" src="img/icons/silk/add.png"> ' . t(38, 'Create') . '</a>' : '', '<a href="?fid=' . $_REQUEST['fid'] . '&act=block_types_list"><img height="16" align="absmiddle" width="16" src="img/icons/silk/application_view_list.png"> ' . t(39, 'List') . '</a>'));
    $navibars->form();
    $navibars->add_tab(t(43, "Main"));
    $navibars->add_tab_content($naviforms->hidden('form-sent', 'true'));
    $navibars->add_tab_content($naviforms->hidden('id', $item['id']));
    $navibars->add_tab_content_row(array('<label>ID</label>', '<span>' . (!empty($item['id']) ? $item['id'] : t(52, '(new)')) . '</span>'));
    // TODO: in Navigate CMS 2.0+ add several block types (p.e. Ad (Google adsense, ...), Map (Bing, Yahoo, Google, ...))
    $block_modes = block::modes();
    $navibars->add_tab_content_row(array('<label>' . t(491, 'Class') . '</label>', $naviforms->selectfield('type', array_keys($block_modes), array_values($block_modes), $item['type'], '', false)));
    $navibars->add_tab_content_row(array('<label>' . t(67, 'Title') . '</label>', $naviforms->textfield('title', $item['title'])));
    $navibars->add_tab_content_row(array('<label>' . t(237, 'Code') . '</label>', $naviforms->textfield('code', $item['code']), '<div class="subcomment">
            <span style=" float: left; margin-left: -3px; " class="ui-icon ui-icon-lightbulb"></span>' . t(436, 'Used as a class in HTML elements') . '</div>'));
    $navibars->add_tab_content_row(array('<label>' . t(168, 'Notes') . '</label>', $naviforms->textarea('notes', $item['notes'])));
    $navibars->add_tab(t(145, "Size") . ' & ' . t(438, "Order"));
    $navibars->add_tab_content_row(array('<label>' . t(155, 'Width') . '<sup>*</sup></label>', $naviforms->textfield('width', $item['width']), 'px'));
    $navibars->add_tab_content_row(array('<label>' . t(156, 'Height') . '<sup>*</sup></label>', $naviforms->textfield('height', $item['height']), 'px'));
    $navibars->add_tab_content_row(array('<div class="subcomment italic">* ' . t(169, 'You can leave blank a field to not limit the size') . '</div>'));
    $navibars->add_tab_content_row(array('<label>&nbsp;</label>', '<a id="wikipedia_web_banner_entry" class="italic" href="http://en.wikipedia.org/wiki/Web_banner" target="_blank"><span class="ui-icon ui-icon-info" style=" float: left;"></span> ' . t(393, 'Standard banner sizes') . ' (Wikipedia)</a>'));
    $navibars->add_tab_content_row(array('<label>' . t(404, 'Order by') . '</label>', $naviforms->selectfield('order', array('theme', 'priority', 'random'), array(t('368', 'Theme'), t('66', 'Priority'), t('399', 'Random')), $item['order'])));
    $navibars->add_tab_content_row(array('<label>' . t(397, 'Maximum') . '</label>', $naviforms->textfield('maximum', $item['maximum']), '<div class="subcomment"><span class="ui-icon ui-icon-lightbulb" style=" float: left; margin-left: -3px; "></span> ' . t(400, 'Enter 0 to display all') . '</div>'));
    $layout->add_script('
        function navigate_blocks_code_generate(el)
        {
            if($("#code").val()!="")
                return;
            var title = $("#title").val();
			title = title.replace(/([\'"“”«»?:\\+\\&!¿#\\\\])/g, "");
			title = title.replace(/[.\\s]+/g, navigate["word_separator"]);
            $("#code").val(title.toLowerCase());
        }

        $("#code").on("focus", function()
        {
            if($(this).val() == "")
                navigate_blocks_code_generate();
        });
        ');
    if (!empty($item['id'])) {
        $navibars->add_tab(t(77, "Properties"));
        $table = new naviorderedtable("block_properties_table");
        $table->setWidth("550px");
        $table->setHiddenInput("block-properties-order");
        $table->setDblclickCallback("navigate_block_edit_property");
        $navibars->add_tab_content($naviforms->hidden('block-properties-order', ""));
        $table->addHeaderColumn(t(159, 'Name'), 350, true);
        $table->addHeaderColumn(t(160, 'Type'), 150);
        $table->addHeaderColumn(t(65, 'Enabled'), 50);
        $properties = property::elements($item['id'], 'block');
        $types = property::types();
        for ($p = 0; $p < count($properties); $p++) {
            $table->addRow($properties[$p]->id, array(array('content' => $properties[$p]->name, 'align' => 'left'), array('content' => $types[$properties[$p]->type], 'align' => 'left'), array('content' => '<input type="checkbox" name="property-enabled[]" value="' . $properties[$p]->id . '" disabled="disabled" id="block-type-property-enabled-' . $properties[$p]->id . '" ' . ($properties[$p]->enabled == '1' ? ' checked=checked ' : '') . ' />
                                    <label for="block-type-property-enabled-' . $properties[$p]->id . '"></label>', 'align' => 'center')));
        }
        if ($readonly) {
            $navibars->add_tab_content_row(array('<label>' . t(77, 'Properties') . '</label>', '<div>' . $table->generate() . '</div>'));
        } else {
            $navibars->add_tab_content_row(array('<label>' . t(77, 'Properties') . '</label>', '<div>' . $table->generate() . '</div>', '<div class="subcomment">
                    <img src="img/icons/silk/information.png" align="absmiddle" /> ' . t(72, 'Drag any row to assign priorities') . '.
                     ' . t(192, 'Double click any row to edit') . '
                </div>'));
            $navibars->add_tab_content_row(array('<label>&nbsp;</label>', '<button id="block-properties-create"><img src="img/icons/silk/add.png" align="absmiddle" /> ' . t(38, 'Create') . '</button>'));
        }
        $navibars->add_content('
		<form id="block-properties-edit-dialog" style="display: none;">
			<div class="navigate-form-row">
				<label>ID</label>
				<span id="property-id-span">' . t(52, '(new)') . '</span>
				' . $naviforms->hidden('property-id', '') . '
				' . $naviforms->hidden('property-template', $item->id) . '
				' . $naviforms->hidden('property-element', "block") . '
			</div>
			<div class="navigate-form-row">
				<label>' . t(67, 'Title') . '</label>
				' . $naviforms->textfield('property-name', '') . '
			</div>
			<div class="navigate-form-row">
				<label>' . t(160, 'Type') . '</label>
				' . $naviforms->selectfield('property-type', array_keys($types), array_values($types), 'value', 'navigate_block_property_type_change()') . '
			</div>
			<div class="navigate-form-row">
				<label>' . t(200, 'Options') . '</label>
				' . $naviforms->textarea('property-options', '') . '
				<div class="subcomment">
					' . t(201, 'One line per option, formatted like this: value#title') . '
				</div>
			</div>
			<div class="navigate-form-row">
				<label>' . t(199, 'Default value') . '</label>
				' . $naviforms->textfield('property-dvalue', '') . '
				<div class="subcomment">
				    <span id="property-comment-boolean">' . t(426, 'Enter "1" for true, "0" for false') . '</span>
					<span id="property-comment-option">' . t(202, 'Enter only the value') . '</span>
					<span id="property-comment-moption">' . t(212, 'Enter the selected values separated by commas') . ': 3,5,8</span>
					<span id="property-comment-text">' . t(203, 'Same value for all languages') . '</span>
					<span id="property-comment-rating">' . t(223, 'Default is 5 stars, if you want a different number: default_value#number_of_stars') . ' 5#10</span>
					<span id="property-comment-date">' . t(50, 'Date format') . ': ' . date($user->date_format) . '</span>
					<span id="property-comment-color">' . t(442, 'Hexadecimal color code') . ': #ffffff</span>
					<span id="property-comment-country">' . t(225, 'Alpha-2 country code') . ' (es, us, uk...)</span>
					<span id="property-comment-file">' . t(204, 'ID of the file') . '</span>
					<span id="property-comment-coordinates">' . t(298, 'Latitude') . '#' . t(299, 'Longitude') . ': 40.689231#-74.044505</span>
				</div>
			</div>
			<div class="navigate-form-row">
				<label>' . t(65, 'Enabled') . '</label>
				' . $naviforms->checkbox('property-enabled', 1) . '
			</div>
		</form>');
        $layout->add_script('
			$("#block-properties-create").bind("click", function()
			{
				navigate_block_edit_property();
				return false;
			});

			function navigate_block_edit_property(el)
			{
				if(!el)	// new property
				{
					$("#property-id").val("");
					$("#property-id-span").html("' . t(52, '(new)') . '");
					$("#property-template").val("' . $item['id'] . '");
					$("#property-name").val("");
					$("#property-type").val("value");
					$("#property-element").val("block");
					$("#property-options").val("");
					$("#property-dvalue").val("");
				    $("#property-enabled").attr("checked", "checked");
				}
				else
				{
					$.ajax({
					   type: "GET",
					   async: false,
					   dateType: "json",
					   url: "' . NAVIGATE_URL . '/' . NAVIGATE_MAIN . '?fid=' . $_REQUEST['fid'] . '&act=block_property_load&block=' . $item->id . '&id=" + $(el).attr("id"),
					   success: function(data)
					   {
						   $("#property-id-span").html(data.id);
						   $("#property-id").val(data.id);
						   $("#property-template").val(data.template);
						   $("#property-name").val(data.name);
						   $("#property-type").val(data.type);
						   $("#property-element").val("block");
						   $("#property-options").val(data.options);
						   $("#property-dvalue").val(data.dvalue);
						   if(data.enabled=="1")
							   $("#property-enabled").attr("checked", "checked");
							else
							   $("#property-enabled").removeAttr("checked");

						   var options = "";
						   for(var o in data.options)
						   {
							   options += o + "#" + data.options[o] + "\\n";
						   }
						   $("#property-options").val(options);

					   }
					 });
				}

				navigate_block_property_type_change();

				if(' . ($readonly ? 'true' : 'false') . ')
				{
                    $("#block-properties-edit-dialog").dialog(
                    {
                        title: \'<img src="img/icons/silk/pencil.png" align="absmiddle" /> ' . t(170, 'Edit') . '\',
                        resizable: true,
                        height: 360,
                        width: 650,
                        modal: true,
                    });
				}
				else // show dialog with action buttons
				{
                    $("#block-properties-edit-dialog").dialog(
                    {
                        title: \'<img src="img/icons/silk/pencil.png" align="absmiddle" /> ' . t(170, 'Edit') . '\',
                        resizable: true,
                        height: 410,
                        width: 650,
                        modal: true,
                        buttons: {
                            "' . t(58, 'Cancel') . '": function() {
                                $(this).dialog("close");
                            },
                            "' . t(35, 'Delete') . '": function() {
                                $.ajax({
                                   type: "POST",
                                   async: false,
                                   dateType: "text",
                                   url: "' . NAVIGATE_URL . '/' . NAVIGATE_MAIN . '?fid=' . $_REQUEST['fid'] . '&act=block_property_remove",
                                   data: $("#block-properties-edit-dialog").serialize(),
                                   success: function(msg)
                                   {
                                     $("#block_properties_table").find("#" + $("#property-id").val()).remove();
                                     navigate_naviorderedtable_block_properties_table_reorder();
                                     $("#block-properties-edit-dialog").dialog("close");
                                   }
                                 });
                            },
                            "' . t(190, 'Ok') . '": function()
                            {
                                $.ajax({
                                   type: "POST",
                                   async: false,
                                   dateType: "text",
                                   url: "' . NAVIGATE_URL . '/' . NAVIGATE_MAIN . '?fid=' . $_REQUEST['fid'] . '&act=block_property_save",
                                   data: $("#block-properties-edit-dialog").serialize(),
                                   success: function(data)
                                   {
                                       if($("#property-id").val() > 0)
                                       {
                                           // update
                                           var tr = $("#block_properties_table").find("#" + $("#property-id").val());
                                           tr.find("td").eq(0).html(data.name);
                                           tr.find("td").eq(1).html(data.type_text);
                                           tr.find("input[type=checkbox]").attr("checked", (data.enabled==1));
                                       }
                                       else
                                       {
                                           // insert
                                           var checked = "";

                                           if(data.enabled) checked = \' checked="checked" \';
                                           var tr = \'<tr id="\'+data.id+\'"><td>\'+data.name+\'</td><td>\'+data.type_text+\'</td><td align="center"><input name="property-enabled[]" id="block-type-property-enabled-\'+data.id+\'" type="checkbox" disabled="disabled" value="\'+data.id+\'" \'+checked+\' /><label for="block-type-property-enabled-\'+data.id+\'"></label></td></tr>\';
                                           $("#block_properties_table").find("tbody:last").append(tr);
                                           $("#block_properties_table").find("tr:last").on("dblclick", function() { navigate_block_edit_property(this); });
                                           $("#block_properties_table").tableDnD(
                                            {
                                                onDrop: function(table, row)
                                                {		navigate_naviorderedtable_block_properties_table_reorder();		}
                                            });
                                       }
                                       navigate_naviorderedtable_block_properties_table_reorder();
                                       $("#block-properties-edit-dialog").dialog("close");
                                   }
                                 });
                            }
                        }
                    });
                }
			}

			function navigate_block_property_type_change()
			{
				$("#property-options").parent().hide();
				$("#property-dvalue").next().find("span").hide();

				switch($("#property-type").val())
				{
					case "option":
						$("#property-options").parent().show();
						$("#property-comment-option").show();
						break;

					case "moption":
						$("#property-options").parent().show();
						$("#property-comment-moption").show();
						break;

					case "text":
					case "textarea":
					case "link":
						$("#property-comment-text").show();
						break;

					case "date":
					case "datetime":
						$("#property-comment-date").show();
						break;

					case "image":
					case "file":
						$("#property-comment-file").show();
						break;

					case "rating":
						$("#property-comment-rating").show();
						break;

                    case "color":
						$("#property-comment-color").show();
						break;

					case "coordinates":
						$("#property-comment-coordinates").show();
						break;

					case "country":
						$("#property-comment-country").show();
						break;

                    case "boolean":
						$("#property-comment-boolean").show();
						break;

					case "comment":
					case "value":
					default:
				}
			}

			navigate_naviorderedtable_block_properties_table_reorder();
		');
    }
    return $navibars->generate();
}
コード例 #6
0
ファイル: list.php プロジェクト: NavigateCMS/Navigate-CMS
function nvweb_list($vars = array())
{
    global $website;
    global $DB;
    global $current;
    global $cache;
    global $structure;
    global $webgets;
    global $theme;
    global $webuser;
    $out = array();
    $webget = 'list';
    $categories = array();
    $exclude = '';
    if ($current['type'] == 'item') {
        $categories = array($current['object']->category);
    } else {
        $categories = array($current['object']->id);
    }
    if (isset($vars['categories'])) {
        if ($vars['categories'] == 'all') {
            $categories = array(0);
            $vars['children'] = 'true';
        } else {
            if ($vars['categories'] == 'parent') {
                $parent = $DB->query_single('parent', 'nv_structure', 'id = ' . intval($categories[0]));
                $categories = array($parent);
            } else {
                if ($vars['categories'] == 'nvlist_parent') {
                    if ($vars['nvlist_parent_type'] === 'structure') {
                        $categories = array($vars['nvlist_parent_item']->id);
                    }
                } else {
                    if (!is_numeric($vars['categories'])) {
                        // if "categories" attribute has a comma, then we suppose it is a list of comma separated values
                        // if not, then maybe we want to get the categories from a specific property of the current page
                        if (strpos($vars['categories'], ',') === false) {
                            $categories = nvweb_properties(array('property' => $vars['categories']));
                        }
                        if (empty($categories) && @$vars['nvlist_parent_vars']['source'] == 'block_group') {
                            $categories = nvweb_properties(array('mode' => 'block_group_block', 'property' => $vars['categories'], 'id' => $vars['nvlist_parent_item']->id, 'uid' => $vars['nvlist_parent_item']->uid));
                        }
                        if (!is_array($categories)) {
                            $categories = explode(',', $categories);
                            $categories = array_filter($categories);
                            // remove empty elements
                        }
                    } else {
                        $categories = explode(',', $vars['categories']);
                        $categories = array_filter($categories);
                        // remove empty elements
                    }
                }
            }
        }
    }
    if ($vars['children'] == 'true') {
        $categories = nvweb_menu_get_children($categories);
    }
    // if we have categories="x" children="true" [to get the children of a category, but not itself]
    if ($vars['children'] == 'only') {
        $children = nvweb_menu_get_children($categories);
        for ($c = 0; $c < count($categories); $c++) {
            array_shift($children);
        }
        $categories = $children;
    }
    if (!empty($vars['children']) && intval($vars['children']) > 0) {
        $children = nvweb_menu_get_children($categories, intval($vars['children']));
        for ($c = 0; $c < count($categories); $c++) {
            array_shift($children);
        }
        $categories = $children;
    }
    if (empty($vars['items']) || $vars['items'] == '0') {
        $vars['items'] = 5000;
        //2147483647; // maximum integer
        // NOTE: having >5000 items on a page without a paginator is probably a bad idea... disagree? Contact Navigate CMS team!
    } else {
        if (!is_numeric($vars['items'])) {
            $max_items = "";
            // the number of items is defined by a property
            $max_items = nvweb_properties(array('property' => $vars['items']));
            if (empty($max_items) && @$vars['nvlist_parent_vars']['source'] == 'block_group') {
                $max_items = nvweb_properties(array('mode' => 'block_group_block', 'property' => $vars['items'], 'id' => $vars['nvlist_parent_item']->id, 'uid' => $vars['nvlist_parent_item']->uid));
            }
            if (!empty($max_items)) {
                $vars['items'] = $max_items;
            } else {
                $vars['items'] = 500;
            }
            // default maximum
        }
    }
    if (!empty($vars['exclude'])) {
        $exclude = str_replace('current', $current['object']->id, $vars['exclude']);
        $exclude = explode(',', $exclude);
        $exclude = array_filter($exclude);
        if (!empty($exclude)) {
            if ($vars['source'] == 'structure' || $vars['source'] == 'category') {
                $exclude = 'AND s.id NOT IN(' . implode(',', $exclude) . ')';
            } else {
                // item
                $exclude = 'AND i.id NOT IN(' . implode(',', $exclude) . ')';
            }
        } else {
            $exclude = '';
        }
    }
    // retrieve entries
    // calculate the offset of the first element to retrieve
    // Warning: the paginator applies on all paginated lists on a page (so right now there can only be one in a page)
    if (empty($_GET['page'])) {
        $_GET['page'] = 1;
    }
    $offset = intval($_GET['page'] - 1) * $vars['items'];
    // this list does not use paginator, so offset must be always zero
    if (!isset($vars['paginator']) || $vars['paginator'] == 'false') {
        $offset = 0;
    }
    $permission = !empty($_SESSION['APP_USER#' . APP_UNIQUE]) ? 1 : 0;
    // public access / webuser based / webuser groups based
    $access = 2;
    $access_extra = '';
    if (!empty($current['webuser'])) {
        $access = 1;
        if (!empty($webuser->groups)) {
            $access_groups = array();
            foreach ($webuser->groups as $wg) {
                if (empty($wg)) {
                    continue;
                }
                $access_groups[] = 's.groups LIKE "%g' . $wg . '%"';
            }
            if (!empty($access_groups)) {
                $access_extra = ' OR (s.access = 3 AND (' . implode(' OR ', $access_groups) . '))';
            }
        }
    }
    // get order type: PARAMETER > NV TAG PROPERTY > DEFAULT (priority given in CMS)
    $order = @$_REQUEST['order'];
    if (empty($order)) {
        $order = @$vars['order'];
    }
    if (empty($order)) {
        // default order: latest
        $order = 'latest';
    }
    $orderby = nvweb_list_get_orderby($order);
    $rs = NULL;
    // TODO: try to optimize nvlist generation to use less memory and increase the maximum number of items
    if (($vars['source'] == 'structure' || $vars['source'] == 'category') && !empty($categories)) {
        $orderby = str_replace('i.', 's.', $orderby);
        $visible = '';
        if ($vars['filter'] == 'menu') {
            $visible = ' AND s.visible = 1 ';
        }
        $templates = "";
        if (!empty($vars['templates'])) {
            $templates = explode(",", $vars['templates']);
            $templates = array_filter($templates);
            $templates = ' AND s.template IN ("' . implode('","', $templates) . '")';
        }
        $DB->query('
			SELECT SQL_CALC_FOUND_ROWS s.id, s.permission,
			            s.date_published, s.date_unpublish, s.date_published as pdate,
			            d.text as title, s.position as position
			  FROM nv_structure s, nv_webdictionary d
			 WHERE s.id IN(' . implode(",", $categories) . ')
			   AND s.website = ' . $website->id . '
			   AND s.permission <= ' . $permission . '
			   AND (s.date_published = 0 OR s.date_published < ' . core_time() . ')
			   AND (s.date_unpublish = 0 OR s.date_unpublish > ' . core_time() . ')
			   AND (s.access = 0 OR s.access = ' . $access . $access_extra . ')
			   AND d.website = s.website
			   AND d.node_type = "structure"
			   AND d.subtype = "title"
			   AND d.node_id = s.id
			   AND d.lang = ' . protect($current['lang']) . '
		     ' . $templates . '
			 ' . $visible . '
			 ' . $exclude . '
			 ' . $orderby . '
			 LIMIT ' . $vars['items'] . '
			OFFSET ' . $offset);
        $rs = $DB->result();
        $total = $DB->foundRows();
    } else {
        if ($vars['source'] == 'block') {
            list($rs, $total) = nvweb_blocks(array('type' => $vars['type'], 'number' => $vars['items'], 'mode' => $order == 'random' ? 'random' : 'ordered', 'zone' => 'object'));
        } else {
            if ($vars['source'] == 'block_link') {
                // only useful if this nvlist is inside another nv list of source="block"
                $block_links = $vars['nvlist_parent_item']->trigger['trigger-links'][$current['lang']];
                $rs = array();
                if (!is_array($block_links)) {
                    $block_links = array();
                }
                foreach ($block_links as $b_key => $b_data) {
                    if (!is_array($b_data)) {
                        $b_data = array();
                    }
                    $b_i = 0;
                    foreach ($b_data as $b_ref => $b_value) {
                        if (!isset($rs[$b_i])) {
                            $rs[$b_i] = new stdClass();
                        }
                        if (!isset($rs[$b_i]->id)) {
                            $rs[$b_i]->id = $b_ref;
                        }
                        $rs[$b_i]->{$b_key} = $b_value;
                        $b_i++;
                    }
                }
                $total = count($rs);
            } else {
                if ($vars['source'] == 'block_group') {
                    $bg = new block_group();
                    if (!empty($vars['type'])) {
                        $bg->load_by_code($vars['type']);
                    }
                    if (!empty($bg) && !empty($bg->blocks)) {
                        $rs = array();
                        foreach ($bg->blocks as $bgb) {
                            unset($bgbo);
                            switch ($bgb['type']) {
                                case 'block':
                                    $bgbo = new block();
                                    $bgbo->load($bgb['id']);
                                    if (empty($bgbo) || empty($bgbo->type)) {
                                        continue;
                                    }
                                    // check if we can display this block
                                    if (nvweb_object_enabled($bgbo)) {
                                        // check categories / exclusions
                                        if (!empty($bgbo->categories)) {
                                            $bgbo_cat_found = false;
                                            foreach ($categories as $list_cat) {
                                                if (in_array($list_cat, $bgbo->categories)) {
                                                    $bgbo_cat_found = true;
                                                }
                                            }
                                            if (!$bgbo_cat_found) {
                                                // block categories don't match the current list categories, skip this block
                                                continue;
                                            }
                                        }
                                        if (!empty($bgbo->exclusions)) {
                                            foreach ($categories as $list_cat) {
                                                if (in_array($list_cat, $bgbo->exclusions)) {
                                                    continue;
                                                }
                                                // skip this block
                                            }
                                        }
                                        $rs[] = $bgbo;
                                    }
                                    break;
                                case 'block_group_block':
                                    $bgba = $theme->block_group_blocks($vars['type']);
                                    if (!empty($bgba[$bgb['id']])) {
                                        $bgbo = $bgba[$bgb['id']];
                                        $bgbo->uid = $bgb['uid'];
                                        $rs[] = clone $bgbo;
                                    }
                                    break;
                                case 'block_type':
                                    // a collection of blocks of the same type
                                    list($bgbos, $foo) = nvweb_blocks(array('type' => $bgb['id'], 'mode' => $order == 'random' ? 'random' : 'ordered', 'zone' => 'object'));
                                    // add the block type definition, with its title
                                    if (count($bgbos) > 0 && isset($bgb['title']) && !empty($bgb['title'])) {
                                        $bgb['_object_type'] = 'block_group_block_type';
                                        $rs[] = (object) $bgb;
                                    }
                                    for ($i = 0; $i < count($bgbos); $i++) {
                                        $rs[] = $bgbos[$i];
                                    }
                                    break;
                                case 'extension':
                                    $rs[] = (object) $bgb;
                                    break;
                            }
                        }
                        $total = count($rs);
                    }
                } else {
                    if ($vars['source'] == 'gallery') {
                        if (!isset($vars['nvlist_parent_type'])) {
                            // get gallery of the current item
                            if ($current['type'] == 'item') {
                                $galleries = $current['object']->galleries;
                                if (!is_array($galleries)) {
                                    $galleries = mb_unserialize($galleries);
                                }
                                $rs = $galleries[0];
                                $total = count($rs);
                            } else {
                                if ($current['type'] == 'structure') {
                                    // we need the first item assigned to the structure
                                    $access_extra_items = str_replace('s.', 'i.', $access_extra);
                                    $templates = "";
                                    if (!empty($vars['templates'])) {
                                        $templates = explode(",", $vars['templates']);
                                        $templates = array_filter($templates);
                                        $templates = ' AND i.template IN ("' . implode('","', $templates) . '")';
                                    }
                                    // default source for retrieving items (embedded or not)
                                    $DB->query('
                    SELECT SQL_CALC_FOUND_ROWS i.id
                      FROM nv_items i, nv_structure s, nv_webdictionary d
                     WHERE i.category IN(' . implode(",", $categories) . ')
                       AND i.website = ' . $website->id . '
                       AND i.permission <= ' . $permission . '
                       AND (i.date_published = 0 OR i.date_published < ' . core_time() . ')
                       AND (i.date_unpublish = 0 OR i.date_unpublish > ' . core_time() . ')
                       AND s.id = i.category
                       AND (s.date_published = 0 OR s.date_published < ' . core_time() . ')
                       AND (s.date_unpublish = 0 OR s.date_unpublish > ' . core_time() . ')
                       AND s.permission <= ' . $permission . '
                       AND (s.access = 0 OR s.access = ' . $access . $access_extra . ')
                       AND (i.access = 0 OR i.access = ' . $access . $access_extra_items . ')
                       AND d.website = i.website
                       AND d.node_type = "item"
                       AND d.subtype = "title"
                       AND d.node_id = i.id
                       AND d.lang = ' . protect($current['lang']) . '                       
                     ' . $templates . '
                     ' . $exclude . '
                     ORDER BY i.position ASC
                     LIMIT 1
                ');
                                    $rs = $DB->result();
                                    $tmp = new item();
                                    $tmp->load($rs[0]->id);
                                    $rs = $tmp->galleries[0];
                                    $total = count($rs);
                                }
                            }
                        } else {
                            if ($vars['nvlist_parent_type'] == 'item') {
                                $pitem = $vars['nvlist_parent_item'];
                                $rs = $pitem->galleries[0];
                                $total = count($rs);
                            }
                        }
                        if ($total > 0) {
                            $order = 'priority';
                            // display images using the assigned priority
                            if (!empty($vars['order'])) {
                                $order = $vars['order'];
                            }
                            $rs = nvweb_gallery_reorder($rs, $order);
                            // prepare format to be parsed by nv list iterator
                            $rs = array_map(function ($k, $v) {
                                $v['file'] = $k;
                                return $v;
                            }, array_keys($rs), array_values($rs));
                        }
                    } else {
                        if ($vars['source'] == 'rss') {
                            // url may be a property
                            $rss_url = $vars['url'];
                            if (strpos($vars['url'], "http") !== 0) {
                                $rss_url = nvweb_properties(array('property' => $vars['url']));
                            }
                            list($rs, $total) = nvweb_list_get_from_rss($rss_url, @$vars['cache'], $offset, $vars['items'], $permission, $order);
                        } else {
                            if ($vars['source'] == 'twitter') {
                                list($rs, $total) = nvweb_list_get_from_twitter($vars['username'], @$vars['cache'], $offset, $vars['items'], $permission, $order);
                            } else {
                                if (!empty($vars['source'])) {
                                    // CUSTOM data source
                                    if ($vars['source'] == 'comment') {
                                        $vars['source'] = 'comments';
                                    }
                                    $fname = 'nvweb_' . $vars['source'] . '_list';
                                    if ($vars['source'] == 'website_comments') {
                                        $vars['source'] = 'comments';
                                    }
                                    nvweb_webget_load($vars['source']);
                                    if (function_exists($fname)) {
                                        list($rs, $total) = $fname($offset, $vars['items'], $permission, $order, $vars);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    $categories = array_filter($categories);
    // DATA SOURCE not given or ERROR ===> items
    if ((empty($vars['source']) || !is_numeric($total)) && !empty($categories)) {
        /*
                 * TO DO: design decision ... lists should show items from published categories which has unpublished parent?
                 *
                 * Navigate CMS 1.6.7: NO
                 *
        // we have to check all website UNPUBLISHED categories to keep the list query efficient
                // there are some cases:
                //  a) Permission is beyond user's level [0=>public, 1=>private, 2=>hidden]
                //  b) Date published is set and the value is before the current time (not yet published)
                //  c) Date unpublish is set and the value is before the current time (no more published)
                //  d) User account level not allowed [0=>everyone, 1=>signed in users, 2=>users NOT signed in]
                $DB->query('
                    SELECT id
                      FROM nv_structure
                     WHERE website = '.protect($website->id).'
                       AND (    permission > '.$permission.'
                             OR (date_published > 0 AND '.$website->current_time().' > date_published)
                             OR (date_unpublish > 0 AND '.$website->current_time().' > date_unpublish)
                             OR (access <> 0 AND access <> '.$access.')
                       )
                ');
        $hidden_categories = $DB->result('id');
        // now we would have to mark the children categories also as unpublished
        */
        $filters = '';
        if (!empty($vars['filter'])) {
            $filters = nvweb_list_parse_filters($vars['filter'], 'items');
        }
        // reuse structure.access permission
        $access_extra_items = str_replace('s.', 'i.', $access_extra);
        $embedded = $vars['embedded'] == 'true' ? '1' : '0';
        $templates = "";
        if (!empty($vars['templates'])) {
            $templates = explode(",", $vars['templates']);
            $templates = array_filter($templates);
            if ($embedded == '1') {
                $templates = ' AND s.template IN ("' . implode('","', $templates) . '")';
            } else {
                $templates = ' AND i.template IN ("' . implode('","', $templates) . '")';
            }
        }
        $columns_extra = '';
        if ($vars['order'] == 'comments') {
            // we need to retrieve the number of comments to apply the order by clause
            $columns_extra = ', (SELECT COUNT(c.id) FROM nv_comments c WHERE i.id = c.item AND c.website = i.website AND c.status = 0) AS comments_published';
        }
        // default source for retrieving items
        $query = '
			SELECT SQL_CALC_FOUND_ROWS i.id, i.permission, i.date_published, i.date_unpublish,
                    i.date_to_display, COALESCE(NULLIF(i.date_to_display, 0), i.date_created) as pdate,
                    d.text as title, i.position as position, s.position ' . $columns_extra . '
			  FROM nv_items i, nv_structure s, nv_webdictionary d			          
			 WHERE i.category IN(' . implode(",", $categories) . ')
			   AND i.website = ' . $website->id . '
			   AND i.permission <= ' . $permission . '
			   AND i.embedding = ' . $embedded . '
			   AND (i.date_published = 0 OR i.date_published < ' . core_time() . ')
			   AND (i.date_unpublish = 0 OR i.date_unpublish > ' . core_time() . ')
			   AND s.id = i.category
			   AND (s.date_published = 0 OR s.date_published < ' . core_time() . ')
			   AND (s.date_unpublish = 0 OR s.date_unpublish > ' . core_time() . ')
			   AND s.permission <= ' . $permission . '
			   AND (s.access = 0 OR s.access = ' . $access . $access_extra . ')
			   AND (i.access = 0 OR i.access = ' . $access . $access_extra_items . ')
               AND d.website = i.website
			   AND d.node_type = "item"
			   AND d.subtype = "title"
			   AND d.node_id = i.id
			   AND d.lang = ' . protect($current['lang']) . '
             ' . $filters . '
		     ' . $templates . '
			 ' . $exclude . '
			 ' . $orderby . '
			 LIMIT ' . $vars['items'] . '
			OFFSET ' . $offset;
        $DB->query($query);
        $rs = $DB->result();
        $total = $DB->foundRows();
    }
    // now we have all elements that will be shown in the list
    // let's apply the nvlist template to each one
    for ($i = 0; $i < count($rs); $i++) {
        // ignore empty objects
        if ($vars['source'] != 'gallery' && empty($rs[$i]->id) || $vars['source'] == 'gallery' && empty($rs[$i]['file'])) {
            continue;
        }
        // prepare a standard  $item  with the current element
        if ($vars['source'] == 'comments' || $vars['source'] == 'comment') {
            $item = $rs[$i];
        } else {
            if ($vars['source'] == 'structure' || $vars['source'] == 'category') {
                $item = new structure();
                $item->load($rs[$i]->id);
                $item->date_to_display = $rs[$i]->pdate;
            } else {
                if ($vars['source'] == 'rss' || $vars['source'] == 'twitter' || $vars['source'] == 'block_link') {
                    // item is virtually created
                    $item = $rs[$i];
                } else {
                    if ($vars['source'] == 'block' || $vars['source'] == 'block_group') {
                        if (get_class($rs[$i]) == 'block') {
                            // standard block
                            $item = $rs[$i];
                        } else {
                            if (isset($rs[$i]->_object_type) && $rs[$i]->_object_type == "block_group_block_type") {
                                // block type definition (mainly used to add a title before a list of blocks of the same type)
                                $item = $rs[$i];
                            } else {
                                if (isset($rs[$i]->extension)) {
                                    // extension block
                                    $item = block::extension_block($rs[$i]->extension, $rs[$i]->id);
                                    $item->type = "extension";
                                    $item->extension = $rs[$i]->extension;
                                    $item->uid = $rs[$i]->uid;
                                } else {
                                    // block from block group
                                    $item = new block();
                                    $item->load_from_block_group($vars['type'], $rs[$i]->id, $rs[$i]->uid);
                                }
                            }
                        }
                    } else {
                        if ($vars['source'] == 'gallery') {
                            $item = $rs[$i];
                        } else {
                            $item = new item();
                            $item->load($rs[$i]->id);
                            // if the item comes from a custom source, save the original query result
                            // this allows getting a special field without extra work ;)
                            $item->_query = $rs[$i];
                        }
                    }
                }
            }
        }
        // get the nv list template
        $item_html = $vars['template'];
        // first we need to isolate the nested nv lists/searches
        unset($nested_lists_fragments);
        list($item_html, $nested_lists_fragments) = nvweb_list_isolate_lists($item_html);
        // now, parse the nvlist_conditional tags (with html source code inside (and other nvlist tags))
        unset($nested_condition_fragments);
        list($item_html, $nested_conditional_fragments) = nvweb_list_isolate_conditionals($item_html);
        $conditional_placeholder_tags = nvweb_tags_extract($item_html, 'nvlist_conditional_placeholder', true, true, 'UTF-8');
        // selfclosing = true
        while (!empty($conditional_placeholder_tags)) {
            $tag = $conditional_placeholder_tags[0];
            $conditional = $nested_conditional_fragments[$tag["attributes"]["id"]];
            $conditional_html_output = nvweb_list_parse_conditional($conditional, $item, $conditional['nvlist_conditional_template'], $i, count($rs));
            $item_html = str_replace($tag["full_tag"], $conditional_html_output, $item_html);
            $conditional_placeholder_tags = nvweb_tags_extract($item_html, 'nvlist_conditional_placeholder', true, true, 'UTF-8');
            // selfclosing = true
        }
        // now, parse the (remaining) common nvlist tags (selfclosing tags)
        $template_tags_processed = 0;
        $template_tags = nvweb_tags_extract($item_html, 'nvlist', true, true, 'UTF-8');
        // selfclosing = true
        while (!empty($template_tags)) {
            $tag = $template_tags[0];
            // protect the "while" loop, maximum 500 nvlist tags parsed!
            $template_tags_processed++;
            if ($template_tags_processed > 500) {
                break;
            }
            $content = nvweb_list_parse_tag($tag, $item, $vars['source'], $i, $i + $offset, $total);
            $item_html = str_replace($tag['full_tag'], $content, $item_html);
            // html template has changed, the nvlist tags may have changed its positions
            $template_tags = nvweb_tags_extract($item_html, 'nvlist', true, true, 'UTF-8');
        }
        // restore & process nested lists (if any)
        foreach ($nested_lists_fragments as $nested_list_uid => $nested_list_vars) {
            $nested_list_vars['nvlist_parent_vars'] = $vars;
            $nested_list_vars['nvlist_parent_type'] = $vars['source'];
            $nested_list_vars['nvlist_parent_item'] = $item;
            $content = nvweb_list($nested_list_vars);
            $item_html = str_replace('<!--#' . $nested_list_uid . '#-->', $content, $item_html);
        }
        $out[] = $item_html;
    }
    if (count($rs) == 0) {
        // special case, no results found
        // get the nv list template and parse only the conditional: <nvlist_conditional by="count" value="empty"> (or value=0)
        $item_html = $vars['template'];
        // now, parse the nvlist_conditional tags (with html source code inside (and other nvlist tags))
        unset($nested_condition_fragments);
        list($item_html, $nested_conditional_fragments) = nvweb_list_isolate_conditionals($item_html);
        // remove all tags except (selfclosing) nvlist_conditional_placeholder
        $item_html = strip_tags($item_html, '<nvlist_conditional_placeholder>');
        $conditional_placeholder_tags = nvweb_tags_extract($item_html, 'nvlist_conditional_placeholder', true, true, 'UTF-8');
        // selfclosing=true
        while (!empty($conditional_placeholder_tags)) {
            $tag = $conditional_placeholder_tags[0];
            $conditional = $nested_conditional_fragments[$tag["attributes"]["id"]];
            $conditional_html_output = nvweb_list_parse_conditional($conditional, NULL, $conditional['nvlist_conditional_template'], $i, count($rs));
            $item_html = str_replace($tag["full_tag"], $conditional_html_output, $item_html);
            $conditional_placeholder_tags = nvweb_tags_extract($item_html, 'nvlist_conditional_placeholder', true, true, 'UTF-8');
            // selfclosing = true
        }
        $out[] = $item_html;
    }
    if (isset($vars['paginator']) && $vars['paginator'] != 'false') {
        $out[] = nvweb_list_paginator($vars['paginator'], $_GET['page'], $total, $vars['items'], $vars);
    }
    return implode("\n", $out);
}