Page 1 of 1

Help With Minimising Rating Script

Posted: Tue Jul 01, 2014 11:48 am
by chris98
I'm creating a rating script and at the end of the page, I'm showing the current rating so far. But the issue is it's quite lengthy and I'm about 90% sure that I could go around this another way. Here is the code for displaying the current rating, I'm convinced I could get a while loop in there but I can't for the life of me think how. Has anyone got any ideas?

(And yes, those are <inputs>. My CSS turns them into stars. Without the inputs, the star won't work.)

Code: Select all

if ($actual_rating == '1')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '2')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '3')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '4')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '5')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
</div>';
}
else
{
	$stars = '<div class="rating">
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}

Re: Help With Minimising Rating Script

Posted: Tue Jul 01, 2014 12:22 pm
by requinix
All of those blocks are exactly the same except for "star" vs "nostar". So why rewrite the entire block each time when you could just rewrite the "star"? And why count out the five of them separately when you could actually count out the five of them?

Code: Select all

$stars = '<div class="rating">';
for ($i = 1; $i <= 5; $i++) {
    if ($i <= $actual_rating) {
        $star = 'star';
    } else {
        $star = 'nostar';
    }

    $stars .= '
    <div>
        <div class="' . $star . '">
            <input type="image" />
        </div>
    </div>';
}
$stars .= '</div>';
Note the different markup too. You must not reuse IDs on elements. It is invalid HTML. Use classes instead...

...but you already have classes on the parent DIVs, so you can just use that.

Code: Select all

/* old */
div.star input#star { ... }
div.nostar input#nostar { ... }

/* new */
div.star input { ... }
div.nostar input { ... }

Re: Help With Minimising Rating Script

Posted: Wed Jul 02, 2014 3:14 am
by chris98
Perfect - I knew there would be a simple solution thanks. :)