Приветствую, товарищи! У кого есть скилы и навыки для Codex или может быть для Claude, поделитесь?!
github.com/obra/superpowers универсальный полезный
Приветствую, товарищи! У кого есть скилы и навыки для Codex или может быть для Claude, поделитесь?!
github.com/obra/superpowers универсальный полезный
@Zau4man да согласен, для поддержки и обновление предложенный вариант удобнее, намного удобнее, но с учётом ситуации если необходимо подключить в нескольких типах списка_list.tpl, я бы вынес логику в templates/modern/assets/ui
у openAjax есть правильная точка callback когда html уже вставлен, обычный ajax-modal, callback не использует и не позволяет передать, но можно обойтись и без setInterval, а через свой класс, да и раз класс всё равно прописывать)
в templates/modern/content/default_list_featured.tpl.php вместо ajax-modal указать класс ajax-modal-content:
<a class="ajax-modal-content" href="<?php echo href_to($ctype['name'], $item['slug'].'.html'); ?>"> <?php html($item[$field['name']]); ?> </a>
а в конце файла ниже пагинации добавить:
<?php $this->renderAsset('ui/ajax-modal-content'); ?>
сам asset создать в templates/modern/assets/ui/ajax-modal-content.tpl.php
<?php $this->addTplJSName(['rating', 'jquery-scroll', 'comments']); <script> $(function() { if (typeof icms === 'undefined' || !icms.modal) { return; } function initModalContent() { if (icms.rating) { $('#icms_modal .modal-body .rating_widget').each(function() { icms.rating.bindWidget($(this)); }); } if (icms.comments && $('#icms_modal .modal-body #comments_widget').length) { icms.comments.onDocumentReady(); } } $('a.ajax-modal-content').off('click').on('click', function() { var $link = $(this); var title = $link.attr('title') || $link.data('original-title'); icms.modal.openAjax($link.attr('href'), $link.data('params'), initModalContent, title, $link.data('style')); return false; }); }); </script>
если комментария не используются, вариант без них:
<?php $this->addTplJSName('rating'); <script> $(function() { if (typeof icms === 'undefined' || !icms.modal) { return; } function initModalContent() { if (icms.rating) { $('#icms_modal .modal-body .rating_widget').each(function() { icms.rating.bindWidget($(this)); }); } } $('a.ajax-modal-content').off('click').on('click', function() { var $link = $(this); var title = $link.attr('title') || $link.data('original-title'); icms.modal.openAjax($link.attr('href'), $link.data('params'), initModalContent, title, $link.data('style')); return false; }); }); </script>
такой вариант удобнее для внедрения, особенно в случае нескольких списков, не тянет rating.js везде даже там где он не нужен, весь код остаётся на уровне asset что удобнее для поддержки, без лишних правок к modal.js, rating.js, не цепляет глобальный таймер к всем модальным окнам, а рейтинг и комментарии инициализируются только там, где они реально ожидаются
комментария добавляются, редактируются, но явно что то может ещё не хватать, как минимум скроллит тело страницы при добавлении нового
templates/modern/main.tpl.php, заменить
$this->addMainTplJSName(['core', 'modal']);
на
$this->addMainTplJSName(['core', 'modal', 'rating']);
templates/modern/js/modal.js, после строк в методе showContent
if(title){ $(modal_el).find('.modal-title').show().html(title); } else { $(modal_el).find('.modal-title').hide(); } $(modal_el).addClass('in');
добавить
icms.events.run('icms_modal_content');
templates/modern/js/rating.js, заменить
this.onDocumentReady = function(){ $('.rating_widget').each(function(){ self.bindWidget($(this)); }); }; this.bindWidget = function(widget){
на
this.onDocumentReady = function(){ $('.rating_widget').each(function(){ self.bindWidget($(this)); }); icms.events.on('icms_modal_content', function(){ self.onModalContent(); }); }; this.onModalContent = function(){ if (!self.options.url) { let $first = $('#icms_modal .modal-body .rating_widget').first(); if ($first.data('vote-url')) { self.setOptions({url: $first.data('vote-url')}); } } $('#icms_modal .modal-body .rating_widget').each(function(){ self.bindWidget($(this)); }); }; this.bindWidget = function(widget){
templates/modern/js/rating.js, заменить
$('a.vote-up', widget).on('click', function(){ return self.vote('up', controller, subject, id); }); $('a.vote-down', widget).on('click', function(){ return self.vote('down', controller, subject, id); }); $('.vote-clear', widget).on('click', function(){ return self.vote('clear', controller, subject, id); });
на
$('a.vote-up', widget).off('click').on('click', function(){ return self.vote('up', controller, subject, id, widget); }); $('a.vote-down', widget).off('click').on('click', function(){ return self.vote('down', controller, subject, id, widget); }); $('.vote-clear', widget).off('click').on('click', function(){ return self.vote('clear', controller, subject, id, widget); });
templates/modern/js/rating.js, заменить
this.vote = function(direction, controller, subject, id){ let widget_id = 'rating-' + subject + '-' + id; let widget = $('#'+widget_id);
на
this.vote = function(direction, controller, subject, id, widget){ if (!widget || !widget.length) { widget = $('#icms_modal .modal-body .rating_widget[data-target-subject="' + subject + '"][data-target-id="' + id + '"]'); if (!widget.length) { widget = $('#rating-' + subject + '-' + id).last(); } }
templates/modern/controllers/rating/widget.tpl.php, заменить
data-target-id="<?php echo $target_id; ?>" data-info-url="<?php echo $this->href_to('info'); ?>" <?php } ?>
на
data-target-id="<?php echo $target_id; ?>" data-info-url="<?php echo $this->href_to('info'); ?>" data-vote-url="<?php echo $this->href_to('vote'); ?>" <?php } ?>
templates/modern/controllers/rating/widget.tpl.php, заменить
icms.rating.setOptions({ url: '<?php echo $this->href_to('vote'); ?>' });
на
if (typeof icms.rating !== 'undefined') { icms.rating.setOptions({ url: '<?php echo $this->href_to('vote'); ?>' }); }
Если можно скинуть — скиньте, переживаю что при редактировании боюсь где-то сделать ошибку.
sql из поста выше не забудьте, в архиве как изменённые файлы с учётом структуры (бекап старых на всякий случай) так и патч
Подскажите пожалуйста, как здесь можно добавить поле — например, для строковое для описания адреса или поле для вставки ссылки
всё это актуально для instantcns 2.18, в других версиях может отличаться но смысл, будет понятен, обновление затрёт
sql в бд
ALTER TABLE `cms_photos` ADD COLUMN `address` VARCHAR(500) DEFAULT NULL COMMENT 'Адрес/местоположение съемки' AFTER `camera`, ADD COLUMN `address_url` VARCHAR(1000) DEFAULT NULL COMMENT 'URL ссылка на карту/адрес' AFTER `address`, ADD KEY `address` (`address`(255));
в файле system/controllers/photos/actions/edit.php после
$photo_types = $this->request->get('type', []);
вставить
$photo_addresses = $this->request->get('address', []); $photo_address_urls = $this->request->get('address_url', []);
далее, в этом же файле
$_photo = [ 'content_source' => (...), 'content' => (...), тут ];
вместо «тут» добавить
в файле system/controllers/photos/actions/upload.php
после
$photo_types = $this->request->get('type', []); }
вставить
$photo_addresses = $this->request->get('address', []); $photo_address_urls = $this->request->get('address_url', []);
и ниже
$_photo = [ 'date_pub' => null, 'album_id' => $this->album['id'], 'title' => strip_tags($photo_titles[$photo_id] ? $photo_titles[$photo_id] : sprintf(LANG_PHOTOS_PHOTO_UNTITLED, $photo_id)), 'content_source' => ($photo_contents[$photo_id] ? cmsEventsManager::hook('html_filter', [ 'text' => $photo_contents[$photo_id], 'is_process_callback' => false, 'typograph_id' => $this->options['typograph_id'], 'is_auto_br' => false ]) : null), 'content' => ($photo_contents[$photo_id] ? cmsEventsManager::hook('html_filter', [ 'text' => $photo_contents[$photo_id], 'typograph_id' => $this->options['typograph_id'], 'is_auto_br' => !$editor_params['editor'] ? true : null ]) : null), тут 'ordering' => $last_order ];
вместо «тут» вставить
после строк
$result['id'] = $this->model->addPhoto([ 'album_id' => $this->album['id'], 'user_id' => $this->cms_user->id, 'image' => $result['paths'], 'date_photo' => $date_photo, 'camera' => $camera,
добавить:
'address' => null, 'address_url' => null,
в файле templates/default/controllers/photos/widget.tpl.php
после блока
<?php if($types){ ?> <div class="photo_type"> <?php echo html_select('type['.$photo['id'].']', $types, $photo['type']); ?> </div> <?php } ?>
вставить
<div class="photo_address"> <?php echo html_input('text', 'address['.$photo['id'].']', (isset($photo['address']) ? $photo['address'] : ''), array('placeholder' => LANG_PHOTOS_ADDRESS, 'maxlength' => 500)); ?> </div> <div class="photo_address_url"> <?php echo html_input('text', 'address_url['.$photo['id'].']', (isset($photo['address_url']) ? $photo['address_url'] : ''), array('placeholder' => LANG_PHOTOS_VIEW_ON_MAP, 'maxlength' => 1000)); ?> </div>
и для modern в templates/modern/controllers/photos/widget.tpl.php
<?php if($types){ ?> <div class="photo_type form-group"> <?php echo html_select('type['.$photo['id'].']', $types, $photo['type']); ?> </div> <?php } ?>
вставить
<div class="photo_address form-group"> <?php echo html_input('text', 'address['.$photo['id'].']', (isset($photo['address']) ? $photo['address'] : ''), array('placeholder' => LANG_PHOTOS_ADDRESS, 'maxlength' => 500, 'class' => 'form-control')); ?> </div> <div class="photo_address_url form-group"> <?php echo html_input('text', 'address_url['.$photo['id'].']', (isset($photo['address_url']) ? $photo['address_url'] : ''), array('placeholder' => LANG_PHOTOS_VIEW_ON_MAP, 'maxlength' => 1000, 'class' => 'form-control')); ?> </div>
после, в блоке <div class=«preview_template block row» style=«display:none»>
<div class="form-group photo_content"> <textarea id="" class="textarea form-control" name=""></textarea> </div> <div class="form-group photo_privacy"> <?php echo html_select('', array(LANG_PRIVACY_PUBLIC, LANG_PRIVACY_PRIVATE, LANG_PHOTOS_ACCESS_BY_LINK), (isset($album['is_private']) ? $album['is_private'] : 0)); ?> </div> <?php if($types){ ?> <div class="form-group photo_type"> <?php echo html_select('', $types); ?> </div> <?php } ?>
добавить
<div class="form-group photo_address"> <?php echo html_input('text', '', '', array('placeholder' => LANG_PHOTOS_ADDRESS, 'maxlength' => 500, 'class' => 'form-control')); ?> </div> <div class="form-group photo_address_url"> <?php echo html_input('text', '', '', array('placeholder' => LANG_PHOTOS_VIEW_ON_MAP, 'maxlength' => 1000, 'class' => 'form-control')); ?> </div>
в файл templates/default/controllers/photos/view.tpl.php после
<dl class="photo_details">
вставить
<?php if (!empty($photo['address']) || !empty($photo['address_url'])) { ?> <div class="photo-address"> <h3><?php echo LANG_PHOTOS_ADDRESS; ?></h3> <?php if (!empty($photo['address'])) { ?> <p><?php echo html($photo['address']); ?></p> <?php } ?> <?php if (!empty($photo['address_url'])) { ?> <p><a href="<?php echo html($photo['address_url']); ?>" target="_blank" rel="noopener"><?php echo LANG_PHOTOS_VIEW_ON_MAP; ?></a></p> <?php } ?> </div> <?php } ?>
в файл templates/modern/controllers/photos/view.tpl.php, после
<dl class="photo_details bg-light border-top px-3 pb-3">
вставить
<?php if (!empty($photo['address']) || !empty($photo['address_url'])) { ?> <div class="photo-address bg-light px-3 pt-3 pb-2"> <h5><?php echo LANG_PHOTOS_ADDRESS; ?></h5> <?php if (!empty($photo['address'])) { ?> <p class="mb-1"><?php echo html($photo['address']); ?></p> <?php } ?> <?php if (!empty($photo['address_url'])) { ?> <p class="mb-0"><a href="<?php echo html($photo['address_url']); ?>" target="_blank" rel="noopener"><?php echo LANG_PHOTOS_VIEW_ON_MAP; ?></a></p> <?php } ?> </div> <?php } ?>
в файл system/languages/ru/controllers/photos/photos.php
define('LANG_PHOTOS_SORT_ORDERTO', 'Направление сортировки');
вставить
define('LANG_PHOTOS_ADDRESS', 'Местоположение'); define('LANG_PHOTOS_VIEW_ON_MAP', 'Посмотреть на карте');
в файлы templates/default/js/photos.js и templates/modern/js/photos.js
после
$('.photo_type select', preview_block).attr('name', 'type['+result.id+']');
вставить
$('.photo_address input', preview_block).attr('name', 'address['+result.id+']'); $('.photo_address_url input', preview_block).attr('name', 'address_url['+result.id+']');
могу скинуть патчем если гит на проекте есть)
Уважаемые подскажите.
Как сделать что бы Категории выводились во всех вкладках и разделах?
Вот дапустим главная категория Новости:
Здесь есть категории, а переходя в разделы их НЕТ:
Как сделать так что бы категории были во всех разделах??
Это относится и к Статьям и Блогам… Подскажите такое вообще возможно? И по подробнее если есть такая возможность..
не увидел тут хука что бы перехватить это, варианта не много, делать виджет, который будет выводить (что более гибко), внести правку в тпл, (ну такое), внести правку в код (тоже такое, придётся помнить иначе пропадёт при обновлениях, ниже вариант с кодом)), после этого кода в файле по ссылке выше:
$subcats = $this->model->filterIsNull('is_hidden')-> getSubCategories($ctype['name'], $current_cat_id);
добавить
If(!$subcats) { $subcats = !$subcats && $category['parent_id'] ? $this->model->filterIsNull('is_hidden')->getSubCategories($ctype['name'], $category['parent_id']) : false; }
должно работать, не тестил
возможно dkim не был прописан? если да пропишите в dns обязательно
а так с яндекс почтой ходит в gmail всё без проблем пример \system\config\config.php
'mail_transport' => 'smtp', 'mail_from' => 'полный@емайл.адрес', 'mail_from_name' => 'Имя отправителя', 'mail_smtp_server' => 'smtp.yandex.ru', 'mail_smtp_port' => '465', //ssl 'mail_smtp_auth' => 1, 'mail_smtp_user' => 'полный@емайл.адрес', 'mail_smtp_pass' => 'пароль приложения',
бюджет?
Подкиньте пожалуйста ещё решение как сделать чтобы:
1) когда заходят на страницу с параметрами в запросе, например — example.com/page?param1=value1 & param2=value2 & param...
2) откусить все возможные параметры — param1=value1 & param2=value2 & par… ...& paramN=valueN
3) сделать перенаправление на целевой домен с точно такими же параметрами — target.com?param1=value1 & param2=value2 & par… ...& paramN=valueN
Во. Сам накалякал, на основе решения выше. Было бы желание )
можно так
$params = count($this->cms_core->uri_query) ? '?' . http_build_query($this->cms_core->uri_query) : ''; $host = $this->cms_config->host; //$host = 'https://example.ru'; return $this->redirect($host . $params);
Здравствуйте!
Можно ли сделать как-то, чтобы поиск по сайту искал текст во всех записях профиля пользователя?
И вообще возможно ли это?
добавить индекс в таблицу базы, используя допустим phpmyadmin sql запросом:
ALTER TABLE `cms_wall_entries` ADD FULLTEXT( `content`);
в /system/controllers/wall/hooks/fulltext_search.php создать файл fulltext_search.php с содержимым:
<?php class onWallFulltextSearch extends cmsAction { public function run($search_controller) { $name = 'wall'; $sources[$name] = 'Запись на стене'; $table_names[$name] = 'wall_entries'; return [ 'name' => $name, 'sources' => $sources, 'table_names' => $table_names, 'match_fields' => $match_fields, 'select_fields' => $select_fields, 'filters' => $filters, 'item_callback' => function ($item, $model, $sources_name, $match_fields, $select_fields) { $fields = []; foreach ($match_fields as $match_field) { if ($match_field === 'title') { continue; } $fields[$match_field] = $item[$match_field]; } 'url' => href_to('users', $item['user_id']).'?wid='.$item['id'], 'title' => 'Запись со стены', 'fields' => $fields, 'date_pub' => $item['date_pub'], 'image' => '' ]); } ]; } }
в панели обновить список событий компонентов:
админка > компоненты > события ( /admin/controllers/events)
Ну генератор реферальных ссылок я не нашел.
посмотрите возможности:
КомпонентБиллинг пользователей 2.x
от r2Купить 3500 руб.Как совершить покупку?
Недоступен для покупки. Скоро будет в комплекте InstantCMS. Мотивационные донаты приветствуются.Да, классное дополнение. Обязательно прикуплю как-то при возможности для своих хотелок.
Жаль код зашит и на локальном сервере не поиграешь пока доменное имя не выбрал))
Спасибо.
на локалке тоже можно поиграть, необходимо только будет поднять локалку на субдомене купленного домена)
дополню для интересующихся для подключение этого сервиса от мегафона необходимо быть корпоративным клиентом с ооо или ип
спасибо за ссылку
Не плохой вариант
mobileid.megafon.ru/
спасибо за ссылку
Не плохой вариант
mobileid.megafon.ru/