• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Modyfikacja "DOM" z poziomu php

0 głosów
67 wizyt
pytanie zadane 17 lutego w PHP, Symfony, Zend przez użytkownika ShiroUmizake Pasjonat (19,380 punkty)

A oto problem. Mamy powiedzmy jakiś szablon z navbarem.

if (is_category('DevBlog'))
	{
  echo '<li id="1" class="nav_size display"><a href="http://localhost/wordpress/wordpress/">About</a></li>';
  echo '<li id="2"class="nav_size display nav_activ"><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
  echo '<li id="2"class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/projects/">Projects</a></li>';
	echo '<li id="3" class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
    return;
	}

Od pewnych warunków, zależy, że dany węzeł będzie trochę inaczej wyglądać (otrzyma klase nav_activ). Tak... mógłbym to z poziomu JS-a zrobić, ale musiałbym więcej danych do klienta dosłać np: co to jest za kategoria. Drugim rozwiązaniem jest rozbicie nav do np: header-contact.php. A Obecnie to wygląda tak.

function infoURL ()
{
  $category = get_category_link("devblog");
  if (is_home()){
    	echo '<li id="1" class="nav_size display nav_activ"><a href="http://localhost/wordpress/wordpress/">About</a></li>';
      echo '<li id="2"class="nav_size display"><a href=';$category' >DevBlog</a></li>';
      echo '<li id="2"class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/projects/">Projects</a></li>';
    	echo '<li id="3" class="nav_size display  "><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
      return;
  }
	if (is_category('DevBlog'))
	{
  echo '<li id="1" class="nav_size display"><a href="http://localhost/wordpress/wordpress/">About</a></li>';
  echo '<li id="2"class="nav_size display nav_activ"><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
  echo '<li id="2"class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/projects/">Projects</a></li>';
	echo '<li id="3" class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
    return;
	}
	if (is_category('Contact'))
	{
	echo '<li id="1" class="nav_size display"><a href=http://localhost/wordpress/wordpress/">About</a></li>';
  echo '<li id="2"class="nav_size display "><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
	echo '<li id="2"class="nav_size display "><a href="http://localhost/wordpress/wordpress/category/projects/">Projects</a></li>';
	echo '<li id="3" class="nav_size display nav_activ "><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
	return;
	}

	if  (is_category('projects'))
	{
  echo '<li id="1" class="nav_size display"><a href=http://localhost/wordpress/wordpress/">About</a></li>';
  echo '<li id="2"class="nav_size display"><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
	echo '<li id="2"class="nav_size display nav_activ "><a href="http://localhost/wp/topic/projects/">Projects</a></li>';
	echo '<li id="3" class="nav_size display "><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
	return;
	}
	else
	{
    echo '<li id="1" class="nav_size "><a href=http://localhost/wordpress/wordpress/">About</a></li>';
    echo '<li id="2"class="nav_size "><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
  	echo '<li id="2"class="nav_size "><a href="http://localhost/wp/topic/projects/">Projects</a></li>';
  	echo '<li id="3" class="nav_size "><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';
}
	return;
	}

Musicie sami stwierdzić, że nie wygląda to za dobrze. Pytanie brzmi, czy z poziomu PHP da radę manipulować DOM (najlepiej na czystym PHP)?

3 odpowiedzi

+2 głosów
odpowiedź 17 lutego przez użytkownika Boshi Szeryf (80,640 punkty)
komentarz 17 lutego przez użytkownika ShiroUmizake Pasjonat (19,380 punkty)
Dokładnie o takie o coś mi chodziło. Tylko, widzę że bez frameworków się nie obędzie.
komentarz 17 lutego przez użytkownika Boshi Szeryf (80,640 punkty)
To jest tylko komponent...

ponadto masz http://php.net/manual/en/class.domxpath.php na któym de facto symfony bazuje
komentarz 17 lutego przez użytkownika ShiroUmizake Pasjonat (19,380 punkty)
Hmm...Zastanowię się nad tym crawlerem.
0 głosów
odpowiedź 17 lutego przez użytkownika Ivan Nałogowiec (49,770 punkty)

Jeżeli faktycznie chcesz "manipulować" DOM-em, to opłaca się wyciągnąć coś lepszego, ale jak potrzebujesz tylko dodać klasę, gdy jesteś na jakiejś stronie, to możesz stworzyć jakąś klasę i dodać ją w miejscu, gdy ma być lub nie ma być klasy. Nie potrafię tego ładnie opisać, więc po prostu podam przykładowy kod :):

function is_category($category) {
	return $category == 'abc';
}

function is_active_category($category, $text) {
	return is_category($category) ? $text : null;
}

echo "<li". is_active_category('abc', ' class=active') ."></li>";

 

komentarz 17 lutego przez użytkownika ShiroUmizake Pasjonat (19,380 punkty)

Czy chodzi ci o cos takiego?

foreach ($categoryList as $category){
if (is_active_category($category){
  buildActiveLiElement(  getLink($category) );
}
else {
buildLiElement( getLink ($category) );
}

function is_active_category($category){
return is_category($category) <-- zwraca true lub false
}

getLink ($category){
return get_category_link(get_cat_ID($category)); // Pierwsze pyta o id danej kategori, drugi uzyskuje link do kategori.
}

 

0 głosów
odpowiedź 17 lutego przez użytkownika hoktaur Pasjonat (15,800 punkty)
edycja 17 lutego przez użytkownika hoktaur

Wole użycie szablonów przez co oddzielisz php od html i można to zrobić bez frameworków w oparciu o tzw. surowe szablony PHP

i tak jakiś tam plik php

<?php
$display = ' display';

if (is_home()) { 
	$about = ' nav_active';
} elseif(is_category('DevBlog')) {
	$devBlog = ' nav_active';
} elseif (is_category('Contact')) {
	$contact = ' nav_active';
} elseif(is_category('projects')) {
	$projects = ' nav_active';
} else {
	$display = '';
}

include 'template.tpl';
?>

 

i plik template.tpl


<li id="1" class="nav_size <?php echo $display . $about ?>"><a href="http://localhost/wordpress/wordpress/">About</a></li>';
<li id="2" class="nav_size <?php echo $display . $devBlog ?>"><a href="http://localhost/wordpress/wordpress/category/devblog/">DevBlog</a></li>';
<li id="2" class="nav_size <?php echo $display . $projects ?>"><a href="http://localhost/wp/topic/projects/">Projects</a></li>';
<li id="3" class="nav_size <?php echo $display . $contact ?>"><a href="http://localhost/wordpress/wordpress/category/contact/">Contact</a></li>';

niestety pisane z palca i nie testowane ...

Podobne pytania

0 głosów
3 odpowiedzi 251 wizyt
pytanie zadane 7 lipca 2015 w PHP, Symfony, Zend przez użytkownika Don Matteo Stary wyjadacz (10,610 punkty)
0 głosów
1 odpowiedź 1,263 wizyt
...