avatar
0.00
0.010
Помню предлагала nikto сделать на основе (еще тогда miniMarket) «Универсальный каталог», возможности которого вместе с тем, что может движок AltoCMS не будет иметь аналогов среди готовых решений.



Только представьте портал уровня «Кинопоиска» или ixbt с контентом генерируемым пользователями и это притом, что для этого достаточно функционала минимаркета. Фильмы, игры, магазины, рестораны и отели, сайты отзывов и т.д. — возможности безграничны.

Что касается магазина как такового, то для конкурентоспособности среди специализированных CMS магазинов не хватает возможности регистрации множества продавцов (магазинов) по аналогии с aliexpress.
Если добавить в некую категорию блог типа hidden — он будет присутствовать в списке категорий для любого пользователя включая незареганых (неправильно), в то время как в списке блогов для юзеров у которых на него нет приглашения- он будет отсутствовать (правильно).
135
135
Можно включить в поддержку в соответствующем плагине.
aVadim
aVadim
Если проблему с заменой названия страны на ее ID решили, то дальше все просто — в конфиг-файле app/config/config.local.php надо задать переопределение:
$config['router']['uri'] = array(
    '[~^people/strana/(\w+)]' => 'people/country/$1',
);
Klaus
Klaus
То что вы хотите есть для ЛС github.com/stfalcon-studio/ls-plugin_treeblogs и давненько хотелось адаптировать для альто, но там есть большое НО, это большое количество обращений к базе/кэшу при построении дерева блогов. Кстати поставить и посмотреть что из этого получится можно и сейчас, а вдруг заработает сходу.

Включать в коробку вряд ли стоит, а вот просто адаптировать, почему бы и нет. Опять же вечный вопрос кто займется.
Вот пример команды hello с экшеном test. При вызове из консоли php ls hello test эта команда выведет логин пользователя с id=1 средствами движка.

class CmdHello extends LSC {
    protected $_name;

    /**
     * Выводим помощь о команде
     */
    public function getHelp() {
        return <<<EOD
USAGE
  ls hello test
EOD;
    }

    function __construct() {
        E::getInstance()->Init();
    }

    public function actionTest($aArgs) {
        $oAdmin = E::User_GetUserById(1);
        echo $oAdmin->getLogin();
    }

}


В класс команды добавлен конструктор в котором инициализируется движок
function __construct() {
    E::getInstance()->Init();
}


