モジュールmodLivestreet 0.3.0-rcの新しいバージョンのリリース

MODXおよびLivestreetバンドルモジュールに関するトピックを続けて、modLivestreetモジュールの新しいバージョンlivestreet-0.3.0-rc.transport.zipを紹介します。



新機能 はい、ほとんどすべて:-)モジュールはゼロから書き直されました。

1. LiveStreetリクエスト処理ロジックが大幅に変更されました(改善されました)。

2. MODXおよびLiveStreetに同期ユーザー登録を追加しました。 MODX管理パネルを使用してユーザーを登録すると、ユーザーはLiveStreetで自動的に作成されます。LiveStreetがユーザーを登録するリクエストを処理すると、登録はMODXを通過します。

この機能は設定により無効にできます。



カットオフでは、標準バージョンとmodLivestreetモジュールでのMODX作業スキーム(簡略化)と、ユーザーがMODXとLivestreetに同時に登録される方法の詳細な説明(MODXでの登録がどのように変更されたかのスキームを後日掲載します)、およびソースコード。



UPD:githubでパッケージを構築: github.com/Fi1osof/modx-livestreet



標準アセンブリおよびmodLivestreetモジュールを使用した有望なMODXワークフロー










それでは、このモジュールはどのように機能しますか?



1.このモジュールで最も重要なプラグインは、2つのイベントonHandleRequestとonPageNotFoundによってトリガーされます。

最初のケースでは、原則としてLivestreetへのリクエストのチェック(およびLivestreet変数の初期化)と、静的Livestreetファイルおよびその個々のモジュール(Captchaなど)へのアクセスのチェックがあります。

2番目のケースでは、別のタスクが実行されます:リクエストの処理中にMODXがランディングページを見つけた場合、onPageNotFoundイベントは原則として機能せず、livestreet.runスニペットがMODXドキュメントで明示的に呼び出され、LiveStreetのリクエストを実行する場合、LiveStreetは処理されません このアプローチにより、LiveStreetでのみMODXを結び付けることはできません。 つまり、MODXで完全に独立したサイトを作成できますが、/フォーラム/セクション(または別のforum.site.ruサブドメイン)を作成し、そこに着信ページを定義し、その中にスニペットコール[[!Livestreet.ru]]を記述しますサイト)、設定でlivestreet.url_perfix '/ forum /'を指定します。 /forum/.*マスクに対するすべてのリクエストは、LiveStreetへの呼び出しで実行され、ブログを取得します。 ここでは、権限の検証を追加したり、特定のブログスレッドのみを呼び出したりできます。

ドキュメントが見つからず、onPageNotFoundイベントが発生し、URLがLivestreetセクションと一致する場合、Livestreetの要求は既に実行されています。 小さな警告があります:これがLivestreetユーザーを登録するリクエストである場合、登録スニペットはsnippet.livestreet.ajax-registration.phpと呼ばれます



