Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Kohana - pierwszy rekord z class="show"
Forum PHP.pl > Forum > Przedszkole
bahh
Witam

Morduję się z podpięciem slidera w jquery do kohany (wyświetla mi 5 najnowszych artykułów)

Na potrzeby slidera muszę sprawić by link pierwszego miał class="show"

demo slidera: http://www.queness.com/resources/html/slid...-slideshow.html

A oto fragment kodu odpowiedzialny za część wizualną:

  1. <div id="gallery">
  2. <?php foreach($categories as $category): ?>
  3. <?php foreach($articles[$category->id] as $article): ?>
  4. <?php if($article->lead_photo->loaded()): ?>
  5. <?php $photo = Html::image($article->lead_photo->thumb(620, 280),
  6. array('id' => 'article-'.$article->id, 'rel' => $article->title)
  7. ); ?>
  8. <?php echo Html::anchor(
  9. URL::friendly('article/view/%1/%2', $article->id, $article->title),
  10. $photo,
  11. array('title' => $article->title)
  12. ); ?>
  13. <?php endif ?>
  14. <?php endforeach; ?>
  15. <?php endforeach ?>
  16. </div>


Jak poradzić sobie z tym i w linku pierwszego obrazka wstawić mu class="show"?

Pozdrawiam
d3ut3r
Jeżeli $articles[$category->id] jest tablicą asocjacyjną to powinno załatwić sprawę:
  1. ?>
  2. <div id="gallery">
  3. <?php
  4. foreach($categories as $category){
  5.  
  6. foreach($articles[$category->id] as $index=>$article){
  7.  
  8. reset($articles[$category->id]);
  9. if ($index===key($articles[$category->id])){
  10. $class='show';
  11. } else{
  12. $class='';
  13. }
  14. if($article->lead_photo->loaded()){
  15.  
  16. $photo = Html::image($article->lead_photo->thumb(620, 280),
  17. array('id' => 'article-'.$article->id, 'rel' => $article->title, 'class'=>$class)
  18. );
  19.  
  20. echo Html::anchor(
  21. URL::friendly('article/view/%1/%2', $article->id, $article->title),
  22. $photo,
  23. array('title' => $article->title)
  24. );
  25.  
  26. }
  27.  
  28. }
  29.  
  30. }
  31. ?>
  32. </div>


jeżeli tablica $articles[$category->id] nie jest asocjacyjna to wystarczy zrobić:

  1. if ($index==0){
  2. $class='show';
  3. } else{
  4. $class='';
  5. }
  6.  


i powinno działać.
bahh
Wstawiłem coś takiego:

  1. <?php
  2. foreach($categories as $category){
  3. foreach($articles[$category->id] as $index=>$article){
  4. reset($articles[$category->id]);
  5. if ($index===key($articles[$category->id])){
  6. $class='show';
  7. } else{
  8. $class='';
  9. }
  10. if($article->lead_photo->loaded()){
  11.  
  12. $photo = Html::image($article->lead_photo->thumb(620, 280),
  13. array('id' => 'article-'.$article->id, 'rel' => $article->title)
  14. );
  15.  
  16. echo Html::anchor(
  17. URL::friendly('article/view/%1/%2', $article->id, $article->title),
  18. $photo,
  19. array('title' => $article->title, 'class'=>$class)
  20. );
  21. }
  22. }
  23. }
  24. ?>


i nic się nie dzieje, nie wyświetla class="show" przy pierwszym tylko wszędzie class=""
w drugim przypadku przy zwykłym ifie wywala errora
thek
Można to na kilka sposobów zrobić. Mniej lub bardziej wymyślnych. Jedna z możliwości? Ustaw sobie flagę jakąś, która jest resetowana (czy to na true czy false, nieważne) przed drugą pętlą. Po wejściu do pętli sprawdzaj w określonym miejscu kodu, gdzie ustawiasz class, czy jest ona zresetowana czy nie. Jeśli tak, wal class="show" i ustaw flagę na przeciwną. Jeśli nie, olej sprawę, bo to oznacza że jesteś już w conajmniej drugim elemencie.
bahh
Oj, nie bardzo cię rozumiem, gdybyś mógł napisać mi to w kodzie to być może bym Cię zrozumiał wink.gif

