Assets + Css

Witam serdecznie,

na wstępie chciałbym przywitać całą polską społeczność Yii, jestem nowym użytkownikiem i mam nadzieje, że będę mógł dołożyć do projektu pare swoich cegiełek.

[size="1"]----GORZKIE ŻALE----

Jedyny FW na jakim pracowałem i miałem styczność to CodeIgniter. Mimo tego zrozumienie Yii, zwłaszcza w mojej sytuacji sprawia mi pewne trudności. Zostałem wrzucony do projektu, który został ukończony w ok. 60%. Muszę sprawić aby wszystko działało, a z Yii żadnego kontaktu wcześniej nie miałem. Aby nie wyszło, że są to same gorzkie żale, przyznam że dzięki temu mam przyjemność zapoznać się z frameworkiem i wcale z tego powodu nie płacze :) Potrzebuję tylko małego wsparcia.

---------------------[/size]

—PROBLEM—

Zaczynając od prostych rzeczy, chciałbym zedytować pare plików css, ponieważ tego wymaga moje pierwsze zadanie. Pliki css znajdują się w folderze yiiroot/css. Przy tworzeniu nowego pliku i dołączaniu go do sekcji nagłówkowej zmiany są widoczne, jednak przy edycji już istniejących arkuszy na serwerze - żadne modyfikacje nie przynoszą skutku. Istnieją jako kod w plikach, ale nie widać żadnych rezultatów w przeglądarce. Zakładam(chyba słusznie), że sprawę psują assety. Na początku myślałem, że proste usunięcie zawartości tego folderu powinno załatwić sprawę. Niestety rozczarowałem się i nadal stoję w miejscu.

Czy ktoś uprzejmy mógłby mi wskazać gdzie jest błąd w moim rozumowaniu, ewentualnie wytłumaczyć zasadę działania Yii w takich przypadkach? W pliku css dana klasa jest zawarta, tak samo w strukturze, jednak style nie są aprobowane przez przeglądarke. Dodam, że żadnych literówek, błędnych deklaracji itp. nie ma. Przejrzałem materiał dostępny w internecie, jednak nadal nie mogą popradzić sobię z tym problemem.

Pozdrawiam, MHuh

Witam,

w /protected/config dodaj sobie opcje debug true. Mozesz tez usunac zawartosc katalogu assets w katalogu projektu (poznasz po katalogach co maja w nazwach krzaki)

Witaj,

dziękuję za ekspresową odpowiedź. Nie bardzo wiem gdzie w /protected/confing mam ustawić opcję debugowania? Na pewno mam ustawioną w yiiroot/index.php wartość




defined('YII_DEBUG') or define('YII_DEBUG',true);



Jeśli chodzi o usuwanie zawartości katalogu assets, to również tego próbowałem, niestety bez rezultatów.

Pozdrawiam, MHuh

Ja mam to w /protected/config/main.php


'params'=>array(

		// this is used in contact page

		'adminEmail'=>'webmaster@example.com',

		'defaultPageSize' => 20,

		'debug' => true,

		'webRoot' => dirname(__FILE__).DIRECTORY_SEPARATOR.'../../'

	)

Może jakis inny moduł obsługuje te assety skoro usunięcie tego katalogu nic nie daje, może jest jakiś moduł do kompresji tego jeszcze

Patrzyłeś w źródle strony czy przeglądarka "widzi" te zaktualizowane pliki? Z jakiego adresu są pobierane pliki css? Czy właśnie z tej ścieżki, pod którą edytujesz plik? Może pliki css ładowane są z folderu themes/…? Firebug do FF albo Google chrome (skrót F12) i sprawdź skąd ładują się pliki css.

Witam serdecznie,

