рд╣рдо рдПрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдореВрд▓реНрдпрд╛рдВрдХрди рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ

рд╕рд╛рдЗрдЯ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ (рдиреЛрдЯреНрд╕, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рдЙрджреНрдзрд░рдг, рдлреЛрдЯреЛрдЧреНрд░рд╛рдо, рд╡реАрдбрд┐рдпреЛ, рдЖрджрд┐) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░реЗрдВ?



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреА рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЕрдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдореЗрд╣рдорд╛рди), рдЖрджрд┐ред



рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдХрдордЬреЛрд░ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╣рдо рд░реЗрдЯрд┐рдВрдЧ рдорддрджрд╛рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ ( Rating_Object ) рдФрд░ рд╡рд┐рд╖рдп ( Rating_Subject ) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рджреЛрдиреЛрдВ рд╡рд░реНрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реИрдВред Rating_Object рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦреЛрдВ рдФрд░ рдлреЛрдЯреЛрдЧреНрд░рд╛рдо рдХреЛ рдмрд╛рдВрдзрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Rating_Offitable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:



interface Rating_Ratable { /** * @return Rating_Object */ public function asRatingObject(); }
      
      







рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдм рдЕрдиреБрдЪреНрдЫреЗрдж рд╡рд░реНрдЧреЛрдВ, рдЖрджрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:



 class Article extends ActiveRecord implements Rating_Ratable { public function setTableDefinition() { $this->hasReferenceColumn("rating_object_id"); } public function setUp() { $this->hasOne("Rating_Object as rating_object", array("local" => "rating_object_id", "foreign" => "id")); } public function asRatingObject() { return $this->rating_object; } }
      
      







рд╣рдо рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╡рд┐рд╖рдп рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдорддрджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЖрдЧрдВрддреБрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рдЕрддрд┐рдерд┐ рд╕реВрдЪрдирд╛ рдХреЗ рдПрдХ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ), рдмрд╕ рдЙрдкрдпреБрдХреНрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рд╡рд░реНрдЧ рдлрд╝реАрд▓реНрдб рд░реЗрдЯрд┐рдВрдЧ_рд╕рдмрдЬреЗрдХреНрдЯ_рдбред



рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдРрд╕реА рд╕рдВрд╕реНрдерд╛рдУрдВ рд╕реЗ рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрдЧрдВрддреБрдХ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд░реЗрдЯрд┐рдВрдЧ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Rating_Subject рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рднреА рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реЗ рд╣реИрдВ рдЬреЛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рдирдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреНрд▓рд╛рд╕ Rating_Vote рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, - рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд░рд┐рдХреЙрд░реНрдб object_id, subject_id, рд░рд╛рдпред рдЕрдВрддрд┐рдо рдлрд╝реАрд▓реНрдб рд░реЗрдЯрд┐рдВрдЧ рд╕реНрдХреЗрд▓ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╕рдВрдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЗрдЯрд┐рдВрдЧ рдЬрд┐рд╕реЗ рдЗрд╕ рдЗрдХрд╛рдИ рдиреЗ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдпрд╛ рд╣реИред



рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдорд╛рдиреЛрдВ рдХрд╛ рд╕реНрдкреЗрдХреНрдЯреНрд░рд╛ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ "рдЕрдЪреНрдЫрд╛" рдФрд░ "рдмреБрд░рд╛" ( рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╕рдВрдж ) рдХреА рджреЛ рд░реЗрдЯрд┐рдВрдЧ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдПрдХ рд╕реЗ рдкрд╛рдВрдЪ рд╕рд┐рддрд╛рд░реЛрдВ (рдпрд╛ рдЖрдк рдПрдХ рд╕реЗ рджрд╕ рддрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдЖрджрд┐ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЗрдЯрд┐рдВрдЧ рдкреИрдорд╛рдиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред 1, 5 рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрджреНрдзрд░рдг рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдмрд╛рдЗрдирд░реА, рдФрд░ рд▓реЗрдЦреЛрдВ рдФрд░ рдлреЛрдЯреЛрдЧреНрд░рд╛рдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд┐рдо рд░реЗрдЯрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрд╣реЗрдВ, рдмрд╛рдЗрдирд░реА рдкреНрд▓рд╕-рдорд╛рдЗрдирд╕ рдкрд╕рдВрдж рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрддрд┐рдо рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд▓рд╕рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдорд╛рдЗрдирд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╡реЛрдЯреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ (рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╕рдВрдж) рд╕реЗ рдкреНрд▓рд╕рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрдкрд╛рддред рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрдХрдЧрдгрд┐рдд рдорд╛рдзреНрдп, рд╣рд╛рд░реНрдореЛрдирд┐рдХ рдорд╛рдзреНрдп, рдлрд╝реИрд╢рди рдпрд╛ рдорд╛рдзреНрдпрд┐рдХрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред



рдЬреЛ рд╡рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рддрд░рдл, рд░реЗрдЯрд┐рдВрдЧ рд╕реНрдХреЗрд▓, рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рдЕрдВрддрд┐рдо рд░реЗрдЯрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐, рдореВрд▓реНрдпрд╛рдВрдХрди рд░рдгрдиреАрддрд┐ рдХрд╣рд▓рд╛рдПрдЧреАред рдЪрд▓рд┐рдП Rating_Strategy рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ :



 interface Rating_Strategy { /** * @return array of float */ public function getRatingOptions(); /** * @param Rating_Vote_Collection $votes * @return float */ public function getAggregatedOpinion(Rating_Vote_Collection $votes); }
      
      







рдлреНрд▓реЛрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ? рдпрд╣ рд╣рдореЗрдВ рдЕрд╕рддрдд рдореВрд▓реНрдпрд╛рдВрдХрди рддрд░рд╛рдЬреВ (рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ), рдФрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреИрдорд╛рдиреЗ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдЧреНрд░реЗрдб рдкреВрд░реНрдгрд╛рдВрдХ рдкреИрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1 рд╕реЗ 10 рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ рдФрд░ рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрд░реНрде рд▓реЗрдВ)ред рдлреНрд▓реЛрдЯ рдХрд╛ рдЪрдпрди рд╣рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред рдХреНрд░рдорд╢рдГ рд░реЗрдЯрд┐рдВрдЧ_Vote рд╡рд░реНрдЧ рдореЗрдВ рд░рд╛рдп рдлрд╝реАрд▓реНрдб рднреА рдПрдХ рдлрд╝реНрд▓реЛрдЯ рд╣реИред



