Ich habe ein einfaches Widget in meinem aktuellen Projekt yii2 gemacht. Es erstellt einfach eine Auswahlliste für alle jui-Themen und ermöglicht es dem Benutzer, das Thema zu ändern und es mithilfe von Cookies zu speichern.So erstellen Sie ein wiederverwendbares Widget in Yii2
Dieses Widget benötigt zwei Javascript-Dateien, - sie sind in run() registriert - einer von ihnen ist die Jquery Cookies Plugin. Ich frage nach dem Wesen des Weges, um die Integrität dieses Widgets und seiner js-Dateien zu bewahren, um es einfach zu machen, in anderen Yii2-Projekten wiederverwendet zu werden, ohne dafür alle notwendigen js-Dateien kopieren zu müssen.
<?php
namespace common\libs;
use yii;
use yii\base\Widget;
use yii\web\View;
use yii\web\JqueryAsset;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of JuiThemeSelectWidget
*
* @author Said Bakr
*/
class JuiThemeSelectWidget extends Widget
{
private $list;
private $script;
private static $juiThemeSelectId = 'JuiThemesList';
public $themeListId;
public $label;
public function init() {
parent::init();
if ($this->themeListId) self::$juiThemeSelectId = $this->themeListId;
$this->list = $this->createSelectList($this->getThemesList());
$this->makeScript();
}
public static function getThemesList()
{
$themesPath = dirname(Yii::$app->basePath).DIRECTORY_SEPARATOR."vendor".DIRECTORY_SEPARATOR."bower".DIRECTORY_SEPARATOR."jquery-ui".DIRECTORY_SEPARATOR."themes";
$output = [];
foreach (scandir($themesPath) as $item){
if (is_dir($themesPath.DIRECTORY_SEPARATOR.$item) && ($item != '.' && $item !='..')) $output[] = $item;
}
return $output;
}
public static function createSelectList($items)
{
$juiThemeSelectId = self::$juiThemeSelectId;
$output = '';
$output .= "<select id=\"$juiThemeSelectId\">"."\n";
foreach ($items as $item){
$output .= "<option value='$item'>$item</option>\n";
}
$output .= "</select>\n";
return $output;
}
/**
* Making the client-side script for the list */
private function makeScript()
{
$t = self::$juiThemeSelectId;
$this->script = <<<EOD
<script>
var juiThemeSelectId = "$t"
</script>
EOD;
}
public function run() {
parent::run();
$this->getView()->registerJsFile('/myjs/jquery.cookie.js', ['depends' => [JqueryAsset::className()]]);
$this->getView()->registerJsFile('/myjs/JuiThemeSelect.js', ['depends' => [JqueryAsset::className()]]);
return "$this->label $this->list \n $this->script";
}
}
In diesem Fall denke ich, Sie sollten es einfach auf GitHub/Bitbucket als Erweiterung veröffentlichen. – arogachev
@arogachev Konnte es nicht lokal gemacht werden? Gibt es eine Möglichkeit, den Komponisten dazu zu bringen, es lokal zu produzieren? – SaidbakR
Vielleicht Satis ist eine Option https://github.com/composer/satis. – arogachev