dziękuję wszystkim za porady. Muszę przyznać, że sprawdziłem poprawność trybu debugowania oraz prawidłowość ścieżek. Wszystko wydawało się zgodne z waszymi poradani. Postanowiłem ostatni raz wyczyścić /assets i o dziwo zadziałało. Rzecz, którą powtarzałem kilkanaście razy i nie przynosiła rezultatu. Do teraz nie mogę ustalić gdzie leżał problem, najważniejsze, że wszystko jest już sprawne. Jeśli uda mi się znaleźć przyczynę usterki, podziele się opisem na forum.

Pozdrawiam i jeszcze raz dziękuję za odpowiedzi, Mhuh

generalnie czyszczenie assetow powinno pomoc, ale moze problem lezal troche gdzie indziej - na produkcji moze miales ustawione opcje keszowania statycznych plikow (naglowek http Expires) i pliki keszowaly sie w przegladarce lub jakims proxy/loadbalancerze gdzies po drodze? jesli tak - dopiero kiedy wygasl czas ‘Expires’ proxy/przegladarka ponownie odpytalo serwer o aktalizacje pliku i wszystko zaskoczylo.

Hmm, faktycznie ma to sens i prawdopodobnie tak było. Poszukam i dam znać :)

Przyłączając się do wątku, co można zrobić, gdy trzeba edytować intensywnie CSS? Czyszczenie assets przed każdym wyświetleniem aplikacji jest nieco kłopotliwe (chyba, że jakieś makro w IDE). Ja wpadłem na pomysł edycji CSS w assets, tylko potem trzeba pamiętać o przeniesieniu pliku we właściwe miejsce. Jest jakiś lepszy sposób?

Proponuje w config-u dla asset managera ustawić forceCopy na true.




'componets'=>array(

  'assetManager'=>array(

    'forceCopy'=>true,

  )

)



Więcej info tutaj:

http://www.yiiframework.com/doc/api/1.1/CAssetManager#forceCopy-detail

Odświeżę trochę temat. Ja rozwiązałem to trochę inaczej. Usuwam cyklicznie co 1h assety, w przypadku częstych aktualizacji odpalam crona. Rozwiązanie problemu:

Do tego celu potrzebujemy rozszerzenia PHPDocCrontab oraz wpis w CronTabie odpalania co minute "php yiic cron run"

Worker




function delete_directory($dirname)

  {

    if (is_dir($dirname)) 

    {

      $dir_handle = opendir($dirname);

    }


    if (!$dir_handle) 

    {

      return false;

    }


    while($file = readdir($dir_handle)) 

    {

      if ($file != "." && $file != "..")

      {

        if (!is_dir($dirname."/".$file))

        {

          unlink($dirname."/".$file);

        }

        else

        {

          delete_directory($dirname.'/'.$file);

        }

      }

    }

    closedir($dir_handle);

    rmdir($dirname);

  }

class WorkerCommand extends CConsoleCommand

  {

   

    /**

    * @cron *\59 * * * * 

    */

    public function actionIndex()

    {

      

      if(is_dir('./../assets/')==true)

      {

        $active_directory = './../assets/';

        $handle=opendir($active_directory);

        $zmienna=0;


        while(FALSE !==($file=readdir($handle)))

        {

          $path = $active_directory . $file;

          if ($file != "." && $file != ".." && is_dir($path) == TRUE)

          {

            $zmienna++;

          }

        }

        echo $zmienna;


        if ($handle = opendir($active_directory)) 

        {

           while (false !== ($entry = readdir($handle))) 

           {

             if ($entry != "." && $entry != "..") 

             {

               echo "$entry\n";

               delete_directory('./../assets/'.$entry);

              }

            }

          closedir($handle);

        }


        if($zmienna != 0)

        {

          $wpis = new CronLog;

          $wpis->text = "Usunalem ". $zmienna." folderów" ;

          $wpis->save();

        } else {

          $wpis = new CronLog;

          $wpis->text = "Brak folderów do usuniecia" ;

          $wpis->save();

        }

      } else {

        echo 'brak katalogu';

        $wpis = new CronLog;

        $wpis->text = "Brak katalogu głównego assets do usuniecia" ;

        $wpis->save();  

      }

    }

  }