Rating_Vote_Collection рд╡рд░реНрдЧ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, Rating_Vote рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ - рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рд╡реЛрдЯреЛрдВ рдХрд╛ рд╕реЗрдЯред рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдХреЗрд╡рд▓ рд╕рд░рдгреА Rating_Vote рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡реЛрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рд╣рдЬрд╛рд░ - рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрди рд╕рднреА рдХреЛ рд░реИрдо рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛, рдЕрдВрддрд┐рдо рдЧреНрд░реЗрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡реЛрдЯреЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, Rating_Vote_Collection рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдЗрд╕реА getOpinionCounts рд╡рд┐рдзрд┐ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рдкреНрд░рдкрддреНрд░ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рдПрдЧрд╛: [+1 тЖТ 100, тИТ1 тЖТ 50] (100 "рдЕрдЪреНрдЫрд╛", 50 "рдмреБрд░рд╛")ред рд▓реЗрдХрд┐рди рд╣рдо рдЖрд▓рд╕реА-рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рд╣рдо рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд░рдгрдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорддрджрд╛рддрд╛рдУрдВ рдХреЛ рд╡рдЬрди, рдорддрджрд╛рддрд╛рдУрдВ рдХреЗ рдХрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░)ред



рдореВрд▓реНрдпрд╛рдВрдХрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:



 abstract class Rating_Strategy_Binary implements Rating_Strategy { const GOOD = +1; const BAD = -1; public function getRatingOptions() { return array(self::GOOD, self::BAD); } } class Rating_Strategy_Binary_Subtraction extends Rating_Strategy_Binary { public function getAggregatedOpinion(Rating_Vote_Collection $votes) { $counts = $votes->getOpinionCounts(); $good = isset($counts[self::GOOD]) ? $counts[self::GOOD] : 0; $bad = isset($counts[self::BAD]) ? $counts[self::BAD] : 0; return $good - $bad; } } class Rating_Strategy_Binary_Rational extends Rating_Strategy_Binary { public function getAggregatedOpinion(Rating_Vote_Collection $votes) { $counts = $votes->getOpinionCounts(); $good = isset($counts[self::GOOD]) ? $counts[self::GOOD] : 0; $bad = isset($counts[self::BAD]) ? $counts[self::BAD] : 0; $total = $good + $bad; return ($total > 0) ? ($good / $total) : 0; } } abstract class Rating_Strategy_Range implements Rating_Strategy { private $min, $max; public function __construct($min, $max) { $this->min = $min; $this->max = $max; } public function getRatingOptions() { return range($this->min, $this->max); } } class Rating_Strategy_Range_Arithmetic extends Rating_Strategy_Range { public function getAggregatedOpinion(Rating_Vote_Collection $votes) { $counts = $votes->getOpinionCounts(); $sum = 0; $total_count = 0; foreach ($counts as $value => $count) { $sum += $value * $count; $total_count += $count; } return ($total_count > 0) ? ($sum / $total_count) : 0; } }
      
      







рдпрд╣ Rating_Ratable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП getRatingStrategy рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:



 interface Rating_Ratable { /** * @return Rating_Object */ public function asRatingObject(); /** * @return Rating_Strategy */ public function getRatingStrategy(); } class Article extends ActiveRecord implements Rating_Ratable { public function setTableDefinition() { $this->hasReferenceColumn("rating_object_id"); } public function setUp() { $this->hasOne("Rating_Object as rating_object", array("local" => "rating_object_id", "foreign" => "id")); } public function asRatingObject() { return $this->rating_object; } public function getRatingStrategy() { return new Rating_Strategy_Range_Arithmetic(1, 5); } }
      
      







рдФрд░ Rating_Object рд╡рд░реНрдЧ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд Rating_Vote рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред



рдЕрдм рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЖрд╡рд╛рдЬрд╝реЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╡рд░реНрддрдорд╛рди рд░реЗрдЯрд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:



 $article->asRatingObject()->addVote($user->asRatingSubject(), 5); echo $article->getRatingStrategy()->getAggregatedOpinion($article->asRatingObject()->getVotes());
      
      






All Articles