И теперь обращаться к методам модуля можно так E::Module_Method($param1, [$param2, .., $paramN])
Klaus
Klaus
Так сразу сложно все перечислить, навскидку
  • Уход разработчиков с ЛС из-за ort`a
  • Админка
  • Настраиваемые статьи (т.е. фотосет, опрос не отдельные сущности + доп.поля)
  • Не разлогинивает при входе с другого устройства
  • Слежение за комментариями
  • Редактирование комментов
  • Вадим =)
  • Да меньше плагинов, но почти любой плагин можно адаптировать (по первости сложно)
  • ....

Вообще многое кроется в мелочах, а решать конечно вам.
Klaus
Klaus
А я с пожеланием, можно? Хотелось бы иметь более гибкую настройку, какие стили можно менять.
Вот например помимо фона, может человек захочет дать сменить картинку в header (если она конечно стилями задана), или цвет кнопок поменять. Вы же понимаете что задачи могут быть разными и настроить под себя хотелось бы в конфиге, а не дописыванием кода и созданием доп.полей в бд.

Но это конечно на уровне пожеланий. Сам по себе плагин конечно отличный, пользуюсь аналогичным и крайне рекомендую остальным =)

Во, вспомнил что еще мне не хватает в подобном плагине. Возможность настройки брэндирования для главной страницы, например на новый год установить по быстрому праздничную тему. Для себя я сделал скрытый блог и его настраиваю. А в хуке прописал что для главной страницы использовать оформление такого-то блога. Но может это можно как-то предусмотреть как штатную возможность.
Klaus
Klaus
Есть еще вариант использовать свой vps находящийся за границей как proxy.
Настраивается только в putty довольно легко linux26.ru/articles/putty/http-tunnel-s-pomoshhyu-putty-cherez-proxy.html
Klaus
Klaus
Спустя много часов я таки разобрался почему долго публикуется конкретно у меня. Совершенно забыл про limit_req_zone указанный в конфиге Nginx. Так что на стену публикуется все норм =)
Пример реализации: yogatalk.ru/forum/223-vstavka-video-i-ne-tolko

Вот исходный код плагина, если вдруг интересно:
(может кто-то портирует на Альто?)

<?php

if (!defined("IN_ESOTALK")) exit;

 // An implementation of the string filter interface for plain text strings
ET::$pluginInfo["AutoLink"] = array(
	"name" => "AutoLink",
	"description" => "When you post an URL, AutoLinksLight automatically embeds videos from Youtube, Dailymotion, TwitchTV, RuTube, etc...",
	"version" => "1.2.1",
	"author" => "Ramouch0-Laticauda",
	"authorEmail" => "support@esotalk.org",
	"authorURL" => "http://esotalk.org",
	"license" => "GPLv2"
);

class ETPlugin_AutoLink extends ETPlugin {

	// ACCEPTED PROTOTYPES
	//
	var $accepted_protocols = array(
	  'http://', 'https://', 'ftp://', 'ftps://', 'mailto:', 'telnet://',
	  'news://', 'nntp://', 'nntps://', 'feed://', 'gopher://', 'sftp://' );

	//
	// AUTO-EMBED IMAGE FORMATS
	//
	var $accepted_image_formats = array(
	  'gif', 'jpg', 'jpeg', 'tif', 'tiff', 'bmp', 'png', 'svg', 'ico' );


public function handler_format_format($sender)
{
	// quick check to rule out complete wastes of time
	if( strpos( $sender->content, '://' ) !== false || strpos($sender->content, 'mailto:' ) !== false )
	{
	  $sender->content = preg_replace_callback( '/(?<=^|\r\n|\n| |\t|
|<br\/>|<br \/>)!?([a-z]+:(?:\/\/)?)([^ <>"\r\n\?]+)(\?[^ <>"\r\n]+)?/i', array( &$this, 'autoLink' ), $sender->content );
	 }
}

public function autoLink( $link = array())
{
  // $link[0] = the complete URL
  // $link[1] = link prefix, lowercase (e.g., 'http://')
  // $link[2] = URL up to, but not including, the ?
  // $link[3] = URL params, including initial ?

  // sanitise input
  $link[1] = strtolower( $link[1] );
  if( !isset( $link[3] ) ) $link[3] = '';

  // check protocol is allowed
  if( !in_array( $link[1], $this->accepted_protocols ) ) return $link[0];

  // check for forced-linking and strip prefix
  $forcelink = substr( $link[0], 0, 1 ) == '!';
  if( $forcelink ) $link[0] = substr( $link[0], 1 );

  $params = array();
  $matches = array();

  
  if( !$forcelink && ( $link[1] == 'http://' || $link[1] == 'https://' ) )
  {
	$width = 640;
	$height = 380;
	// Webm
	if( strtolower( substr( $link[2], -5 ) ) == '.webm')
	return '<video width="'.$width.'" height="'.$height.'" type="video/webm" controls="controls"><source src="'.$link[0].'" ></source></video>';
	// Mp4
	if( strtolower( substr( $link[2], -4 ) ) == '.mp4')
	return '<video width="'.$width.'" height="'.$height.'" type="video/webm" controls="controls"><source src="'.$link[0].'" ></source></video>';
	// Mp3
	else if( strtolower( substr( $link[2], -4 ) ) == '.mp3' )
	return '<audio controls="controls"><source src="'.$link[0].'"></audio>';
	// images
	elseif( preg_match( '/\.([a-z]{1,5})$/i', $link[2], $matches ) && in_array( strtolower( $matches[1] ), $this->accepted_image_formats ) )
	return '<img class="auto-embedded" src="'.$link[1].$link[2].$link[3].'" alt="-image-" title="'.$link[1].$link[2].$link[3].'" />';
	// youtube
	if( strcasecmp( 'www.youtube.com/watch', $link[2] ) == 0 && $this->params( $params, $link[3], 'v' ) )
	  return '<iframe width="'.$width.'" height="'.$height.'"  src="'.$link[1].'www.youtube.com/embed/'.$params['v'].'" frameborder="0" allowfullscreen></iframe>';
	else if( preg_match( '/^(?:www\.)?youtu\.be\/([^\/]+)/i', $link[2], $matches ))
	  return '<iframe width="'.$width.'" height="'.$height.'"  src="'.$link[1].'www.youtube.com/embed/'.$matches[1].'" frameborder="0" allowfullscreen></iframe>';
	// Vimeo
	else if( preg_match( '/vimeo\.com\/(\w+\s*\/?)*([0-9]+)*$/i', $link[2], $matches ) )
	return '<iframe src="//player.vimeo.com/video/'.$matches[1].'?color=ffffff" width="'.$width.'" height="'.$height.'" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
	// Dailymotion
	else if( preg_match( '/^www\.dailymotion\.com\/(?:[a-z]+\/)?video\/([^\/]+)/i', $link[2], $matches ) )
	  return '<iframe frameborder="0" width="'.$width.'" height="'.$height.'" src="http://www.dailymotion.com/embed/video/'.$matches[1].'"></iframe>';
	// LiveLeak.com
	else if( strcasecmp( 'www.liveleak.com/view', $link[2] ) == 0 && $this->params( $params, $link[3], 'i' ) )
	  return '<embed class="video" src="http://www.liveleak.com/e/'.$params['i'].'" type="application/x-shockwave-flash" wmode="transparent"  width="'.$width.'" height="'.$height.'" align="top"></embed>';
	// Twitch TV
	elseif ( preg_match('/twitch\.tv\/(\w+\s*\/?)*([0-9]+)*$/i',$link[2], $matches))
		return '<iframe src="http://www.twitch.tv/'.$matches[1].'/embed" frameborder="0" scrolling="no" height="'.$height.'" width="'.$width.'"></iframe>';
	// Vine (format like this : https://vine.co/v/ME70KX9A2X7/)
	elseif ( preg_match('/vine\.co\/(\w+\s*\/?)*([0-9]+)*$/i',$link[2], $matches))
		return '<iframe class="vine-embed" src="https://vine.co/v/'.$matches[1].'/embed/simple" width="480" height="480" frameborder="0"></iframe><script async src="//platform.vine.co/static/scripts/embed.js" charset="utf-8"></script>';
	// Metacafe
		else if( preg_match( '/^www\.metacafe\.com\/watch\/([0-9]+)\/([^\/]+)\/?$/', $link[2], $matches ) )
		return '<iframe src="http://www.metacafe.com/embed/'.$matches[1].'" width="'.$width.'" height="'.$height.'" allowFullScreen frameborder=0></iframe>';
	// RuTube
	else if( preg_match( '/rutube\.ru\/video\/(\w+\s*\/?)*([0-9]+)*$/i', $link[2], $matches ) )
		return '<iframe src="//rutube.ru/play/embed/'.$matches[1].'" width="'.$width.'" height="'.$height.'" allowFullScreen frameborder=0></iframe>';
  }


  // default to linkifying
	return '<a href="'.$link[0].'" rel="nofollow external">'.$link[0].'</a>';

}

/*Reads query parameters
params : result array as key => value
string : query string
required : array of required parameters key
@return true if required parameters are present.
*/
function params( &$params, $string, $required )
{
  $string = html_entity_decode($string);
  if( !is_array( $required ) ) $required = array( $required );
  if( substr( $string, 0, 1 ) == '?' ) $string = substr( $string, 1 );
  $params = array();
  $bits = split( '&', $string );
  foreach( $bits as $bit ) {
	$pair = split( '=', $bit, 2 );
	if( in_array( $pair[0], $required ) ) $params[ $pair[0] ] = $pair[1];
  }
  return count( $required ) == count( $params );
}

}
?>
aVadim
aVadim
Я так понимаю, что разработка делается с помощью PhoneGap? А как это хозяйство с внешним сайтом общается, как обычный браузер? Такие вещи, как сессии и куки, работают как у обыкновенного браузера?
inliquid в любом случае я выложу только исходники, вам в настройках придется прописывать ваш адрес сайта.

А исходники это обычные js, css, html файлы, ну и много хлама от cordova, без которых не будет экспорта в приложение (apk, ipa и т.д.), вся суть приложения, это запросить, получить и вывести данные. Вывод происходит с помощью js.

Цвет, внешний вид и вообще все стили можно будет поменять стандартно, css.
Текст, который статический, можно будет менять просто в html файле, а вообще будет правильно сделать локализацию, что и будет сделано в дальнейшем.

Так же для не знающих, ленивых и богатых могу настраивать, править стили и паковать на заказ, чтобы на выходе уже было готовое приложение для конкретного сайта, но до этого еще далеко.
ASA
ASA
Другое дело — написать мессенджер в виде плагина для CMS. И к нему — мобильного клиента
Поддержу.
На своем сайте сейчас имею Реальный плагин — catalog.livestreetcms.com/addon/view/370/
Так вот с ним личка стала РЕАЛЬНО удобна!!!

И сидя за компом — ни чего больше не надо, кроме открытого сайта…
Но вот чего реально не хватает, так это мобильного приложения — работающего с этим плагином… Что бы это приложение позволяло хранить переписку и в телефоне в целях уменьшения трафика и необходимости обновления страниц… Ну и что бы имел удобную форму написания и работы с тегами (выделения, цитаты и т.п.) на телефоне… Хотя тут есть мнение что этот плагин и нормальный шаблон под телефон — решают все проблемы…
В общем считаю, что клиент под Винду не нужен… а вот под мобильные устройства был бы интересен поэтому в определенной степени и заинтересовал этот топик — altocms.ru/745.html
Вадим, Николай — радоваться боюсь, но тормозов, вроде, — теперь нет.

И еще просьба: скопируйте табличку со статистикой, которая у админа внизу страницы есть.

Выполняю (не знаю что точно нужно, по этому копирую всё):
Database
query: 43
time: 0,037

Cache — off
query: 2
— set: 1
— get: 1
time: 0,00031

Viewer
total time: 0,051
— preprocess time: 0,05
— render calls: 2
— render time: 0

PHP — 5.4.23
time load modules: 0.089
included files:
— count: 154
— time: 0.091
full time: 0.305 / 0.924

Memory
memory limit: 128.000 M
memory usage: 17.391 M
peak usage: 18.250 M
Klaus
Klaus
Собственно плагин цитирования altocms.ru/addons/item/87/
bogun
bogun
Вот сейчас проверил на старт кит разбивку комментов постранично-все корректно работает… А на експериенсе конкретный глюк с отображением списка страниц…
Как это можно исправить?
И еще, подскажите пожалуйста куда вставлять код гугла аналитик в шаблонах?
Вот еще довольно интересный вариант на базе Discourse
bbs.boingboing.net/t/john-oliver-on-ferguson-and-police-militarization-must-watch-video/39395
Вероятно я буду в меньшинстве, но лично мое мнение, что страницы — это никому не нужный олдскульный анахронизм из периода господства phpBB и прочих форумных монстров (нет я в курсе что они и сейчас кое-где господствуют). Вот на мой взгляд идеальная структура комментариев — плоская, без «деревьев», но очень удобная и связная. Комментарии подгружаются по аяксу. Если листать с конца, а не с начала, то переходами по кнопке «Ранее» по условным страницам.

Читать с начала esotalk.org/forum/29-opauthconnect/0/
Читать с конца esotalk.org/forum/29-opauthconnect/last