Как получить путь к папке темы JuiAsset в Yii2?

В yii2-advanced-app ресурсы jui находятся в таких путях, как: web\assets\135efca3\, в которых находятся папки themes и ui -Действительно, я не знаю, почему Yii2 создает различный сегмент пути или поддельный путь-. Я думаю, что getAssetPath()< /strong> метод assetsManager должен вернуть этот путь, но я не знаю как!

Я попробовал следующий код отладки в методе actions() контроллера:

public function actions()
{
   echo Yii::$app->assetManager->getAssetPath(Yii::$app->assetManager->bundles = [
          'yii\jui\JuiAsset'], 'themes');
          die(); //for debugging
} 

Однако он просто печатает /themes.

Другими словами, я могу спросить, как я могу предоставить первый параметр (объект) getAssetPath()? потому что я думаю, что это проблема здесь.

Редактировать

Я создал следующий помощник - в соответствии с ответом арогачева о пути - для получения списка тем.

<?php
namespace common\libs;
use yii;
use yii\web\Controller;

    class JuithemeHelpers
    {
      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;
      }
    }

Затем в представлении я сделал следующее:

...
<?= $form->field($model, 'birthdate')->widget(DatePicker::className(), ['clientOptions' => ['dateFormat' => 'yy-mm-dd', 'changeYear' => true, 'yearRange' => sprintf('%s:%s', date('Y')-100,date('Y')-16)],]) ?>
    
      <select onchange="changeTheme(this.value)">
      <?php foreach (JuithemeHelpers::getThemesList() as $item): ?>
              <option value="<?= $item ?>"><?= $item ?></option>
        <?php       endforeach; ?>
      </select>
    
    
    <?= $form->field($model, 'gender_id')->dropDownList($model->getGenderList(), ['prompt' => 'Please Select one...']) ?>


  ...
......
<script>
    function changeTheme(n){  
      s = document.getElementsByTagName('link');
      o = ''
      re = /\/themes\/(.*)\/jquery-ui.css/gi;
      for (i = 0; i < s.length; i++){
        if (s[i].href.match(re)){
          
                o = s[i].href.replace(re.exec(s[i].href)[1],n);
                s[i].href=o;
        }       
      }
    }  
      </script>

Я думаю, что сейчас самое время научиться упаковывать все это в виджет.


person SaidbakR    schedule 23.01.2015    source источник
comment
Какова конечная цель этого? Вы хотите изменить используемую по умолчанию тему?   -  person arogachev    schedule 23.01.2015
comment
Цель состоит в том, чтобы перечислить все доступные темы в папке themes. Это недоступно без доступа к папке themes и списка всех ее папок с помощью функции файловой системы @arogachev.   -  person SaidbakR    schedule 23.01.2015
comment
Но почему вы пытаетесь сделать это с папками, сгенерированными активами, а не с папками/файлами исходного пути?   -  person arogachev    schedule 23.01.2015
comment
Где источник, где я могу найти темы? @арогачев   -  person SaidbakR    schedule 23.01.2015


Ответы (1)


jQuery UI (по умолчанию поставляется с фреймворком) папки с темами находятся в папке /vendor/bower/jquery-ui/themes.

Вы можете увидеть это, проверив $sourcePath и $css свойства yii\jui\JuiAsset .

Вместо того, чтобы писать полный путь, вы можете использовать псевдоним @bower:

Yii::getAlias('@bower/jquery-ui/themes');

Для листинга вы можете использовать, например, этот метод :

$themesPath = Yii::getAlias('@bower/jquery-ui/themes');
$results = scandir($themesPath);

foreach ($results as $result) {
    if ($result === '.' || $result === '..' || !is_dir($themesPath . '/' . $result)) {
        continue;
    }

    echo $result . "<br/>";
}
person arogachev    schedule 23.01.2015
comment
Очень хорошо, но здесь есть небольшая проблема. Я хочу изменить путь к теме на на стороне клиента, т.е. используя javascript, поэтому мы должны использовать подделку путь темы. Однако, используя указанный вами путь, я могу получить список тем, а затем, используя javascript и регулярное выражение, я изменю атрибут href ссылки css. - person SaidbakR; 24.01.2015