Nie wiem w jaki sposób określić który to już rekord w kolejności wyświetlenia - wtedy wystarczy zmienna i if, ale nie mam pojęcia jak ta zmienna ma wyglądać :/
d3ut3r
Cytat
w drugim przypadku przy zwykłym ifie wywala errora


Jakiego ?

na prostym przykładzie:

  1.  
  2. $elements=array('kot','pies','kura');
  3.  
  4. foreach ($elements as $index=>$element){
  5.  
  6. if ($index==0){
  7. echo $element.' jest pierwszym elementem <br />';
  8. }
  9. else{
  10. echo $element.'<br />';
  11. }
  12. }
bahh
Ajj, cały efekt psuła linijka reset($articles[$category->id]); której zapomniałem usunąć, teraz działa należycie, wielkie dzięki wink.gif
thek
Gorzej gdy klucze nie są numeryczne lub nie są numerowane od 0, bo wtedy przyrównywanie do 0 staje się niemożliwe. To o czym wspomniałem można zrobić tak,
  1. <?php
  2. foreach($categories as $category)
  3. {
  4. $show_flag = TRUE;
  5. foreach($articles[$category->id] as $index=>$article)
  6. {
  7. if($show_flag)
  8. {
  9. $class = 'show';
  10. $show_flag = FALSE
  11. }
  12. else
  13. {
  14. $class = '';
  15. }
  16. if($article->lead_photo->loaded())
  17. {
  18. $photo = Html::image(
  19. $article->lead_photo->thumb(620, 280),
  20. array('id' => 'article-'.$article->id, 'rel' => $article->title)
  21. );
  22. echo Html::anchor(
  23. URL::friendly('article/view/%1/%2', $article->id, $article->title),
  24. $photo,
  25. array('title' => $article->title, 'class'=>$class)
  26. );
  27. }
  28. }
  29. }
  30. ?>

ale sensowniejsze jest inne podejście. Coś na zasadzie pętli do-while, czyli puszczenie pierwszego rekordu i zmiana dopiero po wykonaniu wszystkiego smile.gif
  1. <?php
  2. foreach($categories AS $category)
  3. {
  4. $class = 'show';
  5. foreach($articles[$category->id] AS $article)
  6. {
  7. if($article->lead_photo->loaded())
  8. {
  9. $photo = Html::image(
  10. $article->lead_photo->thumb(620, 280),
  11. array('id' => 'article-'.$article->id, 'rel' => $article->title)
  12. );
  13. echo Html::anchor(
  14. URL::friendly('article/view/%1/%2', $article->id, $article->title),
  15. $photo,
  16. array('title' => $article->title, 'class'=>$class)
  17. );
  18. }
  19. $class = '';
  20. }
  21. }
  22. ?>
Zwróć uwagę na brak ifów i dodatkowych flag. Zamiast niego będzie w każdym kroku pętli przypisywanie do $class wartości pustej po przejściu pierwszego kroku. Trochę kod się skrócił po tym innym podejściu. Pierwszy krok będzie widział jako $class = 'show', czyli to o co nam chodzi i będzie się to resetowało wraz z każdym kolejnym krokiem pierwszej, zewnętrznej, pętli. Wystarczy jednak, że wewnętrzna dojdzie do końca pierwszego kroku, a wraz z nim (i każdym kolejnym wink.gif ) $class będzie ustawiany na wartość pustą smile.gif Dlaczego tak? Ponieważ jeśli dam jako ostatnią operację zmianę $lass, to pierwsze generowanie wewnętrznej pętli będzie jeszcze widziało 'show', ale kolejne już '' zobaczą.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.