ここにプラグインのリストがあります
<?php switch($modx->context->key){ case 'web': break; default: return; } switch($modx->event->name){ //          LiveStreet case 'OnHandleRequest': //   - livestreet_path/config/ define('IN_MODX', true); define('LIVESTREET_WEB', $modx->getOption('site_url')); define('LIVESTREET_PATH', $modx->getOption('livestreet.livestreet_path')); define('LIVESTREET_INDEX_FILE', $modx->getOption('livestreet.index_file')); define('LIVESTREET_URL_PREFIXE', $modx->getOption('livestreet.url_prefix')); $request = false; //print "<br />REQUEST_URI:" . $_SERVER['REQUEST_URI']; //      LiveStreet if($_SERVER['REQUEST_URI'] == LIVESTREET_URL_PREFIXE || $_SERVER['REQUEST_URI']."/" == LIVESTREET_URL_PREFIXE){ $request = '/'; } else{ //     LiveStreet,  $preg = str_replace('/', '\/', LIVESTREET_URL_PREFIXE); if(!preg_match("/^{$preg}/", $_SERVER['REQUEST_URI']."/")){ return; } $request = preg_replace("/^{$preg}/", '', $_SERVER['REQUEST_URI']); } if( substr( $request, 0, 1) != '/') $request = '/'. $request; //    LS define('LIVESTREET_REQUEST_URI', $request); //   ,    ,    if(!$modx->checkSiteStatus()){ return; } $file = LIVESTREET_INDEX_FILE; /*$t = $modx->invokeEvent('onLivestreetUserSave', array('sdfsdf')); print_r($this->processEventResponse($t)); exit;*/ //      LiveStreet $preg = str_replace('/', '\/', "(/templates/|/uploads/|/engine/lib/external/jquery)"); if(preg_match("/^{$preg}/", LIVESTREET_REQUEST_URI)){ $file = LIVESTREET_REQUEST_URI; $file = preg_replace('/\?+.*/', '', $file); $fullpath = str_replace('//','/', LIVESTREET_PATH.$file); if(!file_exists($fullpath)){ die('File Not Found'); } $fsize = filesize($fullpath); $pi = pathinfo( $file); $ext = $pi['extension']; switch ($ext) { case "css": $ctype="text/css; charset=utf-8"; break; case "js": $ctype="application/x-javascript; charset=utf-8"; break; case "pdf": $ctype="application/pdf"; break; case "exe": $ctype="application/octet-stream"; break; case "zip": $ctype="application/zip"; break; case "doc": $ctype="application/msword"; break; case "xls": $ctype="application/vnd.ms-excel"; break; case "ppt": $ctype="application/vnd.ms-powerpoint"; break; case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpg"; break; default: $ctype="application/force-download"; } header("Content-type: {$ctype}", true); header("Content-Length: ".$fsize); header("last-modified: ". gmdate("d, dmyh:i:s", filemtime($fullpath) )." GMT"); header("Pragma: public"); header("Expires: 0"); readfile($fullpath); exit; } /* *    -   */ //  $preg = str_replace('/', '\/', "/engine/lib/external/kcaptcha/"); if(preg_match("/^{$preg}/", LIVESTREET_REQUEST_URI)){ $file = 'engine/lib/external/kcaptcha/index.php'; require_once LIVESTREET_PATH.$file; exit; } break; case 'OnPageNotFound': // if not LiveStreet request, stop if(!defined('LIVESTREET_REQUEST_URI')){ return; } $_SERVER['REQUEST_URI'] = LIVESTREET_REQUEST_URI; // Registration if(LIVESTREET_REQUEST_URI == $modx->getOption('livestreet.registration_url', null, '/registration/ajax-registration/')){ // if not in sync mode if($modx->getOption('livestreet.sync_users') == true){ print $modx->runSnippet('livestreet.ajax-registration'); exit; } } print $modx->runSnippet('livestreet.run'); exit; break; default: $modx->event->output( 'true'); ; }
      
      





ご覧のように、原則として、プラグインはそのような機能にはまったく大きくありません。 したがって、自分のニーズに合わせて変更したい場合は、誰でもそれを理解できます。



2.スニペットsnippet.livestreet.runは、LiveStreetのリクエストを実行するために使用されます



リスティング
 <?php if($request_uri){ $_SERVER['REQUEST_URI'] = $request_uri; } ob_start(); @include $modx->getOption('livestreet.livestreet_path').$modx->getOption('livestreet.index_file'); $output = ob_get_contents(); ob_end_clean(); return $output;
      
      





彼はとても小さいです。 愚かにLiveStreetを呼び出し、バッファリングして結果を返します。 したがって、出力前にコンテンツを処理し、実行を確認するためにAjaxリクエストの結果を処理することができます(これは、ユーザー登録を実行する場合に特に重要です。 Livestreetで)。



再度予約があります。 Livestreetでは、コンテンツ出力クラスは正しく機能しません。 Ajax出力モードでは、LSは愚かにexit();を実行し、モジュール全体の動作を中断します。 したがって、LSでは、少し操作する必要があります。

ファイルコンポーネント/ livestreet / docs / forLiveStreet / source / engine / modules / viewer / Viewer.class.php

DisplayAjaxメソッド($ sType = 'json')でexit()を置き換えます。 帰りに;

そして、Displayメソッド($ sTemplate)で置き換えます
 if ($this->sResponseAjax) { $this->DisplayAjax($this->sResponseAjax); }
      
      



 if ($this->sResponseAjax) { $this->DisplayAjax($this->sResponseAjax); return; }
      
      





原則として、これはLivesreetの独立した仕事を変えることはありませんが、Ajaxリクエストの結果を処理し、ロジックを継続する機会を与えてくれます。



3. livestreet.ajax-registrationのスニペット。

このスニペットは、Livestreetユーザーの登録要求を処理します。



リスティング
 <?php // if not in sync mode if($modx->getOption('livestreet.sync_users') != true){ return; } $path = $modx->getObject('modNamespace', array( 'name' => 'livestreet' )) -> getCorePath()."processors/"; // print $path; // exit; $response = $modx->runProcessor('security/user/ajaxCreate', array( 'username' => $_POST['login'], 'email' => $_POST['mail'], 'passwordnotifymethod' => 'false', 'passwordgenmethod' => 'false', 'specifiedpassword' => $_POST['password'], 'confirmpassword' => $_POST['password_confirm'], ), array( 'processors_path' => $path )); $bStateError = false; $sMsgTitle = null; $sMsg = null; $errors = array(); if($response->isError()){ // print '<pre>'; //print_r($modx->error->errors); $errorsArray = (array)$modx->error->errors; // processEventResponse // $error = $response->getMessage(); if($errMessageArr = (array)explode("\n", $response->getMessage())){ foreach($errMessageArr as $message){ if(!$message = trim($message))continue; if(!$errArr = explode('::', $message) OR count($errArr) != 2){ $sMsg = $message; } else{ $errorsArray[] = array( 'id' => $errArr[0], 'msg' => $errArr[1], ); } } } foreach($errorsArray as $err){ // LiveStreet Errors if($name = $err['id']){ switch($name){ case 'username': $name = 'login'; break; case 'specifiedpassword': $name = 'password'; break; case 'confirmpassword': $name = 'password_confirm'; break; default: continue; } $errors[$name][0] = $err['msg']; } // MODX errors else{ $sMsg = current($err); } } if(!$errors && !$sMsg){ $sMsg = '  '; } if($sMsg){ $sMsgTitle = 'Error'; $bStateError = true; } $response = array( 'sMsgTitle' => $sMsgTitle, 'sMsg' => $sMsg, 'bStateError' => $bStateError, 'aErrors' => $errors ); } else{ // Success $response = array( 'sMsgTitle' => null, 'sMsg' => '!   !', 'bStateError' => false, 'sUrlRedirect' => $_POST['return-path'], ); } return json_encode($response);
      
      





設定で同期登録が無効になっている場合、スニペットは実行されません。これがLivestreetでのユーザー登録の直接リクエストである場合、リクエストはLivestreetに送信されます。

同期登録が有効になっている場合、リクエストはLivestreetではなく、MODXにユーザーを登録するために送信されます(プロセッサーコア/コンポーネント/ livestreet /プロセッサー/セキュリティ/ユーザー/ ajaxCreate.class.phpが呼び出され、拡張クラスmodUserCreateProcessorが呼び出されます)。 このプロセッサを呼び出すことの本質は簡単です-システムプロセッサmodx / processor / security / user / create.class.phpを介してベースプロセッサを呼び出してMODXユーザーを作成する

この呼び出しの理由は、このプロセッサが新しいユーザーを作成する権利をチェックするため、このプロセッサを直接呼び出すことができないためです。これは、許可されていないユーザーの権利ではありません。 したがって、このクラスでは、この権利の検証を上書きするだけです(この手法の ヒントありがとうbezumkinに感謝します )。



リスティング
 <?php $file = MODX_PROCESSORS_PATH.'security/user/create.class.php'; if(!file_exists($file)){ class modLivestreetUserCreateErrorProcessor extends modProcessor { public function process() { $err = 'processor security/user/create not found'; $this->modx->log(modX::LOG_LEVEL_ERROR, $err); return $this->failure($err); } } return 'modLivestreetUserCreateErrorProcessor'; } require_once $file; class modLivestreetUserCreateProcessor extends modUserCreateProcessor { public $permission = ''; } return 'modLivestreetUserCreateProcessor';
      
      







さて、ユーザーがMODXに登録されたら、livestreet_usersプラグインをOnBeforeUserFormSaveイベントでハングさせます。



リスティング
 <?php /* * Synchronized registration MODX and Livestreet users */ switch($modx->event->name){ case 'OnBeforeUserFormSave': switch($scriptProperties['mode']){ // Register new user case 'new': // if not in sync mode if($modx->getOption('livestreet.sync_users') != true){ return; } // Using for LiveStreet ModuleSecurity::GenerateSessionKey // check password method if($scriptProperties['data']['passwordgenmethod'] == 'g'){ $len = $modx->getOption('password_generated_length',null,8); $password = $password_confirm = modUserValidation::generatePassword($len); /* * note then newPassword in createProcessor will not be overwrited !!! * in backend will see wron new passrowd */ $scriptProperties['user']->set('password', $password); } else{ $password = $scriptProperties['data']['specifiedpassword']; $password_confirm = $scriptProperties['data']['confirmpassword']; } $_REQUEST['password'] = $password; $_REQUEST['password_confirm'] = $password_confirm; $_REQUEST['login'] = $scriptProperties['data']['username']; $_REQUEST['mail'] = $scriptProperties['data']['email']; $_REQUEST['login'] = $scriptProperties['data']['username']; if($modx->context->key == 'mgr'){ $captcha = time(); $_SESSION['captcha_keystring'] = $captcha; $_REQUEST['captcha'] = $captcha; $_SESSION['user_id'] = ''; $_REQUEST['security_ls_key'] = md5( session_id(). $modx->getOption('livestreet.module.security.hash', null, 'livestreet_security_key')); } $response = $modx->runSnippet('livestreet.run', array( 'request_uri' => $modx->getOption('livestreet.registration_url') )); $response = json_decode($response); if(!is_object($response)){ $modx->event->output('  '); } elseif($response->aErrors){ $errors = ''; $errors__ = array(); foreach((array)$response->aErrors as $f => $val){ $errors .= "$f:: ". $val[0]."\n"; } $modx->event->_output = $errors; } return; break; default:; } break; default:$modx->log(modX::LOG_LEVEL_ERROR, "Wrong Event: ". $modx->event->name); }
      
      





MODXユーザーの登録時に、すべてのチェックの後(すべてが正常であれば)、プラグインが実行され、LiveStreetでユーザーの登録が試行されます。 試行が中断した場合、LiveStreetエラーを返し、MODXユーザーの登録を終了します。 すべて問題なければ、最終的にユーザーをMODXに登録します。

したがって、MODX管理パネルとFrontEndの両方からユーザーを登録できるようにします。あちこちで、考えられるすべてのエラーを確認し、MODXとLiveStreetの両方でユーザー登録を取得します。 将来、必要に応じて、これらのユーザーを電子メールでリンクできます(LSでは電子メールが一意のキーであるため)。



それだけです:-)

だから私はMODXが大好きです:-)エンジン自体のコードのバイトに影響を与えることなく、エンジンを真剣に変更しました。

しかし、MODXにはソーシャルモジュールはありません。

しかし、Livestreetは優れたソーシャルネットワークですが、MODXなどのAPIは提供していません。 管理者さえもいません。

しかし、一緒に、これらのエンジンは素晴らしい製品を提供できます! このモジュールの開発を続けます。



UPD 2:新しいリリースがリリースされました: modlivestreet-0.4.1-rc.transport.zip

新規:

1.すべての要素と設定にmodLivestreetプレフィックスが追加されたため、残念ながら新しいモジュールには以前のバージョンとの下位互換性がありません。 しかし、確かにこれは誰にとっても問題にはなりません。 古いモジュールを削除して新しいモジュールを入れ、メインページで次のように変更するだけで十分です。

2.ディレクトリ/テンプレート/、/アップロード/などからダウンロードしたファイルの拡張子のチェックを追加し、.phpなどをダウンロードしないようにしました。

もちろん、そのようなファイルはそこにあるべきではありませんが、少なくとも/ skin / config /にはそのようなファイルがあります。



UPD 3:セキュリティノート: modxlivestreet.ru/blog/modLivestreet_security/7.html



All Articles