753 lines
40 KiB
XML
753 lines
40 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<templates>
|
|
<template type="admin" title="helper_criteria" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="user_tabs" arg-container="" arg-userTabTitle="" arg-active="">
|
|
<xf:set var="$tabs">
|
|
<a class="tabs-tab{{ $active == 'user' ? ' is-active' : '' }}"
|
|
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaUser') }}">
|
|
{{ $userTabTitle ? $userTabTitle : phrase('user_criteria') }}</a>
|
|
<a class="tabs-tab{{ $active == 'user_field' ? ' is-active' : '' }}"
|
|
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaUserField') }}">
|
|
{{ phrase('custom_userfield_criteria') }}</a>
|
|
</xf:set>
|
|
<xf:if is="$container">
|
|
<div class="tabs" role="tablist">
|
|
{$tabs|raw}
|
|
</div>
|
|
<xf:else />
|
|
{$tabs|raw}
|
|
</xf:if>
|
|
</xf:macro>
|
|
|
|
<xf:macro id="page_tabs" arg-container="" arg-active="">
|
|
<xf:set var="$tabs">
|
|
<a class="tabs-tab{{ $active == 'page' ? ' is-active' : '' }}"
|
|
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaPage') }}">{{ phrase('page_criteria') }}</a>
|
|
</xf:set>
|
|
<xf:if is="$container">
|
|
<div class="tabs" role="tablist">
|
|
{$tabs|raw}
|
|
</div>
|
|
<xf:else />
|
|
{$tabs|raw}
|
|
</xf:if>
|
|
</xf:macro>
|
|
|
|
<xf:macro id="user_panes" arg-container="" arg-active="" arg-criteria="!" arg-data="!">
|
|
|
|
<xf:set var="$app" value="{$xf.app}" />
|
|
<xf:set var="$visitor" value="{$xf.visitor}" />
|
|
<xf:set var="$em" value="{$app.em}" />
|
|
|
|
<xf:set var="$panes">
|
|
<li class="{{ $active == 'user' ? ' is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaUser') }}">
|
|
<!--[XF:user:top]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('privileges_and_status') }}">
|
|
<!--[XF:user:status_top]-->
|
|
|
|
<xf:option name="user_criteria[is_guest][rule]" value="is_guest" selected="{$criteria.is_guest}"
|
|
label="{{ phrase('user_is_guest') }}" />
|
|
<xf:option name="user_criteria[is_logged_in][rule]" value="is_logged_in" selected="{$criteria.is_logged_in}"
|
|
label="{{ phrase('user_is_logged_in') }}" />
|
|
<xf:option name="user_criteria[is_moderator][rule]" value="is_moderator" selected="{$criteria.is_moderator}"
|
|
label="{{ phrase('user_is_moderator') }}" />
|
|
<xf:option name="user_criteria[is_admin][rule]" value="is_admin" selected="{$criteria.is_admin}"
|
|
label="{{ phrase('user_is_administrator') }}" />
|
|
<xf:option name="user_criteria[is_banned][rule]" value="is_banned" selected="{$criteria.is_banned}"
|
|
label="{{ phrase('user_is_banned') }}"/>
|
|
<xf:option name="user_criteria[birthday][rule]" value="birthday" selected="{$criteria.birthday}"
|
|
label="{{ phrase('user_birthday_is_today') }}"/>
|
|
<xf:option name="user_criteria[user_state][rule]" value="user_state" selected="{$criteria.user_state}"
|
|
label="{{ phrase('user_state_is:') }}">
|
|
|
|
<xf:dependent>
|
|
<xf:select name="user_criteria[user_state][data][state]" value="{$criteria.user_state.state}">
|
|
<xf:option value="valid">{{ phrase('valid') }}</xf:option>
|
|
<xf:option value="email_confirm">{{ phrase('awaiting_email_confirmation') }}</xf:option>
|
|
<xf:option value="email_confirm_edit">{{ phrase('awaiting_email_confirmation_from_edit') }}</xf:option>
|
|
<xf:option value="email_bounce">{{ phrase('email_invalid_bounced') }}</xf:option>
|
|
<xf:option value="moderated">{{ phrase('awaiting_approval') }}</xf:option>
|
|
<xf:option value="rejected">{{ phrase('rejected') }}</xf:option>
|
|
<xf:option value="disabled">{{ phrase('disabled') }}</xf:option>
|
|
</xf:select>
|
|
</xf:dependent>
|
|
|
|
</xf:option>
|
|
|
|
<!--[XF:user:status_bottom]-->
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_status]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('connected_accounts') }}">
|
|
<xf:option name="user_criteria[connected_accounts][rule]" value="connected_accounts" selected="{$criteria.connected_accounts}"
|
|
label="{{ phrase('user_is_associated_with_any_of_selected_connected_account_providers:') }}">
|
|
|
|
<xf:select name="user_criteria[connected_accounts][data][provider_ids]" size="4" multiple="true" value="{$criteria.connected_accounts.provider_ids}">
|
|
<xf:options source="$data.connectedAccProviders" />
|
|
</xf:select>
|
|
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_connected]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('user_groups') }}">
|
|
<xf:option name="user_criteria[user_groups][rule]" value="user_groups" selected="{$criteria.user_groups}"
|
|
label="{{ phrase('user_is_member_of_any_of_selected_user_groups:') }}">
|
|
|
|
<xf:select name="user_criteria[user_groups][data][user_group_ids]" size="4" multiple="true" value="{$criteria.user_groups.user_group_ids}">
|
|
<xf:foreach loop="$data.userGroups" key="$userGroupId" value="$userGroupTitle">
|
|
<xf:option value="{$userGroupId}">{$userGroupTitle}</xf:option>
|
|
</xf:foreach>
|
|
</xf:select>
|
|
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[not_user_groups][rule]" value="not_user_groups" selected="{$criteria.not_user_groups}"
|
|
label="{{ phrase('user_is_not_member_of_any_of_selected_user_groups:') }}">
|
|
|
|
<xf:select name="user_criteria[not_user_groups][data][user_group_ids]" size="4" multiple="true" value="{$criteria.not_user_groups.user_group_ids}">
|
|
<xf:foreach loop="$data.userGroups" key="$userGroupId" value="$userGroupTitle">
|
|
<xf:option value="{$userGroupId}">{$userGroupTitle}</xf:option>
|
|
</xf:foreach>
|
|
</xf:select>
|
|
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_groups]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('content_and_achievements') }}">
|
|
<!--[XF:user:content_top]-->
|
|
|
|
<xf:option name="user_criteria[messages_posted][rule]" value="messages_posted" selected="{$criteria.messages_posted}"
|
|
label="{{ phrase('user_has_posted_at_least_x_messages:') }}">
|
|
<xf:numberbox name="user_criteria[messages_posted][data][messages]" value="{$criteria.messages_posted.messages}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[messages_maximum][rule]" value="messages_maximum" selected="{$criteria.messages_maximum}"
|
|
label="{{ phrase('user_has_posted_no_more_than_x_messages:') }}">
|
|
<xf:numberbox name="user_criteria[messages_maximum][data][messages]" value="{$criteria.messages_maximum.messages}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<!--[XF:user:content_after_messages]-->
|
|
|
|
<xf:option name="user_criteria[questions_solved_min][rule]" value="questions_solved_min" selected="{$criteria.questions_solved_min}"
|
|
label="{{ phrase('user_has_solved_at_least_x_questions:') }}">
|
|
<xf:numberbox name="user_criteria[questions_solved_min][data][solved]" value="{$criteria.questions_solved_min.solved}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[questions_solved_max][rule]" value="questions_solved_max" selected="{$criteria.questions_solved_max}"
|
|
label="{{ phrase('user_has_solved_no_more_than_x_questions:') }}">
|
|
<xf:numberbox name="user_criteria[questions_solved_max][data][solved]" value="{$criteria.questions_solved_max.solved}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<!--[XF:user:content_after_questions]-->
|
|
|
|
<xf:option name="user_criteria[reaction_score][rule]" value="reaction_score" selected="{$criteria.reaction_score}"
|
|
label="{{ phrase('user_has_received_a_reaction_sore_of_at_least_x:') }}">
|
|
<xf:numberbox name="user_criteria[reaction_score][data][reactions]" value="{$criteria.reaction_score.reactions}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[reaction_ratio][rule]" value="reaction_ratio" selected="{$criteria.reaction_ratio}"
|
|
label="{{ phrase('user_reaction_message_ratio_is_at_least:') }}">
|
|
<xf:numberbox name="user_criteria[reaction_ratio][data][ratio]" value="{$criteria.reaction_ratio.ratio}"
|
|
size="5" min="0" step="0.25" />
|
|
<xf:afterhint>{{ phrase('reaction_message_ratio_explanation') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<!--[XF:user:content_after_reactions]-->
|
|
|
|
<xf:option name="user_criteria[trophy_points][rule]" value="trophy_points" selected="{$criteria.trophy_points}"
|
|
label="{{ phrase('user_has_at_least_x_trophy_points:') }}">
|
|
<xf:numberbox name="user_criteria[trophy_points][data][points]" value="{$criteria.trophy_points.points}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<!--[XF:user:content_after_trophies]-->
|
|
|
|
<xf:option name="user_criteria[registered_days][rule]" value="registered_days" selected="{$criteria.registered_days}"
|
|
label="{{ phrase('user_has_been_registered_for_at_least_x_days:') }}">
|
|
<xf:numberbox name="user_criteria[registered_days][data][days]" value="{$criteria.registered_days.days}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[inactive_days][rule]" value="inactive_days" selected="{$criteria.inactive_days}"
|
|
label="{{ phrase('user_has_not_visited_for_at_least_x_days:') }}">
|
|
<xf:numberbox name="user_criteria[inactive_days][data][days]" value="{$criteria.inactive_days.days}"
|
|
size="5" min="0" step="1" />
|
|
</xf:option>
|
|
|
|
<!--[XF:user:content_bottom]-->
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_content]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('user_profile_and_options') }}">
|
|
<!--[XF:user:profile_top]-->
|
|
|
|
<xf:option name="user_criteria[language][rule]" value="language" selected="{$criteria.language}"
|
|
label="{{ phrase('user_is_browsing_with_following_language:') }}">
|
|
|
|
<xf:select name="user_criteria[language][data][language_id]" value="{$criteria.language.language_id}">
|
|
<xf:foreach loop="$data.languageTree.getFlattened(0)" value="$treeEntry">
|
|
<xf:option value="{$treeEntry.record.language_id}">{{ repeat('--', $treeEntry.depth) }} {$treeEntry.record.title}</xf:option>
|
|
</xf:foreach>
|
|
</xf:select>
|
|
|
|
</xf:option>
|
|
|
|
<xf:optgroup label="{{ phrase('avatar:') }}">
|
|
<xf:option name="user_criteria[has_avatar][rule]" value="has_avatar" selected="{$criteria.has_avatar}"
|
|
label="{{ phrase('user_has_avatar') }}" />
|
|
|
|
<xf:option name="user_criteria[no_avatar][rule]" value="no_avatar" selected="{$criteria.no_avatar}"
|
|
label="{{ phrase('user_has_no_avatar') }}" />
|
|
</xf:optgroup>
|
|
|
|
<xf:optgroup label="{{ phrase('high_resolution_avatar:') }}">
|
|
<xf:option name="user_criteria[has_highdpi_avatar][rule]" value="has_highdpi_avatar" selected="{$criteria.has_highdpi_avatar}"
|
|
label="{{ phrase('user_has_highdpi_avatar') }}" />
|
|
|
|
<xf:option name="user_criteria[no_highdpi_avatar][rule]" value="no_highdpi_avatar" selected="{$criteria.no_highdpi_avatar}"
|
|
label="{{ phrase('user_has_no_highdpi_avatar') }}" />
|
|
</xf:optgroup>
|
|
|
|
<xf:optgroup label="{{ phrase('two_step_verification:') }}">
|
|
<xf:option name="user_criteria[with_tfa][rule]" value="with_tfa" selected="{$criteria.with_tfa}"
|
|
label="{{ phrase('user_has_enabled_two_step_verification') }}" />
|
|
|
|
<xf:option name="user_criteria[without_tfa][rule]" value="without_tfa" selected="{$criteria.without_tfa}"
|
|
label="{{ phrase('user_has_not_enabled_two_step_verification') }}"/>
|
|
</xf:optgroup>
|
|
|
|
<xf:optgroup label="{{ phrase('activity_summary_email:') }}">
|
|
<xf:option name="user_criteria[activity_summary_enabled][rule]" value="activity_summary_enabled" selected="{$criteria.activity_summary_enabled}"
|
|
label="{{ phrase('user_has_activity_summary_emails_enabled') }}" />
|
|
|
|
<xf:option name="user_criteria[activity_summary_disabled][rule]" value="activity_summary_disabled" selected="{$criteria.activity_summary_disabled}"
|
|
label="{{ phrase('user_has_activity_summary_emails_disabled') }}"/>
|
|
</xf:optgroup>
|
|
|
|
<!--[XF:user:profile_bottom]-->
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_profile]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('user_segmentation') }}">
|
|
<!--[XF:user:segmentation_top]-->
|
|
|
|
<xf:option name="user_criteria[user_id][rule]" value="user_id" selected="{$criteria.user_id}"
|
|
label="{{ phrase('user_id_matches_expression:') }}">
|
|
<xf:textbox
|
|
name="user_criteria[user_id][data][expression]"
|
|
value="{$criteria.user_id.expression}"
|
|
placeholder="2n+1"
|
|
/>
|
|
<xf:afterhint>{{ phrase('user_id_match_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<!--[XF:user:segmentation_bottom]-->
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:user:after_segmentation]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('specific_users') }}">
|
|
<!--[XF:user:specific_top]-->
|
|
|
|
<xf:option name="user_criteria[username][rule]" value="username" selected="{$criteria.username}"
|
|
label="{{ phrase('username_is:') }}">
|
|
<xf:textbox name="user_criteria[username][data][names]" value="{$criteria.username.names}" ac="true" />
|
|
<xf:afterhint>{{ phrase('username_criteria_explain') }}</xf:afterhint>
|
|
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[username_search][rule]" value="username_search" selected="{$criteria.username_search}"
|
|
label="{{ phrase('username_contains:') }}">
|
|
<xf:textbox name="user_criteria[username_search][data][needles]" value="{$criteria.username_search.needles}" />
|
|
<xf:afterhint>{{ phrase('username_search_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<xf:option name="user_criteria[email_search][rule]" value="email_search" selected="{$criteria.email_search}"
|
|
label="{{ phrase('email_address_contains:') }}">
|
|
<xf:textbox name="user_criteria[email_search][data][needles]" value="{$criteria.email_search.needles}" />
|
|
<xf:afterhint>{{ phrase('email_search_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<!--[XF:user:specific_bottom]-->
|
|
</xf:checkboxrow>
|
|
|
|
<!--[XF:user:bottom]-->
|
|
</li>
|
|
|
|
<li class="{{ $active == 'user_field' ? 'is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaUserField') }}">
|
|
<xf:if contentcheck="true">
|
|
<xf:contentcheck>
|
|
<xf:foreach loop="$xf.app.em.getRepository('XF:UserField').getDisplayGroups()" key="$fieldGroup" value="$groupPhrase">
|
|
|
|
<xf:set var="$customFields" value="{$app.getCustomFields('users', $fieldGroup)}" />
|
|
<xf:if contentcheck="true">
|
|
<h2 class="block-formSectionHeader"><span class="block-formSectionHeader-aligner">{$groupPhrase}</span></h2>
|
|
<xf:contentcheck>
|
|
<xf:foreach loop="$customFields" key="$fieldId" value="$fieldDefinition">
|
|
<xf:set var="$fieldName" value="user_field_{$fieldId}" />
|
|
<xf:set var="$choices" value="{$fieldDefinition.field_choices}" />
|
|
<xf:checkboxrow label="{$fieldDefinition.title}">
|
|
<xf:option name="user_criteria[{$fieldName}][rule]" value="{$fieldName}" selected="{$criteria.{$fieldName}}"
|
|
label="{{ $choices ? phrase('criteria_userfield_choice_among') : phrase('criteria_userfield_contains_text:') }}">
|
|
<xf:dependent>
|
|
<xf:if is="!{$choices}">
|
|
<xf:textbox name="user_criteria[{$fieldName}][data][text]" value="{$criteria.{$fieldName}.text}" />
|
|
<xf:elseif is="{{ count($choices) }} > 6" />
|
|
<xf:select name="user_criteria[{$fieldName}][data][choices]" value="{$criteria.{$fieldName}.choices}" multiple="multiple" size="5">
|
|
<xf:options source="{$choices}" />
|
|
</xf:select>
|
|
<xf:else />
|
|
<xf:checkbox name="user_criteria[{$fieldName}][data][choices]" value="{$criteria.{$fieldName}.choices}" listclass="listColumns">
|
|
<xf:options source="{$choices}" />
|
|
</xf:checkbox>
|
|
</xf:if>
|
|
</xf:dependent>
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
</xf:foreach>
|
|
</xf:contentcheck>
|
|
</xf:if>
|
|
|
|
</xf:foreach>
|
|
</xf:contentcheck>
|
|
<xf:else />
|
|
{{ phrase('no_custom_fields_have_been_created_yet') }}
|
|
</xf:if>
|
|
</li>
|
|
</xf:set>
|
|
|
|
<xf:if is="$container">
|
|
<ul class="tabPanes">
|
|
{$panes|raw}
|
|
</ul>
|
|
<xf:else />
|
|
{$panes|raw}
|
|
</xf:if>
|
|
</xf:macro>
|
|
|
|
<xf:macro id="page_panes" arg-container="" arg-active="" arg-criteria="!" arg-data="!">
|
|
|
|
<xf:set var="$em" value="{$xf.app.em}" />
|
|
<xf:set var="$visitor" value="{$xf.visitor}" />
|
|
|
|
<xf:set var="$panes">
|
|
<li class="{{ $active == 'page' ? ' is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaPage') }}">
|
|
<!--[XF:page:after_from_search]-->
|
|
|
|
<xf:checkboxrow>
|
|
<xf:option name="page_criteria[after][rule]" value="after" selected="{$criteria.after}"
|
|
label="{{ phrase('criteria_date_time_is_after:') }}">
|
|
|
|
<xf:dependent>
|
|
<div class="inputGroup">
|
|
<xf:dateinput name="page_criteria[after][data][ymd]" value="{$criteria.after.ymd}" />
|
|
<span class="inputGroup-text">
|
|
{{ phrase('criteria_time:') }}
|
|
</span>
|
|
<span class="inputGroup" dir="ltr">
|
|
<xf:select name="page_criteria[after][data][hh]" value="{$criteria.after.hh}" class="input--inline input--autoSize">
|
|
<xf:foreach loop="$data.hours" value="$hour">
|
|
<xf:option value="{$hour}" label="{$hour}" />
|
|
</xf:foreach>
|
|
</xf:select>
|
|
<span class="inputGroup-text">:</span>
|
|
<xf:select name="page_criteria[after][data][mm]" value="{$criteria.after.mm}" class="input--inline input--autoSize">
|
|
<xf:foreach loop="$data.minutes" value="$minute">
|
|
<xf:option value="{$minute}" label="{$minute}" />
|
|
</xf:foreach>
|
|
</xf:select>
|
|
</span>
|
|
</div>
|
|
<dfn class="inputChoices-explain inputChoices-explain--after">{{ phrase('criteria_leave_date_empty') }}</dfn>
|
|
</xf:dependent>
|
|
|
|
<xf:radio name="page_criteria[after][data][user_tz]" value="{{ $criteria.after.user_tz ? $criteria.after.user_tz : 0 }}">
|
|
<xf:option value="1" label="{{ phrase('criteria_in_visitor_timezone') }}" />
|
|
<xf:option value="0" label="{{ phrase('criteria_in_selected_timezone:') }}">
|
|
<xf:select name="page_criteria[after][data][timezone]" value="{{ $criteria.after.timezone ? $criteria.after.timezone : $visitor.timezone }}">
|
|
<xf:options source="{$data.timeZones}" />
|
|
</xf:select>
|
|
</xf:option>
|
|
</xf:radio>
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:page:after_time_after]-->
|
|
|
|
<xf:checkboxrow>
|
|
<xf:option name="page_criteria[before][rule]" value="before" selected="{$criteria.before}"
|
|
label="{{ phrase('criteria_date_time_is_before:') }}">
|
|
|
|
<xf:dependent>
|
|
<div class="inputGroup">
|
|
<xf:dateinput name="page_criteria[before][data][ymd]" value="{$criteria.before.ymd}" />
|
|
<span class="inputGroup-text">
|
|
{{ phrase('criteria_time:') }}
|
|
</span>
|
|
<span class="inputGroup" dir="ltr">
|
|
<xf:select name="page_criteria[before][data][hh]" value="{$criteria.before.hh}" class="input--inline input--autoSize">
|
|
<xf:foreach loop="$data.hours" value="$hour">
|
|
<xf:option value="{$hour}" label="{$hour}" />
|
|
</xf:foreach>
|
|
</xf:select>
|
|
<span class="inputGroup-text">:</span>
|
|
<xf:select name="page_criteria[before][data][mm]" value="{$criteria.before.mm}" class="input--inline input--autoSize">
|
|
<xf:foreach loop="$data.minutes" value="$minute">
|
|
<xf:option value="{$minute}" label="{$minute}" />
|
|
</xf:foreach>
|
|
</xf:select>
|
|
</span>
|
|
</div>
|
|
<dfn class="inputChoices-explain inputChoices-explain--before">{{ phrase('criteria_leave_date_empty') }}</dfn>
|
|
</xf:dependent>
|
|
|
|
<xf:radio name="page_criteria[before][data][user_tz]" value="{{ $criteria.before.user_tz ? $criteria.before.user_tz : 0 }}">
|
|
<xf:option value="1" label="{{ phrase('criteria_in_visitor_timezone') }}" />
|
|
<xf:option value="0" label="{{ phrase('criteria_in_selected_timezone:') }}">
|
|
<xf:select name="page_criteria[before][data][timezone]" value="{{ $criteria.before.timezone ? $criteria.before.timezone : $visitor.timezone }}">
|
|
<xf:options source="{$data.timeZones}" />
|
|
</xf:select>
|
|
</xf:option>
|
|
</xf:radio>
|
|
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:page:after_time_before]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('nodes') }}">
|
|
<xf:option name="page_criteria[nodes][rule]" value="nodes" selected="{$criteria.nodes}"
|
|
label="{{ phrase('page_is_within_nodes:') }}">
|
|
|
|
<xf:select name="page_criteria[nodes][data][node_ids]" multiple="true" value="{$criteria.nodes.node_ids}">
|
|
<xf:foreach loop="$data.nodes" value="$option">
|
|
<xf:option value="{$option.value}" label="{$option.label}" />
|
|
</xf:foreach>
|
|
</xf:select>
|
|
<xf:checkbox>
|
|
<xf:option name="page_criteria[nodes][data][node_only]" value="1" selected="{$criteria.nodes.node_only}"
|
|
label="{{ phrase('only_display_within_selected_nodes_no_children') }}" />
|
|
</xf:checkbox>
|
|
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<hr class="formRowSep" />
|
|
|
|
<!--[XF:page:after_nodes]-->
|
|
|
|
<xf:checkboxrow label="{{ phrase('page_information') }}">
|
|
<xf:option name="page_criteria[style][rule]" value="style" selected="{$criteria.style}"
|
|
label="{{ phrase('user_is_browsing_with_following_style:') }}">
|
|
|
|
<xf:select name="page_criteria[style][data][style_id]" value="{$criteria.style.style_id}">
|
|
<xf:foreach loop="$data.styleTree.getFlattened(0)" value="$treeEntry">
|
|
<xf:option value="{$treeEntry.record.style_id}">{{ repeat('--', $treeEntry.depth) }} {$treeEntry.record.title}</xf:option>
|
|
</xf:foreach>
|
|
</xf:select>
|
|
|
|
</xf:option>
|
|
|
|
<xf:option name="page_criteria[tab][rule]" value="tab" selected="{$criteria.tab}"
|
|
label="{{ phrase('selected_navigation_tab_id_is:') }}">
|
|
|
|
<xf:textbox name="page_criteria[tab][data][id]" value="{$criteria.tab.id}"dir="ltr" />
|
|
<xf:afterhint>{{ phrase('selected_tab_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<xf:option name="page_criteria[controller][rule]" value="controller" selected="{$criteria.controller}"
|
|
label="{{ phrase('controller_and_action_is:') }}">
|
|
|
|
<xf:macro id="helper_callback_fields::callback_fields"
|
|
arg-className="page_criteria[controller][data][name]"
|
|
arg-methodName="page_criteria[controller][data][action]"
|
|
arg-classValue="{$criteria.controller.name}"
|
|
arg-methodValue="{$criteria.controller.action}" />
|
|
<xf:afterhint>{{ phrase('controller_and_action_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<xf:option name="page_criteria[view][rule]" value="view" selected="{$criteria.view}"
|
|
label="{{ phrase('view_class_is:') }}">
|
|
|
|
<xf:textbox name="page_criteria[view][data][name]" value="{$criteria.view.name}" dir="ltr" />
|
|
<xf:afterhint>{{ phrase('view_class_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
|
|
<xf:option name="page_criteria[template][rule]" value="template" selected="{$criteria.template}"
|
|
label="{{ phrase('content_template_is:') }}">
|
|
|
|
<xf:textbox name="page_criteria[template][data][name]" value="{$criteria.template.name}" dir="ltr" />
|
|
<xf:afterhint>{{ phrase('content_template_criteria_explain') }}</xf:afterhint>
|
|
</xf:option>
|
|
</xf:checkboxrow>
|
|
|
|
<!--[XF:page:after_page_info]-->
|
|
</li>
|
|
</xf:set>
|
|
|
|
<xf:if is="$container">
|
|
<ul class="tabPanes">
|
|
{$panes|raw}
|
|
</ul>
|
|
<xf:else />
|
|
{$panes|raw}
|
|
</xf:if>
|
|
</xf:macro>]]></template>
|
|
<template type="admin" title="user_delete_account_codes" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>{$user.username}</xf:title>
|
|
|
|
<div class="block">
|
|
<div class="block-container">
|
|
<h3 class="block-minorHeader">{{ phrase('delete_account_code') }}</h3>
|
|
<div class="block-body">
|
|
<div class="block-row">{$deleteAccountCode}</div>
|
|
</div>
|
|
|
|
<h3 class="block-minorHeader">{{ phrase('delete_all_data_code') }}</h3>
|
|
<div class="block-body">
|
|
<div class="block-row">{$deleteAllDataCode}</div>
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template type="public" title="_help_page_about" version_id="1010070" version_string="1.1.0"><![CDATA[<div class="block">
|
|
<div class="block-container">
|
|
|
|
<strong>Site Purpose and Content Overview</strong>
|
|
|
|
This website is dedicated to the preservation, modification, and enhancement of classic retro games. It provides a platform for discussing and sharing modifications known as "romhacks," which are custom alterations made to game ROMs. Our focus is solely on the creative and non-commercial aspects of game modification and does not involve the distribution or use of copyrighted ROM files.
|
|
|
|
<strong>Clarification on ROMs and Hacking</strong>
|
|
<ul>
|
|
<li><strong>Legal Compliance:</strong> The site does not host or distribute any original copyrighted ROM files. All content shared here pertains exclusively to modifications of games for which users already own the original ROMs. It is intended for educational, archival, and enhancement purposes only.</li>
|
|
<li><strong>Non-Malicious Intent:</strong> The term "hacking" used on this site refers to the modification of game data and is not related to any form of malicious hacking or illegal activity. The modifications (romhacks) discussed and shared are created to enhance or alter the gameplay experience of retro games in a non-infringing manner.</li>
|
|
<li><strong>User Responsibility:</strong> Visitors are encouraged to ensure that any game ROMs they use are legally obtained and that their use complies with applicable copyright laws. The site does not provide or endorse illegal downloads of copyrighted material.</li>
|
|
</ul>
|
|
<strong>Contact Information</strong>
|
|
|
|
For any concerns or clarifications regarding the content of this site, please contact us directly. We are committed to complying with all legal requirements and ensuring that our platform remains a positive and creative space for retro gaming enthusiasts.
|
|
|
|
</div>
|
|
</div>]]></template>
|
|
<template type="public" title="_help_page_delete_my_data" version_id="1010070" version_string="1.1.0"><![CDATA[<strong>"The right to erasure"</strong> (Articles 17 & 19 of the GDPR) state you have the right to have your data erased, without undue delay by the data controller, if you withdraw your consent to the processing.
|
|
|
|
In here we explain in detail how to remove your data partially or completely from this site.
|
|
<h4>1. How to remove comments, threads:</h4>
|
|
Go to the post you want to delete and click on the delete button. If you want to delete a thread, delete the first post. If you can't delete a thread or a post, you can also send a report by clicking on the report button.
|
|
|
|
<img class="alignnone size-full wp-image-2461" src="{{ asset('romhackplaza','delete_comment.png') }}" alt="" />
|
|
<h4>2. How to remove entries:</h4>
|
|
To remove entries you have to edit your entry and revert its Status to "draft". A draft means it's unpublished and only you can see it. You can also delete permanently an entry with the delete button.
|
|
|
|
<img class="alignnone size-full wp-image-2462" src="{{ asset('romhackplaza','delete_entry.png') }}" alt="" />
|
|
|
|
<h4>3. How to remove the entire account:</h4>
|
|
Removing the account will remove all the comments, but it will not remove the entries. They will be anonymized and assigned to a "Deleted User", if you want to delete your entries follow the step above "How to remove entries".
|
|
<p style="text-align: center;"><strong><a style="color: red;" href="{{ link('account/delete-account') }}">To delete your account go here</a></strong></p>]]></template>
|
|
<template type="public" title="_help_page_dmca" version_id="1010070" version_string="1.1.0"><![CDATA[<h4>Introduction</h4>
|
|
Romhacks.org (hereafter referred to as "we", "us", or "our") respects the intellectual property rights of others and expects its users to do the same. We are committed to complying with the DMCA and other applicable laws. We adopt a policy of terminating, in appropriate circumstances, users who are repeat infringers. We may also, at our sole discretion, limit access to the Site and/or terminate the accounts of any users who infringe any intellectual property rights of others, whether or not there is any repeat infringement.
|
|
<h4>Copyright Infringement Notification</h4>
|
|
If you believe that your work has been copied in a way that constitutes copyright infringement, please <strong>submit your notification through our <a href="/contact-us/">contact form</a></strong>, ensuring to indicate "DMCA" in the subject line. The notification should include the following information:
|
|
<ol>
|
|
<li>A physical or electronic signature of a person authorized to act on behalf of the owner of an exclusive right that is allegedly infringed.</li>
|
|
<li>Identification of the copyrighted work claimed to have been infringed, or, if multiple copyrighted works at a single online site are covered by a single notification, a representative list of such works at that site.</li>
|
|
<li>Identification of the material that is claimed to be infringing or to be the subject of infringing activity and that is to be removed or access to which is to be disabled, and information reasonably sufficient to permit us to locate the material.</li>
|
|
<li>Information reasonably sufficient to permit us to contact the complaining party, such as an address, telephone number, and, if available, an electronic mail address at which the complaining party may be contacted.</li>
|
|
<li>A statement that the complaining party has a good faith belief that use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law.</li>
|
|
<li>A statement that the information in the notification is accurate, and under penalty of perjury, that the complaining party is authorized to act on behalf of the owner of an exclusive right that is allegedly infringed.</li>
|
|
</ol>
|
|
<h4>Counter-Notification Procedures</h4>
|
|
If you believe that your material has been removed by mistake or misidentification, please submit a counter-notification <strong>through our <a href="{{ link('misc/contact') }}">contact form</a></strong> with "DMCA" in the subject line. The counter-notification should contain the following information:
|
|
<ol>
|
|
<li>Your physical or electronic signature.</li>
|
|
<li>Identification of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access to it was disabled.</li>
|
|
<li>A statement under penalty of perjury that you have a good faith belief that the material was removed or disabled as a result of mistake or misidentification of the material to be removed or disabled.</li>
|
|
<li>Your name, address, and telephone number, and a statement that you consent to the jurisdiction of the federal court for [judicial district where your address is located], and that you will accept service of process from the person who provided notification of the alleged infringement.</li>
|
|
</ol>
|
|
If a counter-notice is received by us, we may send a copy of the counter-notice to the original complaining party informing that person that it may replace the removed material or cease disabling it in 10 business days. Unless the copyright owner files an action seeking a court order against the content provider, member, or user, the removed material may be replaced or access to it restored in 10 to 20 business days or more after receipt of the counter-notice, at our discretion.
|
|
<h4>Modifications to Policy</h4>
|
|
We reserve the right to modify the provisions of this DMCA notice and our copyright policy at any time. Such modifications will be effective immediately upon posting on the site.]]></template>
|
|
<template type="public" title="_help_page_how_to_become_verified" version_id="1010070" version_string="1.1.0"><![CDATA[You don't need to do anything special, simply submit something.
|
|
While checking your submission we'll research your user name and entry.
|
|
If you are the creator of your own entry you'll be immediately verified after the first submission.
|
|
That means your next submission will go straight to the site, no queues.
|
|
Same for editing your existing entries data, updating the files, etc.
|
|
|
|
If you are not the creator of the hack you can also submit things. Since we already had trouble with vandalism, you automatically receive “Verified” status after 10 approved contributions.]]></template>
|
|
<template type="public" title="_help_page_takedown" version_id="1010070" version_string="1.1.0"><![CDATA[At Romhacks.org, we deeply respect the creative work of individuals and their rights over their creations. We understand that sometimes content may be shared on our platform that you, as the creator, would prefer to have removed. To make this process as smooth and friendly as possible, we offer an easy way to submit a takedown request.
|
|
<h4>How to Submit a Takedown Request</h4>
|
|
If you find that your content has been shared on Romhacks.org and you would like it to be removed, please follow these simple steps:
|
|
<ol>
|
|
<li><strong>Visit Our Contact Page</strong>: Go to <a href="{{ link('misc/contact') }}" target="_new" rel="noopener">our contact page</a>.</li>
|
|
<li><strong>Complete the Form</strong>: Fill out the necessary details in the form. In the subject dropdown menu, please select "<strong>Takedown</strong>" to ensure your request is processed correctly.</li>
|
|
<li><strong>Use a Verifiable Email</strong>: Provide an email address where we can reach you. If we can't communicate with you and can't confirm who you are we will not go through with the removal.</li>
|
|
<li><strong>Details of the Content</strong>: Include a link where the content appears here on romhacks.org. And any information to help us determine you created the hack.</li>
|
|
</ol>
|
|
<h4>Verification Process</h4>
|
|
To prevent malicious or unjustified takedown requests, <strong>we will conduct a verification process</strong> to confirm that you are indeed the creator or rightful owner of the content in question. This may include:
|
|
<ul>
|
|
<li>Asking for additional proof of ownership or creation.</li>
|
|
<li>Verifying the details provided in the request against the content.</li>
|
|
<li>Contacting the author via social media profiles and <strong>asking him directly</strong>.</li>
|
|
</ul>
|
|
<h4>Our Commitment</h4>
|
|
We aim to process takedown requests promptly and efficiently, respecting both the rights of content creators and the integrity of our platform. We appreciate your cooperation and understanding in this process.
|
|
<h4>Questions or Concerns?</h4>
|
|
If you have any questions or need further assistance regarding the takedown process, please feel free to reach out to us through the same contact form or via Discord.
|
|
|
|
We are here to help!]]></template>
|
|
<template type="public" title="approval_item_club_request" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="approval_queue_macros::item_message_type"
|
|
arg-content="{$content}"
|
|
arg-user="{$content.User}"
|
|
arg-messageHtml="{$content.description}"
|
|
arg-contentDate="{$content.club_creation_date}"
|
|
arg-typePhraseHtml="Club Request"
|
|
arg-headerPhrase="{$content.title}"
|
|
arg-spamDetails="{$spamDetails}"
|
|
arg-unapprovedItem="{$unapprovedItem}"
|
|
arg-handler="{$handler}"
|
|
/>]]></template>
|
|
<template type="public" title="approval_item_entry_featured_request" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="approval_queue_macros::item_message_type"
|
|
arg-content="{$content}"
|
|
arg-user="{$content.User}"
|
|
arg-messageHtml="{$content.entry_title}"
|
|
arg-contentDate="{$content.featured_request_date}"
|
|
arg-typePhraseHtml="Featured Request"
|
|
arg-headerPhrase="{$content.entry_title}"
|
|
arg-spamDetails="{$spamDetails}"
|
|
arg-unapprovedItem="{$unapprovedItem}"
|
|
arg-handler="{$handler}"
|
|
/>]]></template>
|
|
<template type="public" title="club_delete_confirm" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>Delete club : {$club.title}</xf:title>
|
|
|
|
<xf:form action="{{ link('clubs/delete', $club) }}" class="block">
|
|
<div class="block-container">
|
|
<div class="block-body">
|
|
<xf:inforow rowtype="confirm">
|
|
Are you sure you want to delete this club ? <strong>{$club.title}</strong> ?<br />
|
|
<span class="u-muted">Deleting this will also delete all threads and posts.</span>
|
|
</xf:inforow>
|
|
</div>
|
|
<xf:submitrow rowtype="simple" icon="delete" submit="Delete" />
|
|
</div>
|
|
</xf:form>]]></template>
|
|
<template type="public" title="club_edit_form" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block">
|
|
<xf:form action="{{ link('clubs/save', $club ) }}" upload="true" ajax="true" class="block-container">
|
|
<div class="block-body">
|
|
<xf:textboxrow name="title" value="{$club.title}" label="Title" required="true" maxlength="100" />
|
|
<xf:textarearow name="description" value="{$club.description}" label="Description" required="true" rows="4" />
|
|
|
|
<xf:if is="$club.banner_date">
|
|
<xf:formrow label="Current Banner">
|
|
<img src="{$club.getBannerUrl()}" style="max-width: 300px; border-radius: 4px;" />
|
|
</xf:formrow>
|
|
</xf:if>
|
|
|
|
<xf:uploadrow name="upload_banner" accept=".jpg,.jpeg,.png" label="Banner" />
|
|
</div>
|
|
<xf:submitrow icon="save" submit="Submit Changes" />
|
|
</xf:form>
|
|
</div>
|
|
|
|
<xf:if is="$club.club_id && $club.node_id">
|
|
|
|
<div class="block u-marginTop">
|
|
<div class="block-container">
|
|
<h2 class="block-header">Club Moderators ({$subModCount}/5)</h2>
|
|
<div class="block-body">
|
|
<xf:if is="$moderators is not empty">
|
|
<div class="dataList">
|
|
<xf:foreach loop="$moderators" value="$mod">
|
|
<div class="dataList-row">
|
|
<div class="dataList-cell dataList-cell--main">
|
|
<strong>{$mod.User.username}</strong>
|
|
<xf:if is="$mod.user_id == $club.user_id">
|
|
<span class="label label--accent u-marginLeft">Owner</span>
|
|
</xf:if>
|
|
</div>
|
|
<div class="dataList-cell dataList-cell--action">
|
|
<xf:if is="$mod.user_id != $club.user_id">
|
|
<xf:form action="{{ link('clubs/remove-moderator', $club) }}" ajax="true" class="u-inline">
|
|
<input type="hidden" name="user_id" value="{$mod.user_id}" />
|
|
<xf:button type="submit" class="button--small button--warn" icon="delete">Remove</xf:button>
|
|
</xf:form>
|
|
<xf:else />
|
|
<span class="u-muted">-</span>
|
|
</xf:if>
|
|
</div>
|
|
</div>
|
|
</xf:foreach>
|
|
</div>
|
|
<xf:else />
|
|
<div class="block-row">No moderators for this club.</div>
|
|
</xf:if>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="block u-marginTop">
|
|
<xf:if is="$subModCount < 5">
|
|
<xf:form action="{{ link('clubs/add-moderator', $club) }}" ajax="true" class="block-container">
|
|
<h2 class="block-header">Add a moderator</h2>
|
|
<div class="block-body">
|
|
<xf:textboxrow name="username" label="Username" class="namePredictor" required="true" />
|
|
</div>
|
|
<xf:submitrow icon="add" submit="Promote Moderator" />
|
|
</xf:form>
|
|
<xf:else />
|
|
<div class="block-container">
|
|
<div class="block-row block-row--warning">
|
|
<strong>Limit reached:</strong> You have reached the maximum number of 5 moderators for your club. You must remove one before you can add a new one.
|
|
</div>
|
|
</div>
|
|
</xf:if>
|
|
</div>
|
|
</xf:if>]]></template>
|
|
<template type="public" title="club_request_form" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>Submit Club Request</xf:title>
|
|
|
|
<xf:form action="{{ link('clubs/save') }}" ajax="true" class="block">
|
|
<div class="block-container">
|
|
<div class="block-body">
|
|
<xf:textboxrow name="title" label="Title" required="required" />
|
|
<xf:textarearow name="description" label="Description" rows="4" required="required" />
|
|
<xf:uploadrow name="upload_banner" accept=".jpg,.jpeg,.jpe,.png" label="Banner" />
|
|
</div>
|
|
<xf:submitrow submit="Submit" icon="save" />
|
|
</div>
|
|
</xf:form>]]></template>
|
|
<template type="public" title="report_content_romhackplaza_entry" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block-row block-row--separated">
|
|
{{ phrase('content:') }}
|
|
{$report.content_info.description}
|
|
</div>]]></template>
|
|
<template type="public" title="report_content_romhackplaza_news" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block-row block-row--separated">
|
|
{{ phrase('content:') }}
|
|
{$report.content_info.description}
|
|
</div>]]></template>
|
|
</templates>
|