Статьи

Новые комментарии

XF2
namespace BS\XenForoApi\Service\Api; use XF\Service\AbstractService; class Request extends AbstractService { protected $siteUrl; /** @var \GuzzleHttp\Client */ protected $httpClient; protected $apiKey; protected $byPassPermissions = false; /** @var bool */ protected $logErrors; public function __construct(\XF\App $app, $siteUrl, $apiKey) { parent::__construct($app); $this->siteUrl = $siteUrl; $this->httpClient =...
XF2
https://xenforo.com/community/threads/upload-image-file-via-xf-form.184111/
JS
XF.overlayMessage('Confirmation', '<p>Do you agree?</p><button class="button button--primary" onclick="XF.hideOverlays(); do_stuff();">Yes</button> <button class="button" onclick="XF.hideOverlays();">No</button>'); Первый параметр - это заголовок, второй параметр - это HTML, куда вы можете поместить кнопки с событиями. Результат: Источник - https://xenforo.com/community/threads/javascript-confirm-box-in-xf-styling.164072/
https://xenforo.com/community/threads/xf-breadcrumb-as-text-and-not-link.184360/
PHP
$user = $this->app->em()->find('XF:User', $userId, ['Profile']); $user->Profile->custom_fields->set('field_id', $fieldValue); $user->Profile->save(); Или так: $user->Profile->custom_fields['field_id'] = $someValue; $user->save();
Допустим, что у нас есть шаблон five_liner <!-- template: five_liner --> <div class="block"> <div class="block-container"> <h2 class="block-heading">This is my heading</h2> <div class="block-body"> <div>This is my first line</div> <div>This is my second line</div> <xf:extension name="third_line"> <div>This is my third line</div> </xf:extension> <xf:extension name="fourth_line">...
Удалить повторы: В поле «Найти» скопируйте команду: ^(.*?)$\s+?^(?=.*^\1$) и нажмите «Заменить все». Сортировка: Вверху, слева в меню выбрать: Правка -> Операции со строками
XF2
Источник - https://xenforo.com/community/threads/a-better-way-to-use-the-finder-within-a-blob.183821/ Пример смотреть здесь XF/Purchasable/UserUpgrade $quotedProfileId = $finder->quote($profileId); $columnName = $finder->columnSqlName('payment_profile_ids'); $upgrades = $finder->whereSql("FIND_IN_SET($quotedProfileId, $columnName)")->fetch(); Еще пример: $columnName = $finder->columnSqlName('Category.category_groups'); $whereOr = []; foreach...
XF2
Подготовка: $dir это переменная, в которой необходимо указать на путь (корневая папка, где установлен XF). Указав dir-путь, ниже преведенный файл с PHP кодом может находиться в любом каталоге. PHP файл: <?php $dir = __DIR__; require ($dir . '/src/XF.php'); XF::start($dir); $app = XF::setupApp('XF\Pub\App'); $app->start(); После этого, можно использовать: $visitor = \XF::visitor(); $userId = $visitor->user_id; $username = $visitor->username;
XF2
Как передать переменную во фразу: $url = 'the url you want to use'; \XF::phrase('your_phrase_prefix_you_will_be_redirected_blabla ', ['url' => $url]); текст вашей фразы: You will be redirected ... <br />Blabla <a href="{url}">or click here!</a> https://xenforo.com/community/threads/get-no-html-view-on-route-page.182879/ https://xenforo.com/community/threads/phrasedeferred-phrase-var-as-array-var-in-phrase.171569/...
data-message-container="< :prev | .js-replyNewMessageContainer" Что означает это: < :prev | .js-replyNewMessageContainer It is passed through XF.findRelativeIf() to $.findExtended(), which are functions that I think deserve proper documentation given their prevalence. I haven't found the time to submit a PR for consideration, but if anyone would like to use this information to create one, please feel free. Essentially XF.findRelativeIf supports a comprehensive selector syntax, with...
XF2
Code Event Listener Event: templater_macro_pre_render Event Hint: admin:option_macros:option_form_block Execute Callback: Your\Namespace\XenForo2\EventListener\MacroRender::preRender <?php namespace Your\Namespace\XenForo2\EventListener; class MacroRender { public static function preRender(\XF\Template\Templater $templater, &amp;$type, &amp;$template, array &amp;$arguments, array &amp;$globalVars) { if ($arguments['group']->group_id == 'your_group') { //...
PHP
Размер доступный под кеш 16 МБ, занимать весь объем не рекомендуется. Включение/Отключение simpleCache не нужно включать как-либо дополнительно, он работает из коробки, после установки форума. Кеширование При кешировании обязательно указывать id аддона, в данном случае, это SE/Shops $app = \XF::app(); $db = \XF::db(); $simpleCache = $app->simpleCache(); $productCount = $db->fetchOne(' SELECT COUNT(*) FROM se_shops_product...
JS
Регистрация окна: registerDialogs: function() { XF.EditorHelpers.dialogs.media = new XF.EditorDialogMedia('media'); XF.EditorHelpers.dialogs.spoiler = new XF.EditorDialogSpoiler('spoiler'); XF.EditorHelpers.dialogs.code = new XF.EditorDialogCode('code'); } Вызов окна: XF.EditorHelpers.loadDialog(this, 'media');
PHP
$this->assertPostOnly();
XF2
Bingo shark https://xenforo.com/community/members/021.207217/ Matew
Ctrl+E, Ctrl+D - Форматировать документ Ctrl+E, Ctrl+F - Форматировать выделенный фрагмент Ctrl+K, Ctrl+C - Комментировать код Ctrl+K, Ctrl+U - Раскомментировать код Ctrl+M, Ctrl+O - Свернуть код методов, классов, структур и т.д. Ctrl+M, Ctrl+P - Развернуть код методов, классов, структур и т.д. Alt+Стрелка вниз/вверх - передвинуть выделенный код
XF2
Готовый аддон во вложении! Как можно передать значение переменной из модального окна обратно на страницу без перезагрузки. Зачем это нужно? Например, когда вы создаете новую сущность, вам нельзя перезагружать страницу, так как введенные параметры сбросятся. Остается только каким-то образом сразу передать значение в поле формы после закрытия модального окна без перезагрузки страницы с информацией о сущности. Подготовка В этом разделе я создам отдельную страницу в админ-панели вместе с...
JS
https://xenforo.com/community/threads/onchange-with-xf-js-framework.169777/
JS
https://xenforo.com/community/threads/extending-js-function.144830/
JS
<xf:js> jQuery(document).ready(function(){ .............. }); <div> ....................... </div> </xf:js> !function ($, window, document, _undefined) { let currentOwner = null; jQuery(document).ready(function () { //let btn = $('#delBtn').first().hide(); // Скрываем первую кнопку, потому что первый элемент input удалять нельзя //firstLi = btn.parent('li'); //let btnInsideLi = firstLi('.inputGroup-text...
PHP
https://xenforo.com/community/threads/using-attachments-in-add-on.157405/
https://xenforo.com/community/forums/styling-and-customization-questions.47/
time: { now: {$xf.time}, today: {$xf.timeDetails.today}, todayDow: {$xf.timeDetails.todayDow}, tomorrow: {$xf.timeDetails.tomorrow}, yesterday: {$xf.timeDetails.yesterday}, week: {$xf.timeDetails.week} }, {{date($xf.time)}} {{date_time($xf.time)}} {{ date($xf.time, 'Y-m-d') }} // 2020-06-25 <xf:date time="{$product.product_release}" /> Формат даты...
<xf:editorrow name="message" value="{$message}" data-min-height="250" rowtype="fullWidth noLabel" label="{{ phrase('my_phrase') }}" />
PHP
https://xenforo.com/community/threads/correct-way-to-add-custom-endpoints-to-the-api.165598/#post-1368670
Ссылка: {{ link('shops') }} Условия отображения: $xf.visitor.hasPermission('bad_url', 'user_can_view_bad_url') или !$xf.visitor.isMemberOf(20)
PHP
public function actionIndex(ParameterBag $params) { $view = parent::actionIndex($params); if ($view instance of \XF\Mvc\Reply\View) { $thread = $view->getParam('thread'); if ($thread->your_bool) { $view->setTemplate('your_custom_template'); } } return $view; } Подробнее: https://xenforo.com/community/threads/loading-a-different-thread_view-through-my-controller.181504/
PHP
https://xenforo.com/community/threads/help-required-on-how-to-overwrite-overload-a-function-of-another-addon.181382/
PHP
https://xenforo.com/xf2-docs/manual/config/#cookie-settings
PHP
$viewParams = [ 'href' => $this->buildLink('fantasy/fc-events', null, ['fmode'=>'abc', 'fstatus'=>'def']) ]; return $this->view('AFC:EventManagement', 'myTemplate', $viewParams); Теперь, если в шаблоне вызвать {$href}, то получим на выходе: /xen/index.php?fantasy/fc-events/&fmode=abc&fstatus=def Подробнее здесь: https://xenforo.com/community/threads/solved-buildlink-not-appending-query-strings-data.181746/
PHP
public function assertHasPermission() { $hasPermission = mt_rand(0, 1) === 1; if ($hasPermission) { return; } throw $this->exception( $this->redirect($this->buildLink('not/good')) ); }
JS
Пример AJAX запроса - загрузка шаблона(вида): XF.SomeEventHandlerName = XF.Click.newHandler({ eventNameSpace: 'XFSomeEventHandlerName', init: function() { }, click: function(e) { var el = this.$target, config = { method: 'GET', action: [YOUR_URL_ENDPOINT], successCallback: XF.proxy(this, 'processResponse'), ajaxOptions: { skipDefault: true }...
ASP
Если -bash: sudo: command not found : yum install sudo Если блокнот не установлен: yum install nano Установка .NET на сервер: https://docs.microsoft.com/ru-ru/dotnet/core/install/linux-centos Инструкция по развертыванию приложения: https://docs.microsoft.com/ru-ru/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1 Командная строка, список всех команд: https://docs.microsoft.com/ru-ru/dotnet/core/tools/ Например: dotnet myapp.dll dotnet run и т.д. Перезапуск Enginx (после...
Папка с доменом тут: cd /home/admin/web/devsrc.ru/public_html/ Распаковка ZIP: unzip devsrc.ru.zip Установка текстового редактора: yum install nano Редактирование файла: nano config.php Выйти ctrl + x Смена прав на папки: chmod -R 777 /home/admin/web/devsrc.ru/public_html/data (-R рекурсивно все папки) chmod -R 777 /home/admin/web/devsrc.ru/public_html/internal_data (-R рекурсивно все папки) Настройка ЧПУ в Enginx: cd /home/admin/conf/web/ nano devsrc.ru.nginx.ssl.conf (если к домену...
ASP
В ItemGroup добавить: <None Include="node_modules/**" /> Получится что-то типа: <ItemGroup> <None Include="node_modules/**" /> </ItemGroup> В ItemGroup может быть что-то ещё. Например: <ItemGroup> <PackageReference Include="OdeToCode.UseNodeModules" Version="3.0.0" /> <None Include="node_modules/**" /> </ItemGroup>
All elements: //* All elements with an attribute, a: //*[@a] All elements with an attribute a equal to v: //*[@a='v'] All elements with any attribute: //*[@*] All elements with any attribute equal to v: //*[@*='v'] text() означает, что ищем текст. name() означает, что ищем имя. //[starts-with(name(), 'h')] //*[starts-with(@id, 'sometext') and ends-with(@id, '_text')] любой тег, у которого атрибут id начинается на sometext и заканчивается на _text @id[starts-with(., 'List_ct') and...
WPF
public class RelayCommand : ICommand { private readonly Action<object> _onExecute; private readonly Func<object, bool> _canExecute; // <summary>Событие извещающее об измении состояния команды</summary> public event EventHandler CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } /// <summary>ExecuteMethod, IsCanExecuteMethod</summary>...
WPF
Получение окна: var window = Application.Current.Windows[0]; Передача параметра (объект в виде окна из View в ModelView): Важно! Окну предварительно необходимо дать имя - LoginWnd, его и передаём в ElementName=LoginWnd <Button Name="CloseWindow" Margin="0,5,5,0" Padding="5,-3,5,0" HorizontalAlignment="Right" VerticalAlignment="Top" VerticalContentAlignment="Center"...
Сверху