خطافات البوابة
بوابة الضوء قابلة للتوسع بشكل رائع بفضل الإضافات. الروابط تسمح للملحقات بالتفاعل مع مختلف مكونات البوابة.
الروابط الأساسية
init
إعادة تعريف المتغيرات $txt ، وتشغيل روابط SMF، إلخ.
public function init(): void
{
/* call integrate_actions hook */
$this->applyHook('actions');
}
/* integrate_actions hook */
public function actions(): void
{
if ($this->request()->is(LP_ACTION) && $this->request()->has('turbo')) {
$this->showXml();
}
}parseContent
تحليل محتوى أنواع الكتلة/الصفحات المخصصة
public function parseContent(Event $e): void
{
$e->args->content = Content::parse($e->args->content, 'html');
}prepareContent
إضافة محتوى مخصص للملحقة الخاصة بك
public function prepareContent(Event $e): void
{
$this->setTemplate();
$userData = $this->cache($this->name . '_addon_u' . Utils::$context['user']['id'])
->setLifeTime($e->args->cacheTime)
->setFallback(self::class, 'getData');
show_user_info($userData);
}prepareEditor
إضافة أي كود في منطقة تحرير الكتل/الصفحة
public function prepareEditor(Event $e): void
{
if ($e->args->object['type'] !== 'markdown')
return;
Lang::load('Editor');
Theme::loadCSSFile('https://cdn.jsdelivr.net/npm/easymde@2/dist/easymde.min.css', ['external' => true]);
Theme::addInlineCss('
.editor-toolbar button {
box-shadow: none;
}');
}preloadStyles
يساعد في التحميل المسبق لورقات الأنماط التي تحتاجها
public function preloadStyles(Event $e): void
{
$e->args->styles[] = 'https://cdn.jsdelivr.net/npm/@flaticon/flaticon-uicons@1/css/all/all.css';
}<link
rel="preload"
href="https://cdn.jsdelivr.net/npm/@flaticon/flaticon-uicons@1/css/all/all.css"
as="style"
onload="this.onload=null;this.rel='stylesheet'"
/>العمل مع الكتل البرمجية
prepareBlockParams
إضافة معلمات الكتلة الخاصة بك
public function prepareBlockParams(Event $e): void
{
$e->args->params = [
'body_class' => 'descbox',
'display_type' => 0,
'include_topics' => '',
'include_pages' => '',
'seek_images' => false,
];
}validateBlockParams
إضافة قواعد تحقق مخصصة عند حظر الإضافة/التحرير
public function validateBlockParams(Event $e): void
{
$e->args->params = [
'body_class' => FILTER_DEFAULT,
'display_type' => FILTER_VALIDATE_INT,
'include_topics' => FILTER_DEFAULT,
'include_pages' => FILTER_DEFAULT,
'seek_images' => FILTER_VALIDATE_BOOLEAN,
];
}findBlockErrors
إضافة خطأ مخصص عند إضافة/تحرير الكتلة
public function findBlockErrors(Event $e): void
{
if ($e->args->data['placement'] !== 'ads')
return;
Lang::$txt['lp_post_error_no_ads_placement'] = $this->txt['no_ads_placement'];
if (empty($e->args->data['parameters']['ads_placement'])) {
$e->args->errors[] = 'no_ads_placement';
}
}prepareBlockFields
إضافة حقول مخصصة إلى منطقة مشاركة الكتلة
public function prepareBlockFields(Event $e): void
{
RadioField::make('display_type', $this->txt['display_type'])
->setTab(BlockArea::TAB_CONTENT)
->setOptions($this->txt['display_type_set'])
->setValue($e->args->options['display_type']);
CheckboxField::make('seek_images', $this->txt['seek_images'])
->setValue($e->args->options['seek_images']);
}onBlockSaving
إجراءات مخصصة على حفظ / تحرير الكتل
onBlockRemoving
إجراءات مخصصة لإزالة الكتل
public function onBlockRemoving(Event $e): void
{
foreach ($e->args->items as $item) {
$this->cache()->forget('block_' . $item . '_cache');
}
}العمل مع الصفحات
preparePageParams
إضافة معلمات الصفحة الخاصة بك
public function preparePageParams(Event $e): void
{
$e->args->params['meta_robots'] = '';
$e->args->params['meta_rating'] = '';
}validatePageParams
إضافة قواعد تحقق مخصصة عند إضافة/تحرير الصفحة
public function validatePageParams(Event $e): void
{
$e->args->params['meta_robots'] = FILTER_DEFAULT;
$e->args->params['meta_rating'] = FILTER_DEFAULT;
}findPageErrors
إضافة خطأ مخصص عند إضافة/تحرير الصفحة
preparePageFields
إضافة حقول مخصصة إلى صفحة منطقة النشر
public function preparePageFields(Event $e): void
{
VirtualSelectField::make('meta_robots', $this->txt['meta_robots'])
->setTab(PageArea::TAB_SEO)
->setOptions(array_combine($this->meta_robots, $this->txt['meta_robots_set']))
->setValue($e->args->options['meta_robots']);
}onPageSaving
إجراءات مخصصة لصفحات الحفظ/التحرير
onCustomPageImport
custom actions on custom page import
public function onCustomPageImport(Event $e): void
{
$e->args->items = array_map(function ($item) {
$item['title'] = Utils::$smcFunc['htmlspecialchars']($item['title']);
return $item;
}, $e->args->items);
}onPageRemoving
إجراءات مخصصة في إزالة الصفحات
public function onPageRemoving(Event $e): void
{
foreach ($e->args->items as $item) {
$this->cache()->forget('page_' . $item . '_cache');
}
}preparePageData
إعداد إضافي لبوابة بيانات الصفحة الحالية
public function preparePageData(Event $e): void
{
$this->setTemplate()->withLayer('ads_placement_page');
}beforePageContent
القدرة على عرض شيء ما قبل محتوى صفحة البوابة
afterPageContent
القدرة على عرض شيء ما بعد محتوى صفحة البوابة
comments
إضافة نص تعليق مخصص إلى عرض الصفحة الحالية للبوابة
public function comments(): void
{
if (! empty(Config::$modSettings['lp_show_comment_block']) && Config::$modSettings['lp_show_comment_block'] === 'disqus' && ! empty($this->context['shortname'])) {
Utils::$context['lp_disqus_comment_block'] = '
<div id="disqus_thread" class="windowbg"></div>
<script>
<!-- Your code -->
</script>';
}
}commentButtons
إضافة أزرار مخصصة أسفل كل تعليق
public function commentButtons(Event $e): void
{
if (empty(Utils::$context['lp_page']['options']['allow_reactions']))
return;
$comment = $e->args->comment;
$comment['can_react'] = $comment['poster']['id'] !== User::$info['id'];
$comment['reactions'] = json_decode($comment['params']['reactions'] ?? '', true) ?? [];
$comment['prepared_reactions'] = $this->getReactionsWithCount($comment['reactions']);
$comment['prepared_buttons'] = json_decode($comment['prepared_reactions'], true);
ob_start();
show_comment_reactions($comment);
$e->args->buttons[] = ob_get_clean();
}العمل مع الإضافات
addSettings
إضافة إعدادات مخصصة للملحق الخاص بك
public function addSettings(Event $e): void
{
$this->addDefaultValues(['some_color' => '#ff00ad']);
$e->args->settings[$this->name] = SettingsFactory::make()
->text('some_text')
->check('some_check')
->int('some_int', ['min' => 1])
->select('some_select', [1, 2, 3])
->color('some_color')
->range('some_range', ['max' => 10])
->toArray();
}saveSettings
إجراءات إضافية بعد حفظ إعدادات البرنامج المساعد
public function saveSettings(Event $e): void
{
$this->cache()->flush();
}prepareAssets
حفظ الأنماط والنصوص والصور الخارجية لتحسين سرعة تحميل الموارد
public function prepareAssets(Event $e): void
{
$builder = new AssetBuilder($this);
$builder->scripts()->add('https://cdn.jsdelivr.net/npm/apexcharts@3/dist/apexcharts.min.js');
$builder->css()->add('https://cdn.jsdelivr.net/npm/apexcharts@3/dist/apexcharts.min.css');
$builder->appendTo($e->args->assets);
}العمل مع المقالات
frontModes
إضافة أوضاع مخصصة للصفحة الأمامية
public function frontModes(Event $e): void
{
$$e->args->modes[$this->mode] = CustomArticle::class;
$e->args->currentMode = $this->mode;
}frontLayouts
إضافة منطق مخصص في الصفحة الأمامية
public function frontLayouts(Event $e): void
{
if (! str_contains($e->args->layout, $this->extension))
return;
$e->args->renderer = new LatteRenderer();
}layoutExtensions
يتيح إضافة ملحقات تخطيط مخصصة
public function layoutExtensions(Event $e): void
{
$e->args->extensions[] = '.twig';
}frontAssets
إضافة برامج نصية وأنماط مخصصة في الصفحة الأمامية
public function frontAssets(): void
{
$this->loadExternalResources([
['type' => 'css', 'url' => 'https://cdn.example.com/custom.css'],
['type' => 'js', 'url' => 'https://cdn.example.com/custom.js'],
]);
}frontTopics
إضافة أعمدة وجداول وعناوين وأوامر مخصصة إلى دالة init
public function frontTopics(Event $e): void
{
$e->args->wheres[] = ['t.num_replies > ?' => 1];
}frontTopicsRow
تلاعبات مختلفة مع نتائج الاستعلام إلى دالة getData
public function frontTopicsRow(Event $e): void
{
$e->args->articles[$e->args->row['id_topic']]['replies'] = $e->args->row['num_replies'] ?? 0;
}frontPages
adding custom columns, joins, where conditions, params and orders to init function
public function frontPages(Event $e): void
{
$e->args->joins[] = fn(Select $select) => $select->join(
['lc' => 'lp_comments'],
'lp.page_id = lc.page_id',
['num_comments'],
Select::JOIN_LEFT
);
$e->args->wheres[] = ['lc.approved' => 1];
}frontPagesRow
تلاعبات مختلفة مع نتائج الاستعلام إلى دالة getData
public function frontPagesRow(Event $e): void
{
$e->args->articles[$e->args->row['id']]['comments'] = $e->args->row['num_comments'] ?? 0;
}frontBoards
إضافة أعمدة وجداول وعناوين وأوامر مخصصة إلى دالة init
public function frontBoards(Event $e): void
{
$e->args->columns['num_topics'] = new Expression('MIN(b.num_topics)');
$e->args->wheres[] = fn(Select $select) => $select->where->greaterThan('b.num_topics', 5);
}frontBoardsRow
تلاعبات مختلفة مع نتائج الاستعلام إلى دالة getData
public function frontBoardsRow(Event $e): void
{
$e->args->articles[$e->args->row['id_board']]['custom_field'] = 'value';
}العمل مع الأيقونات
prepareIconList
إضافة قائمة مخصصة من الرموز (بدلاً من FontAwesome)
public function prepareIconList(Event $e): void
{
if (($mainIcons = $this->cache()->get('all_main_icons', 30 * 24 * 60 * 60)) === null) {
$set = $this->getIconSet();
$mainIcons = [];
foreach ($set as $icon) {
$mainIcons[] = $this->prefix . $icon;
}
$this->cache()->put('all_main_icons', $mainIcons, 30 * 24 * 60 * 60);
}
$$e->args->icons = array_merge($$e->args->icons, $mainIcons);
}prepareIconTemplate
إضافة قالب مخصص لعرض الرموز
public function prepareIconTemplate(Event $e): void
{
$e->args->template = "<i class=\"custom-class {$e->args->icon}\" aria-hidden=\"true\"></i>";
}changeIconSet
القدرة على تمديد أيقونات الواجهة المتاحة عبر
Utils::$context['lp_icon_set']مصفوفة
public function changeIconSet(Event $e): void
{
$e->args->set['snowman'] = 'fa-solid fa-snowman';
}إعدادات البوابة
extendBasicConfig
إضافة إعدادات مخصصة في منطقة الإعدادات الأساسية للبوابة
public function extendBasicConfig(Event $e): void
{
$e->args->configVars[] = ['text', 'option_key', 'subtext' => $this->txt['my_mod_description']];
}extendAdminAreas
إضافة مناطق مخصصة للبوابة في مركز الإدارة
public function extendAdminAreas(Event $e): void
{
if (User::$info['is_admin']) {
$e->args->areas['lp_pages']['subsections']['import_from_ep'] = [
Utils::$context['lp_icon_set']['import'] . $this->txt['label_name']
];
}
}extendBlockAreas
إضافة علامات تبويب مخصصة إلى إعدادات منطقة الحظر
public function extendBlockAreas(Event $e): void
{
$e->args->areas['import_from_tp'] = [new BlockImport(), 'main'];
}extendPageAreas
إضافة علامات تبويب مخصصة إلى إعدادات منطقة الصفحة
public function extendPageAreas(Event $e): void
{
$e->args->areas['import_from_ep'] = [new Import(), 'main'];
}extendCategoryAreas
إضافة علامات تبويب مخصصة إلى إعدادات منطقة الفئة
public function extendCategoryAreas(Event $e): void
{
$e->args->areas['import_from_tp'] = [new Import(), 'main'];
}extendTagAreas
إضافة علامات تبويب مخصصة إلى إعدادات منطقة الوسم
extendPluginAreas
إضافة علامات تبويب مخصصة إلى إعدادات منطقة الإضافات
public function extendPluginAreas(Event $e): void
{
$e->args->areas['add'] = [new Handler(), 'add'];
}متنوعات
credits
إضافة حقوق التأليف والنشر للمكتبات/البرامج النصية المستخدمة، إلخ.
public function credits(Event $e): void
{
$e->args->links[] = [
'title' => 'Uicons',
'link' => 'https://www.flaticon.com/uicons',
'author' => 'Flaticon',
'license' => [
'name' => 'ISC License',
'link' => 'https://www.freepikcompany.com/legal#nav-flaticon-agreement'
]
];
}downloadRequest
handling download requests for portal attachments
public function downloadRequest(Event $e): void
{
if ($e->args->attachRequest['id'] === (int) $this->request()->get('attach')) {
// Some handling
}
}