Magento рдХреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдорд╛рдг - рд╢реБрд░реБрдЖрддреА рдЧрд╛рдЗрдб

рдореИрдЧреЗрдВрдЯреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╡рд╛рд▓;) ┬й jeje


рдореИрдЧреЗрдВрдЯреЛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реНрдЯреЛрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдХрдИ рд▓реЗрдЦреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ "рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ", рдпрд╣ рдмрддрд╛рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рдпрд╛ рдЙрд╕ рдХрджрдо рдХреЛ рдХреНрдпреЛрдВ рдЙрдард╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдирддреАрдЬрддрди, рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░реАрдореЗрдХ рдХрд░рдирд╛ рднреА рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдбреАрдПрд╕ рдиреНрдпреВрдЬрд╝ рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрджрдо рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХрджрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдбреАрдПрд╕ рдирд╛рдорд╕реНрдерд╛рди рд╣реИ рдФрд░ рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╣реИред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рддрд╛рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдШрд░реНрд╖ рдХрд╛ рдбрд░ рди рд╣реЛред рдореИрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ - рдиреЛрдбреНрд╕ рдХреЗ рдирд╛рдо рдФрд░ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛ рд╕рдордЭрд╛рдиреЗ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЦреБрдж рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдореИрдиреБрдЕрд▓ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдХрд┐рди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрджрд┐ ... рдпрд╣ рдХреЗрд╡рд▓ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╣реИред

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

рдЪрд░рдг 1. рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛
рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдПрдХ рдиреНрдпреВрдирддрдо рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдХреЛрдб / рд╕реНрдерд╛рдиреАрдп / рдбреАрдПрд╕ / рд╕рдорд╛рдЪрд╛рд░ рдмрдирд╛рдПрдВ
  2. рдЖрджрд┐ рдмрдирд╛рдПрдБ / config.xml рдлрд╝рд╛рдЗрд▓
    <?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.1</version> </DS_News> </modules> </config> 

  3. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдЕрдиреБрдкреНрд░рдпреЛрдЧ / etc / рдореЙрдбреНрдпреВрд▓ рдореЗрдВ DS_News.xml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
     <?xml version="1.0" ?> <config> <modules> <DS_News> <active>true</active> <codePool>local</codePool> </DS_News> </modules> </config> 



рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, DS_News рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рд┐рд╕реНрдЯрдо / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рдЙрдиреНрдирдд / рдЙрдиреНрдирдд / рдЙрдиреНрдирдд / рдЕрдХреНрд╖рдо рдореЙрдбреНрдпреВрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рддрд╣рдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд░рдг 1 рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдХреЛрдб / рд╕реНрдерд╛рдиреАрдп / рдбреАрдПрд╕ / рд╕рдорд╛рдЪрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореБрдЦреНрдп рдХреЛрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдореЙрдбрд▓, рдирд┐рдпрдВрддреНрд░рдХ, рд╕рд╣рд╛рдпрдХ, рдЖрджрд┐ ... рдЪрд░рдг 2 рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрджрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдореБрдЦреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ config.xml рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреИрд░рд╛ 3 рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдкрдВрдЬреАрдХрд░рдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ 3 рд╣реИ - рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред DS_News.xml рдлрд╝рд╛рдЗрд▓ рдирд╛рдо / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / etc / рдореЙрдбреНрдпреВрд▓ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ - рдЬрдм рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рднреА XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХрдИ рдЗрдВрдЯрд░рдХрдиреЗрдХреНрдЯреЗрдб рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Xml рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ DS_News рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: [рдирд╛рдо рд╕реНрдерд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо] _ [рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо] ред рдЗрд╕ рдирд╛рдордХрд░рдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд░реЛрдВ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдо рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо * рдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

/App/etc/modules/DS_News.xml рдлрд╝рд╛рдЗрд▓ рджреЛ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ: рд╕рдХреНрд░рд┐рдп рдФрд░ рдХреЛрдбрдкреВрд▓ ред рдкрд╣рд▓рд╛ рдЯреИрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдХреЛрдб / : рдХреЛрд░ (рд╕рд┐рд╕реНрдЯрдо рдХреЛрд░), рд╕рдореБрджрд╛рдп (Magento рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдореЙрдбреНрдпреВрд▓) рдпрд╛ рд╕реНрдерд╛рдиреАрдп (рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдореЙрдбреНрдпреВрд▓) рдореЗрдВ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╣реИред



рдЪрд░рдг 2. рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдЪрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Magento рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

  1. Sql / dsnews_setup / install-0.0.1.php рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
     <?php die('DS News module setup'); $installer = $this; $installer->startSetup(); $installer->run("CREATE TABLE ds_news_entities ( `news_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `created` DATETIME, PRIMARY KEY (`news_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); $installer->endSetup(); 

  2. Etc / config.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ:
     <?xml version="1.0" ?> <config> <modules> ... </modules> <global> <resources> <dsnews_setup> <setup> <module>DS_News</module> </setup> </dsnews_setup> </resources> </global> </config> 



рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╛рдЗрдЯ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдбреАрдПрд╕ рдиреНрдпреВрдЬ рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯрдЕрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЗрдВрд╕реНрдЯреЙрд▓-0.0.1.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд░рдиреЗ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореЙрдбреНрдпреВрд▓ рдХреЛ core_resource рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ ds_news_entities рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред

рдпрджрд┐ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдореЙрдбреНрдпреВрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ SQL рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ core_resource рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ dsnews_setup рд╕рдВрд╕рд╛рдзрди рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 DELETE FROM `core_resource` WHERE `code` = 'dsnews_setup'; 


Config.xml рдореЗрдВ dsnews_setup рдиреЛрдб рдирд╛рдо рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдиреЛрдб рдХрд╛ рдирд╛рдо рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдиреЛрдб рдХрд╛ рдирд╛рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд╛рдо core_resource рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реНрдерд╛рдкрдирд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ- [рд╕рдВрд╕реНрдХрд░рдг]ред [php | sql] , рдФрд░ рдЕрджреНрдпрддрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрдЧреНрд░реЗрдб рд╣реИ- [рд╕рдВрд╕реНрдХрд░рдг-рд╕реЗ] - [рд╕рдВрд╕реНрдХрд░рдг-рд╕реЗ]ред [php | sql] рдЖрдк Mage_Core_Model_Resource_Setup рд╡рд░реНрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдирд╛рдо рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред



рдЪрд░рдг 3. config.xml рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЪреВрдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрдЧрд╛, рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕реНрдерд╛рдкрдирд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ etc / config.xml рдлрд╝рд╛рдЗрд▓, рд╕рд╛рде рд╣реА sql / dsnews_setup / install-0.0.1.php рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛

  1. рдЖрджрд┐ / config.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рдиреЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рд╡реИрд╢реНрд╡рд┐рдХ / рдореЙрдбрд▓ / рдмрдирд╛рдПрдБ
     <?xml version="1.0" ?> <config> ... <global> <models> <dsnews> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <entities> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> <resources> ... </resources> </global> </config> 

  2. SQL / dsnews_setup / install-0.0.1.php рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
     <?php $installer = $this; $tableNews = $installer->getTable('dsnews/table_news'); die($tableNews); $installer->startSetup(); $installer->getConnection()->dropTable($tableNews); $table = $installer->getConnection() ->newTable($tableNews) ->addColumn('news_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( 'identity' => true, 'nullable' => false, 'primary' => true, )) ->addColumn('title', Varien_Db_Ddl_Table::TYPE_TEXT, '255', array( 'nullable' => false, )) ->addColumn('content', Varien_Db_Ddl_Table::TYPE_TEXT, null, array( 'nullable' => false, )) ->addColumn('created', Varien_Db_Ddl_Table::TYPE_DATETIME, null, array( 'nullable' => false, )); $installer->getConnection()->createTable($table); $installer->endSetup(); 



рдпрджрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ ds_news_entities рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрдк рдорд░рдиреЗ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдХреБрдЫ SQL рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ core_resource рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рд╕рдВрд╕рд╛рдзрди рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

 DELETE FROM `core_resource` WHERE `code` = 'dsnews_setup'; 


SQL рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереА, рддреЛ рдореМрдЬреВрджрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд▓реЛрдкрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдкрдирд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЕрдореВрд░реНрдд рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕рд╛рд░ рдХрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬреЛ MySQL рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред

Dsnews рдореЙрдбрд▓ рдиреЛрдб рдХрд╛ рдирд╛рдо, рд╕рд╛рде рд╣реА dsnews_resource рдореЙрдбрд▓ рд╕рдВрд╕рд╛рдзрди рдиреЛрдб рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ / рд╡реИрд╢реНрд╡рд┐рдХ / рдореЙрдбрд▓ / рдореЗрдВ рд╕реНрдерд┐рдд рдирд╛рдо рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ / рдкреНрд░рдгрд╛рд▓реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдиреЛрдб рдирд╛рдо рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╣реИред

рдкреИрд░рд╛рдЧреНрд░рд╛рдл 2 рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХреЛрдб рдХреЗ рдЕрдВрджрд░, рдлрд╝рдВрдХреНрд╢рди $ рдЗрдВрд╕реНрдЯреЙрд▓рд░-> getTable ('dsnews / table_news') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд╛рдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИред
[рдореЙрдбрд▓ рдиреЛрдб рдХрд╛ рдирд╛рдо] / [рд╕рдВрд╕рд╛рдзрди рдХреА рдЗрдХрд╛рдИ рдиреЛрдб рдХрд╛ рдирд╛рдо] ред Magento рдХреЗ рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдбреЗрдЯрд╛рдмреЗрд╕ рдиреЛрдб рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрди рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореЙрдбрд▓ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрди рдореЙрдбрд▓ рдХреЗ рдиреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ ред



рдЪрд░рдг 4. рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪ
рдЕрдм рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рд╢рд┐рд▓рд╛рд▓реЗрдЦ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред

  1. рдлреНрд░рдВрдЯреЗрдВрдб рд╕реЗрдХреНрд╢рди рдХреЛ etc / config.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
     <?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> <routers> <dsnews> <use>standard</use> <args> <module>DS_News</module> <frontName>news</frontName> </args> </dsnews> </routers> </frontend> <global> ... </global> </config> 

  2. рдлрд╝рд╛рдЗрд▓ рдирд┐рдпрдВрддреНрд░рдХ / IndexController.php рдмрдирд╛рдПрдБ
     <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo '<h1>News</h1>'; } } 



рдЕрдм " http://site.com/news/ " рд╢рдмреНрдж рдкрд░ "рд╕рдорд╛рдЪрд╛рд░" рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред

Config / frontend / routers / рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдерд┐рдд dsnews рдиреЛрдб рдХрд╛ рдирд╛рдо рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЕрдиреНрдп рд░рд╛рдЙрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рдирд╛рдо рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлреНрд░рдВрдЯрдиреЗрдо рдиреЛрдб рдХрд╛ рдореВрд▓реНрдп рд╣реИ - рдЗрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╡рд╛рдВрдЫрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрде рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: http: // [рд╕рд╛рдЗрдЯ] / [рд░рд╛рдЙрдЯрд░] / [рдХрдВрдЯреНрд░реЛрд▓рд░] / [рдПрдХреНрд╢рди] ред рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп, рдЖрдк [рдХреНрд░рд┐рдпрд╛] рдпрд╛ [рдирд┐рдпрдВрддреНрд░рдХ] / [рдХреНрд░рд┐рдпрд╛] рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд▓рд╛рдкрддрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрде http://site.com/news/ , http://site.com/news/index/ , http://site.com/news/index/index рд╕рдорддреБрд▓реНрдп рд╣реИрдВ - рд╡реЗ рдбреАрдПрд╕ рдиреНрдпреВрдЬрд╝ рдореЙрдбреНрдпреВрд▓, рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ IndexController рдФрд░ indexAction рдХрд╛рд░реНрд░рд╡рд╛рдИред



рдЪрд░рдг 5. рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЬрд╛рдирдХрд╛рд░реА рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

  1. рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ / app/design/frontend/ Ispackage[/ Istheme file / template/ ds_news/index.phtml
     <h1>Template ds_news/index.phtml</h1> 

  2. рдкреГрд╖реНрда рд▓реЗрдЖрдЙрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ / app/design/frontend/ Ispackageapter/ IsthemeтАа/layout/ds_news.xml рдмрдирд╛рдПрдВ
     <?xml version="1.0" ?> <layout> <dsnews_index_index> <reference name="content"> <block type="core/template" template="ds_news/index.phtml" /> </reference> </dsnews_index_index> </layout> 

  3. рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЖрджрд┐ / config.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
     <?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> <layout> <updates> <dsnews> <file>ds_news.xml</file> </dsnews> </updates> </layout> <routers> ... </routers> </frontend> <global> ... </global> </config> 

  4. рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рдпрдВрддреНрд░рдХ / IndexController.php рдмрджрд▓реЗрдВ
     <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $this->renderLayout(); } } 



рдЕрдм рдкрде http://site.com/news/ рдХреЗ рд╕рд╛рде , рд╕рд╛рдЗрдЯ рдкреГрд╖реНрда рдХреЛ рд╕рднреА рдмреНрд▓реЙрдХ (рд╣реЗрдбрд░, рдлреБрдЯрд░, рд╕рд╛рдЗрдбрдмрд╛рд░) рдХреЗ рд╕рд╛рде рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдХрдВрдЯреЗрдВрдЯ рдкрд░ "рдЯреЗрдореНрдкрд▓реЗрдЯ ds_news / index.phtml" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдереАрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА / рдРрдк / рдбрд┐рдЬрд╝рд╛рдЗрди / рдлреНрд░рдВрдЯрдПрдВрдб / [рдкреИрдХреЗрдЬ] / / рдереАрдо] рдореЗрдВ рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред Magento рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдореВрд▓ рдереАрдо / рдРрдк / рдбрд┐рдЬрд╝рд╛рдЗрди / рдлреНрд░рдВрдЯрдПрдВрдб / рдмреЗрд╕ / рдФрд░ / рдРрдк / рдбрд┐рдЬрд╝рд╛рдЗрди / рдлреНрд░рдВрдЯреЗрдВрдб / рдбрд┐рдлрд╝реЙрд▓реНрдЯ / рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреБрдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рд╡рд┐рд╖рдп рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ Magento рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдореВрд▓ рдереАрдо рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ $ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реИ-> рд▓реЛрдбрд▓реИрдЯрдЖрдЙрдЯ () рдХрдВрдЯреНрд░реЛрд▓рд░ рдПрдХреНрд╢рди рдореЗрдВ, рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ рд▓реЗрдЖрдЙрдЯ рдмрджрд▓реЗ рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣реИрдВрдбрд▓ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЛ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдореЗрдВ рд╕реЗ рдПрдХ рдирд╛рдо [рд░рд╛рдЙрдЯрд░] _ [рдХрдВрдЯреНрд░реЛрд▓рд░] _ [рдПрдХреНрд╢рди] рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ [рд░рд╛рдЙрдЯрд░] рдХреЙрдиреНрдлрд┐рдЧ / рдлреНрд░рдВрдЯреЗрдВрдб / рд░рд╛рдЙрдЯрд░ / [рд░рд╛рдЙрдЯрд░] рдиреЛрдб рдХрд╛ рдирд╛рдо рд╣реИред

рдХреНрд▓реЙрдЬ 2 рд╣рдорд╛рд░реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ / рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рд╣реИрдВрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: dsnews_index_index , рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдХреЛрд░ / рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ dsnews / index.phtml рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХреНрд▓реИрдЯ 3 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓реЙрдЬ 3 рдореЗрдВ, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП config / frontend / рд▓реЗрдЖрдЙрдЯ / рд╕реЗрдХреНрд╢рди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрдбреЗрдЯ , рдЬреЛ рд╡рд┐рд╖рдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдереАрдо рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд▓реЗрдЖрдЙрдЯ рд╣реИрдВрдбрд▓ рдХреЛ рдлрд╝рд╛рдЗрд▓ / app / design / frontend / Ispackageapter / IsthemeтАа / layout-local.xml , рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕рднреА рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ config.xml рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рд▓реЗрдЖрдЙрдЯ рд╣реИрдВрдбрд▓ рдХрд╛ рд╕рд╣реА рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $layoutHandles = $this->getLayout()->getUpdate()->getHandles(); echo '<pre>' . print_r($layoutHandles, true) . '</pre>'; } } 

рдирддреАрдЬрддрди, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 рд╕рд░рдгреА
 (
     [реж] => рдбрд┐рдлрд╝реЙрд▓реНрдЯ
     [рез] => STORE_default
     [реи] => THEME_frontend_ [рдкреИрдХреЗрдЬ] _ [рд╡рд┐рд╖рдп]
     [рей] => dsnews_index_index
     [рек] => customer_logged_out
 )




рдЪрд░рдг 6. рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕реАрдзреЗ рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдЪрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗ:

  1. рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдЪрд╛рд░ рдЬреЛрдбрд╝реЗрдВ:
     INSERT INTO `ds_news_entities` VALUES (NULL, 'News 1', 'News 1 Content', '2013-10-16 17:45'), (NULL, 'News 2', 'News 2 Content', '2013-11-07 04:12'), (NULL, 'News 3', 'News 3 Content', '2014-01-12 15:55'); 

  2. рдЯреЗрдореНрдкреНрд▓реЗрдЯ / app/design/frontend/ Ispackage[/ Isthemet/ template/ dsnews/index.phtml рдмрджрд▓реЗрдВ
     <h1>News</h1> <?php $news = Mage::registry('news'); foreach ($news as $item) { echo '<h2>' . $item['title'] . '</h2>'; } 

  3. рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рдпрдВрддреНрд░рдХ / IndexController.php рдмрджрд▓реЗрдВ
     <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $resource = Mage::getSingleton('core/resource'); $read = $resource->getConnection('core_read'); $table = $resource->getTableName('dsnews/table_news'); $select = $read->select() ->from($table, array('news_id', 'title', 'content', 'created')) ->order('created DESC'); $news = $read->fetchAll($select); Mage::register('news', $news); $this->loadLayout(); $this->renderLayout(); } } 



рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзрд╛ рдЕрдиреБрд░реЛрдз рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╕рдорд╛рдЪрд╛рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Mage :: рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░, рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрдард┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рд╣реИред

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



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

  1. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рдиреЛрдб рдореЗрдВ рдХреНрд▓рд╛рд╕ рдиреЛрдб рдЬреЛрдбрд╝реЗрдВ:
     <?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> ... </frontend> <global> <models> <dsnews> <class>DS_News_Model</class> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <class>DS_News_Model_Resource</class> <entities> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> <resources> ... </resources> </global> </config> 

  2. рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдореЙрдбрд▓ / News.php рдмрдирд╛рдПрдБ
     <?php class DS_News_Model_News extends Mage_Core_Model_Abstract { public function _construct() { parent::_construct(); $this->_init('dsnews/news'); } } 

  3. рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбрд▓ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдореЙрдбрд▓ / рд╕рдВрд╕рд╛рдзрди / News.php рдмрдирд╛рдПрдБ
     <?php class DS_News_Model_Resource_News extends Mage_Core_Model_Mysql4_Abstract { public function _construct() { $this->_init('dsnews/table_news', 'news_id'); } } 

  4. рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдореЙрдбрд▓ / рд╕рдВрд╕рд╛рдзрди / рд╕рдорд╛рдЪрд╛рд░ / Collection.php рдмрдирд╛рдПрдБ
     <?php class DS_News_Model_Resource_News_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract { public function _construct() { parent::_construct(); $this->_init('dsnews/news'); } } 

  5. рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рдпрдВрддреНрд░рдХ / IndexController.php рдмрджрд▓реЗрдВ
     <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $news = Mage::getModel('dsnews/news')->getCollection()->setOrder('created', 'DESC'); $viewUrl = Mage::getUrl('news/index/view'); echo '<h1>News</h1>'; foreach ($news as $item) { echo '<h2><a href="' . $viewUrl . '?id=' . $item->getId() . '">' . $item->getTitle() . '</a></h2>'; } } public function viewAction() { $newsId = Mage::app()->getRequest()->getParam('id', 0); $news = Mage::getModel('dsnews/news')->load($newsId); if ($news->getId() > 0) { echo '<h1>' . $news->getTitle() . '</h1>'; echo '<div class="content">' . $news->getContent() . '</div>'; } else { $this->_forward('noRoute'); } } } 



рдЕрдм рд▓рд┐рдВрдХ http://site.com/news рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдЪрд╛рд░ рдХреА рд╕реВрдЪреА рдЦреЛрд▓реЗрдЧрд╛, рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕ рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╡рд╛рд▓рд╛ рдПрдХ рдкреГрд╖реНрда рдЦреБрд▓реЗрдЧрд╛ред

рдЪрд░рдг 1 рдореЗрдВ, рдХреНрд▓рд╛рд╕ рдиреЛрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ DS_News_Model рдореЙрдбрд▓ рдФрд░ DS_News_Model_Resource рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд░реНрдЧ рдЙрдкрд╕рд░реНрдЧ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдХ (рдордж 5) рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп :: getModel ('dsnews / news') , getModel рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ [рдореЙрдбрд▓] / [рд╡рд░реНрдЧ] рдЬрд┐рд╕рд╕реЗ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдмрдирддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ [рдореЙрдбрд▓] рдХреЙрдиреНрдлрд┐рдЧ рдиреЛрдб рдХрд╛ рдирд╛рдо рд╣реИред / рд╡реИрд╢реНрд╡рд┐рдХ / рдореЙрдбрд▓ / [рдореЙрдбрд▓] , рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╡рд░реНрдЧ рдиреЛрдб рдХрд╛ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - DS_News_Model , рдФрд░ рдорд╛рди [рд╡рд░реНрдЧ] рдХреЛ рдЗрд╕ рд╡рд░реНрдЧ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдореЗрдВ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ [рд╡рд░реНрдЧ] рдкреВрдВрдЬреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DS_News_Model_News рд╡рд░реНрдЧ dsnews / рд╕рдорд╛рдЪрд╛рд░ рд▓рд╛рдЗрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ DS_News_Model_News_Gallery рд╡рд░реНрдЧ dsnews / news_gallery рд▓рд╛рдЗрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦрдгреНрдб 2 рдореЗрдВ, рдмреБрдирд┐рдпрд╛рджреА DS_News_Model_News рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдВрд╕рд╛рдзрди $ рдпрд╣ -> _ init ('dsnews / рд╕рдорд╛рдЪрд╛рд░') рдЖрд░рдВрднрд┐рдХ рд╣реИ: рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ [рдореЙрдбрд▓] / [рд╡рд░реНрдЧ] рд▓реЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ [рдореЙрдбрд▓] рдиреЛрдб рдХрд╛ рдирд╛рдо рд╣реИред рдХреЙрдиреНрдлрд┐рдЧ / рдЧреНрд▓реЛрдмрд▓ / рдореЙрдбрд▓ / [рдореЙрдбрд▓] , рдФрд░ [рдХреНрд▓рд╛рд╕] рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЙрдбрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдВрд╕рд╛рдзрди рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдЙрдкрд╕рд░реНрдЧ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рд╡реИрд╢реНрд╡рд┐рдХ / рдореЙрдбрд▓ / [resourceModel] рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ / рд╕рдВрд╕рд╛рдзрди рдХреЗ рдореЙрдбрд▓ рдиреЛрдб рдХрд╛ рд╕рдВрд╕рд╛рдзрди Model рдиреЛрдб рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЬрдм рд╕рдВрд╕рд╛рдзрди $ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реИ -> _ init ('dsnews / news') , DS_News_Model_Resource_News рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЪрд░рдг 3 рдореЗрдВ, рд╕рдВрд╕рд╛рдзрди рд╡рд░реНрдЧ DS_News_Model_Resource_News рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ $ рдЗрд╕ -> _ init ('dsnews / table_news', 'news_id') рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ : рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рдВрдЫрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд╛рдо рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝реАрд▓реНрдб рд╣реИред рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА) рдЯреЗрдмрд▓ред

рдХреНрд▓реЙрдЬ 4 рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд▓реЗрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдореЙрдбрд▓ DS_News_Model_News рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛрддрд╛ рд╣реИред

рдкреИрд░рд╛рдЧреНрд░рд╛рдл 5 рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп, рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред IndexAction рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рднреА рд╕рдорд╛рдЪрд╛рд░ $ рд╕рдорд╛рдЪрд╛рд░ = Mage :: getModel ('dsnews / news') -> getCollection () рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдЧреНрд░рд╣ рд╡рд░реНрдЧ рдирд╛рдо рдХреА рдЧрдгрдирд╛ DS_News_Model_Resource_News + _Collection рдореЙрдбрд▓ рд╕рдВрд╕рд╛рдзрди рд╡рд░реНрдЧ рдирд╛рдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред

рд╡реНрдпреВрдЕрдХреНрд╢рди рдПрдХреНрд╢рди рдореЗрдВ, рд╕рдорд╛рдЪрд╛рд░ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЖрдИрдбреА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдЪрд╛рд░ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдкреГрд╖реНрда 404 рдЙрддреНрдкрдиреНрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред



рдЪрд░рдг 8. рдмреНрд▓реЙрдХ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
Magento рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдпреЗ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЪрд░рдг 5 рдореЗрдВ: рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдорд╛рдирдХ рдХреЛрд░ / рдЯреЗрдореНрдкрд▓реЗрдЯ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдорд╛рдЪрд╛рд░ рдХреА рд╕реВрдЪреА рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред

  1. рдмреНрд▓реЙрдХ рдиреЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рд╡реИрд╢реНрд╡рд┐рдХ / рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗрдВ
     <?xml version="1.0" ?> <config> ... <global> <blocks> <dsnews> <class>DS_News_Block</class> </dsnews> </blocks> ... </global> </config> 

  2. рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рд╕реВрдЪреА рдмрдирд╛рдПрдВ рдмреНрд▓реЙрдХ рд╡рд░реНрдЧ рдмреНрд▓реЙрдХ / News.php
     <?php class DS_News_Block_News extends Mage_Core_Block_Template { public function getNewsCollection() { $newsCollection = Mage::getModel('dsnews/news')->getCollection(); $newsCollection->setOrder('created', 'DESC'); return $newsCollection; } } 

  3. рд╕рдорд╛рдЪрд╛рд░ рд╕рд╛рдордЧреНрд░реА рдмреНрд▓реЙрдХ рдХреНрд▓рд╛рд╕ рдмреНрд▓реЙрдХ рдмрдирд╛рдПрдВ / View.php
     <?php class DS_News_Block_View extends Mage_Core_Block_Template { } 

  4. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ / app /design/frontend/ Ispackage[/ Isthemelay/layout/ds_nns.s.ml
     <layout> <dsnews_index_index> <reference name="content"> <block type="dsnews/news" template="ds_news/index.phtml" /> </reference> </dsnews_index_index> <dsnews_index_view> <reference name="content"> <block type="dsnews/view" name="news.content" template="ds_news/view.phtml" /> </reference> </dsnews_index_view> </layout> 

  5. рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ / app/design/frontend/ IspackageтАа/ Istheme file / template/ ds_news/index.phtml рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
     <?php $news = $this->getNewsCollection(); $newsViewUrl = Mage::getUrl('news/index/view'); ?> <h1>News</h1> <?php foreach ($news as $item): ?> <h2> <a href="<?php echo $newsViewUrl; ?>?id=<?php echo $item->getId(); ?>"> <?php echo $item->getTitle(); ?> </a> </h2> <?php endforeach; ?> 

  6. рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ / app/design/frontend/ Ispackageapter/ IsthemeтАа/ template/ ds_news/view.phtml
     <h1><?php echo $newsItem->getTitle(); ?></h1> <div class="content"><?php echo $newsItem->getContent(); ?></div> 

  7. рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рдпрдВрддреНрд░рдХ / IndexController.php рдмрджрд▓реЗрдВ
     <?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $this->renderLayout(); } public function viewAction() { $newsId = Mage::app()->getRequest()->getParam('id', 0); $news = Mage::getModel('dsnews/news')->load($newsId); if ($news->getId() > 0) { $this->loadLayout(); $this->getLayout()->getBlock('news.content')->assign(array( "newsItem" => $news, )); $this->renderLayout(); } else { $this->_forward('noRoute'); } } } 



рдЬрдм рдЖрдк рдкреГрд╖реНрда http://site.com/news/ рдЦреЛрд▓рддреЗ рд╣реИрдВ , рддреЛ рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рд╕реВрдЪреА рдЕрдм рд╕рд╛рдЗрдЯ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рд╕рдорд╛рдЪрд╛рд░ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдЦреБрд▓ рдЬрд╛рдПрдЧрд╛ред

рдмреНрд▓реЙрдХ рддрдВрддреНрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкреИрд░рд╛рдЧреНрд░рд╛рдл 3 рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕рдПрдХреНрд╢рди рдПрдХреНрд╢рди рдЕрдм рдХреЗрд╡рд▓ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗрд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдЕрдм DS_News_Block_News рдмреНрд▓реЙрдХ, рдФрд░ / app/design/frontend/ Ispackageapter/ IsthemeтАа/ template/ dsnews/index.phtml рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдорд╛рдЪрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреГрд╖реНрда рдХреЗ рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рдВрдЫрд┐рдд рдмреНрд▓реЙрдХ рдХреЛ рдкреЗрдЬ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдЗрд╕ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд▓реЙрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд / рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рдмреНрд▓реЙрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

1 , Magento . , (type) .xml . type [module]/[block] , [module] тАФ config/global/blocks/[module] , class ; a [block] тАФ . type=┬лdsnews/news┬╗ DS_News_Block_News .

4 <reference name=┬лcontent┬╗ . , , . layout handle dsnews_index_view , <block type=┬лdsnews/view┬╗ name=┬лnews.content┬╗ template=┬лds_news/view.phtml┬╗ /> . viewAction assign , . .



рдЪрд░рдг 9. рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдмрдирд╛рдирд╛
, , - . .

  1. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { echo '<h1>News Module: Admin section</h1>'; } } 

  2. etc/config.xml
     <?xml version="1.0" ?> <config> ... <admin> <routers> <dsnews_admin> <use>admin</use> <args> <module>DS_News</module> <frontName>dsnews_admin</frontName> </args> </dsnews_admin> </routers> </admin> ... </config> 

  3. , etc/config.xml
     <?xml version="1.0" ?> <config> ... <adminhtml> <menu> <dsnews module="dsnews"> <title>News</title> <sort_order>77</sort_order> <action>dsnews_admin/adminhtml_news</action> </dsnews> </menu> </adminhtml> ... </config> 

  4. - Helper/Data.php
     <?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { } 

  5. etc/config.xml
     <?xml version="1.0" ?> <config> ... <global> ... <helpers> <dsnews> <class>DS_News_Helper</class> </dsnews> </helpers> ... </global> ... </config> 



, , News , ┬лNews Module: Admin section┬╗ .

1 , 2 тАФ config/admin/routers/[router] . , http://site.com/index.php/[frontName]/[controller]/index/ , [frontName] тАФ config/admin/routers/[router]/args/[frontName] , [controller] тАФ , DS_News + [controller] + Controller . adminhtml_news DS_News_Adminhtml_NewsController . http://site.com/index.php/dsnews_admin/adminhtml_news/index/ .

, Magento - . , . 3 , .

4 5, , ┬лWarning: include(Mage\DS\News\Helper\Data.php): failed to open stream: No such file or directory...┬╗ . Magento , module config/adminhtml/menu/[menu] . config/global/helpers/[helper] , . 4 5 -, .

, тАФ frontName config/admin/routers config/frontend/routers .
( ), , HTTPS .



рдЪрд░рдг 10. рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
. .

  1. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $this->loadLayout(); $this->_setActiveMenu('dsnews'); $contentBlock = $this->getLayout()->createBlock('dsnews/adminhtml_news'); $this->_addContent($contentBlock); $this->renderLayout(); } } 

  2. Block/Adminhtml/News.php
     <?php class DS_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Abstract { public function _toHtml() { return '<h1>News Module: Admin section</h1>'; } } 



Magento , frontend ( ), backend () . .xml / ( 5: ┬л ┬╗), , - Magento, . HTML ┬л ┬╗ . , /app/design/adminhtml/default/default/ , , .. .

1 $this->loadLayout() . $this->getLayout() : // . createBlock [module]/[block] , <block type="[module]/[block]" ; .



рдЪрд░рдг 11. рдбреЗрдЯрд╛ рдЧреНрд░рд┐рдб рдореЗрдВ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
, .

  1. Block/Adminhtml/News.php
     <?php class DS_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Widget_Grid_Container { protected function _construct() { parent::_construct(); $helper = Mage::helper('dsnews'); $this->_blockGroup = 'dsnews'; $this->_controller = 'adminhtml_news'; $this->_headerText = $helper->__('News Management'); $this->_addButtonLabel = $helper->__('Add News'); } } 

  2. Block/Adminhtml/News/Grid.php
     <?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id' )); $this->addColumn('title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } } 



, 1 DS_News_Block_Adminhtml_News : [_blockGroup]/[_controller]_grid , _blockGroup тАФ config/global/blocks/[_blockGroup] . ┬лdsnews/adminhtml_news_grid┬╗ .

_prepareColumns , . addColumn , тАФ , index тАФ , type тАФ . Mage_Adminhtml_Block_Widget_Grid_Column .



рдЪрд░рдг 12. рдбреЗрдЯрд╛ рдЧреНрд░рд┐рдб рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдВрдЪрд╛рд▓рди


  1. Block/Adminhtml/News/Grid.php _prepareMassaction
     <?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns(){ ... } protected function _prepareMassaction() { $this->setMassactionIdField('news_id'); $this->getMassactionBlock()->setFormFieldName('news'); $this->getMassactionBlock()->addItem('delete', array( 'label' => $this->__('Delete'), 'url' => $this->getUrl('*/*/massDelete'), )); return $this; } } 

  2. massDeleteAction controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function massDeleteAction() { $news = $this->getRequest()->getParam('news', null); if (is_array($news) && sizeof($news) > 0) { try { foreach ($news as $id) { Mage::getModel('dsnews/news')->setId($id)->delete(); } $this->_getSession()->addSuccess($this->__('Total of %d news have been deleted', sizeof($news))); } catch (Exception $e) { $this->_getSession()->addError($e->getMessage()); } } else { $this->_getSession()->addError($this->__('Please select news')); } $this->_redirect('*/*'); } } 



. , Actions Delete Submit .

1 _prepareMassaction , id- news_id , , id-. тАФ , , . : . , . Mage_Adminhtml_Block_Catalog_Product_Grid .



рдЪрд░рдг 13. CRUD: рдЬреЛрдбрд╝реЗрдВ, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╣рдЯрд╛рдПрдВ
,

  1. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news')); $this->renderLayout(); } public function newAction() { $this->_forward('edit'); } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); Mage::register('current_news', Mage::getModel('dsnews/news')->load($id)); $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction() { if ($data = $this->getRequest()->getPost()) { try { $model = Mage::getModel('dsnews/news'); $model->setData($data)->setId($this->getRequest()->getParam('id')); if(!$model->getCreated()){ $model->setCreated(now()); } $model->save(); Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News was saved successfully')); Mage::getSingleton('adminhtml/session')->setFormData(false); $this->_redirect('*/*/'); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); Mage::getSingleton('adminhtml/session')->setFormData($data); $this->_redirect('*/*/edit', array( 'id' => $this->getRequest()->getParam('id') )); } return; } Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save')); $this->_redirect('*/*/'); } public function deleteAction() { if ($id = $this->getRequest()->getParam('id')) { try { Mage::getModel('dsnews/news')->setId($id)->delete(); Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News was deleted successfully')); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); $this->_redirect('*/*/edit', array('id' => $id)); } } $this->_redirect('*/*/'); } public function massDeleteAction(){ ... } } 

  2. getRowUrl Block/Adminhtml/News/Grid.php
     <?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns(){ ... } protected function _prepareMassaction(){ ... } public function getRowUrl($model) { return $this->getUrl('*/*/edit', array( 'id' => $model->getId(), )); } } 

  3. Block/Adminhtml/News/Edit.php
     <?php class DS_News_Block_Adminhtml_News_Edit extends Mage_Adminhtml_Block_Widget_Form_Container { protected function _construct() { $this->_blockGroup = 'dsnews'; $this->_controller = 'adminhtml_news'; } public function getHeaderText() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); if ($model->getId()) { return $helper->__("Edit News item '%s'", $this->escapeHtml($model->getTitle())); } else { return $helper->__("Add News item"); } } } 

  4. Block/Adminhtml/News/Edit/Form.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $form = new Varien_Data_Form(array( 'id' => 'edit_form', 'action' => $this->getUrl('*/*/save', array( 'id' => $this->getRequest()->getParam('id') )), 'method' => 'post', 'enctype' => 'multipart/form-data' )); $this->setForm($form); $fieldset = $form->addFieldset('news_form', array('legend' => $helper->__('News Information'))); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, 'name' => 'content', )); $fieldset->addField('created', 'date', array( 'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT), 'image' => $this->getSkinUrl('images/grid-cal.gif'), 'label' => $helper->__('Created'), 'name' => 'created' )); $form->setUseContainer(true); if($data = Mage::getSingleton('adminhtml/session')->getFormData()){ $form->setValues($data); } else { $form->setValues($model->getData()); } return parent::_prepareForm(); } } 



Data Grid , Add News тАФ .

1 new , edit , save delete , . new edit , new edit . , ( , ), . save
$model->setData($data)->setId(...) тАФ , .. , setData . , .

2 Data Grid тАФ . 3 , , [_blockGroup]/[_controller]_[_mode]_form , dsnews/adminhtml_news_edit_form ( _mode edit ).

. , new Varien_Data_Form id HTML id , .. JavaScript-, . , name .



рдЪрд░рдг 14. рдЯреИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
, TAB-.

  1. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/news'); if($data = Mage::getSingleton('adminhtml/session')->getFormData()){ $model->setData($data)->setId($id); } else { $model->load($id); } Mage::register('current_news', $model); $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addLeft($this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs')); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction(){ ... } public function deleteAction() { ... } public function massDeleteAction(){ ... } } 

  2. Block/Adminhtml/News/Edit/Tabs.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct() { $helper = Mage::helper('dsnews'); parent::__construct(); $this->setId('news_tabs'); $this->setDestElementId('edit_form'); $this->setTitle($helper->__('News Information')); } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs_general')->toHtml(), )); $this->addTab('custom_section', array( 'label' => $helper->__('Custom Fields'), 'title' => $helper->__('Custom Fields'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs_custom')->toHtml(), )); return parent::_prepareLayout(); } } 

  3. Block/Adminhtml/News/Edit/Form.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $form = new Varien_Data_Form(array( 'id' => 'edit_form', 'action' => $this->getUrl('*/*/save', array( 'id' => $this->getRequest()->getParam('id') )), 'method' => 'post', 'enctype' => 'multipart/form-data' )); $form->setUseContainer(true); $this->setForm($form); return parent::_prepareForm(); } } 

  4. General Block/Adminhtml/News/Edit/Tabs/General.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('general_form', array( 'legend' => $helper->__('General Information') )); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, 'name' => 'content', )); $fieldset->addField('created', 'date', array( 'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT), 'image' => $this->getSkinUrl('images/grid-cal.gif'), 'label' => $helper->__('Created'), 'name' => 'created' )); $form->setValues($model->getData()); $this->setForm($form); return parent::_prepareForm(); } } 

  5. Custom
    Block/Adminhtml/News/Edit/Tabs/Custom.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs_Custom extends Mage_Adminhtml_Block_Widget { protected function _toHtml() { return '<h2>Custom Fields</h2>'; } } 



. 2 тАФ , тАФ . , General, .

, , . 2 - , _prepareLayout . . , General $form = new Varien_Data_Form() , , тАФ .



рдЪрд░рдг 15. рдПрдХ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдирд╛
.

  1. General Block/Adminhtml/News/Edit/Tabs/General.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('general_form', array('legend' => $helper->__('General Information'))); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, 'name' => 'content', )); $fieldset->addField('image', 'image', array( 'label' => $helper->__('Image'), 'name' => 'image', )); $fieldset->addField('created', 'date', array( 'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT), 'image' => $this->getSkinUrl('images/grid-cal.gif'), 'label' => $helper->__('Created'), 'name' => 'created' )); $formData = array_merge($model->getData(), array('image' => $model->getImageUrl())); $form->setValues($formData); $this->setForm($form); return parent::_prepareForm(); } } 

  2. Helper/Data.php
     <?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0) { $path = Mage::getBaseDir('media') . '/ds_news'; if ($id) { return "{$path}/{$id}.jpg"; } else { return $path; } } public function getImageUrl($id = 0) { $url = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA) . 'ds_news/'; if ($id) { return $url . $id . '.jpg'; } else { return $url; } } } 

  3. Model/News.php
     <?php class DS_News_Model_News extends Mage_Core_Model_Abstract { protected function _construct() { parent::_construct(); $this->_init('dsnews/news'); } protected function _afterDelete() { $helper = Mage::helper('dsnews'); @unlink($helper->getImagePath($this->getId())); return parent::_afterDelete(); } public function getImageUrl() { $helper = Mage::helper('dsnews'); if ($this->getId() && file_exists($helper->getImagePath($this->getId()))) { return $helper->getImageUrl($this->getId()); } return null; } } 

  4. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction() { $id = $this->getRequest()->getParam('id'); if ($data = $this->getRequest()->getPost()) { try { $helper = Mage::helper('dsnews'); $model = Mage::getModel('dsnews/news'); $model->setData($data)->setId($id); if (!$model->getCreated()) { $model->setCreated(now()); } $model->save(); $id = $model->getId(); if (isset($_FILES['image']['name']) && $_FILES['image']['name'] != '') { $uploader = new Varien_File_Uploader('image'); $uploader->setAllowedExtensions(array('jpg', 'jpeg')); $uploader->setAllowRenameFiles(false); $uploader->setFilesDispersion(false); $uploader->save($helper->getImagePath(), $id . '.jpg'); // Upload the image } else { if (isset($data['image']['delete']) && $data['image']['delete'] == 1) { @unlink($helper->getImagePath($id)); } } Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News was saved successfully')); Mage::getSingleton('adminhtml/session')->setFormData(false); $this->_redirect('*/*/'); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); Mage::getSingleton('adminhtml/session')->setFormData($data); $this->_redirect('*/*/edit', array( 'id' => $id )); } return; } Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save')); $this->_redirect('*/*/'); } public function deleteAction(){ ... } public function massDeleteAction(){ ... } } 



JPG, . /media/ds_news , , . тАФ URL , , тАФ . , тАФ image : $formData = array_merge($model->getData(), array('image' => $model->getImageUrl())) .



рдЪрд░рдг 16. рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛


  1. /skin/adminhtml/default/default/ds_news/adminhtml/scripts.js
     console.log('DS News admin'); 

  2. /skin/adminhtml/default/default/ds_news/adminhtml/styles.css
     #general_form label { color: #FF0000; font-weight: bold; } 

  3. controllers/Adminhtml/NewsController.php
     <?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/news'); if ($data = Mage::getSingleton('adminhtml/session')->getFormData()) { $model->setData($data)->setId($id); } else { $model->load($id); } Mage::register('current_news', $model); $this->loadLayout()->_setActiveMenu('dsnews'); $this->getLayout()->getBlock('head')->addItem('skin_js', 'ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('skin_css', 'ds_news/adminhtml/styles.css'); $this->_addLeft($this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs')); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction(){ ... } public function deleteAction(){ ... } public function massDeleteAction(){ ... } } 



DS News admin , .

, , , : JS, . тАФ /skin/adminhtml/default/default/ /js/ тАФ . , , /js/ , тАФ .

, /js/ /js/
 $this->getLayout()->getBlock('head')->addItem('skin_js', 'ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('skin_css', 'ds_news/adminhtml/styles.css'); 
рдкрд░
 $this->getLayout()->getBlock('head')->addJs('ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('js_css', 'ds_news/adminhtml/styles.css'); 




рдЪрд░рдг 17. рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛: рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛
тАФ : . , .

  1. sql/dsnews_setup/upgrade-0.0.1-0.0.2.php
     <?php echo '<h1>Upgrade DS News to version 0.0.2</h1>'; exit; $installer = $this; $tableCategories = $installer->getTable('dsnews/table_categories'); $tableNews = $installer->getTable('dsnews/table_news'); $installer->startSetup(); $installer->getConnection()->dropTable($tableCategories); $table = $installer->getConnection() ->newTable($tableCategories) ->addColumn('category_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( 'identity' => true, 'nullable' => false, 'primary' => true, )) ->addColumn('title', Varien_Db_Ddl_Table::TYPE_TEXT, '255', array( 'nullable' => false, )); $installer->getConnection()->createTable($table); $installer->getConnection()->addColumn($tableNews, 'category_id', array( 'comment' => 'News Category', 'default' => '0', 'nullable' => false, 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER, )); $installer->endSetup(); 

  2. etc/config.xml
     <?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.2</version> </DS_News> </modules> ... <global> ... <models> <dsnews> <class>DS_News_Model</class> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <class>DS_News_Model_Resource</class> <entities> <table_categories> <table>ds_news_categories</table> </table_categories> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> ... </global> </config> 

  3. Model/Category.php
     <?php class DS_News_Model_Category extends Mage_Core_Model_Abstract { protected function _construct() { parent::_construct(); $this->_init('dsnews/category'); } protected function _afterDelete() { $newsCollection = Mage::getModel('dsnews/news')->getCollection() ->addFieldToFilter('category_id', $this->getId()); foreach($newsCollection as $news){ $news->setCategoryId(0)->save(); } return parent::_afterDelete(); } } 

  4. Block/Adminhtml/News/Edit/Tabs/General.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { ... $fieldset->addField('category_id', 'select', array( 'label' => $helper->__('Category'), 'name' => 'category_id', 'values' => $helper->getCategoriesOptions(), )); ... } } 

  5. Helper/Data.php ,
     <?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0){ ... } public function getImageUrl($id = 0){ ... } public function getCategoriesList() { $categories = Mage::getModel('dsnews/category')->getCollection()->load(); $output = array(); foreach($categories as $category){ $output[$category->getId()] = $category->getTitle(); } return $output; } public function getCategoriesOptions() { $categories = Mage::getModel('dsnews/category')->getCollection()->load(); $options = array(); $options[] = array( 'label' => '', 'value' => '' ); foreach ($categories as $category) { $options[] = array( 'label' => $category->getTitle(), 'value' => $category->getId(), ); } return $options; } } 

  6. Block/News/Grid.php
     <?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('category', array( 'header' => $helper->__('Category'), 'index' => 'category_id', 'options' => $helper->getCategoriesList(), 'type' => 'options', 'width' => '150px', )); $this->addColumn('created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } protected function _prepareMassaction(){ ... } public function getRowUrl($model){ ... } } 

  7. etc/config.xml
     <?xml version="1.0" ?> <config> ... <adminhtml> <menu> <dsnews module="dsnews"> <title>News</title> <sort_order>77</sort_order> <children> <dsnews_news translate="title" module="dsnews"> <title>News</title> <sort_order>10</sort_order> <action>dsnews_admin/adminhtml_news</action> </dsnews_news> <dsnews_category translate="title" module="dsnews"> <title>Categories</title> <sort_order>20</sort_order> <action>dsnews_admin/adminhtml_category</action> </dsnews_category> </children> </dsnews> </menu> </adminhtml> ... </config> 



┬лUpgrade DS News to version 0.0.2┬╗, тАФ . core_resource тАФ dsnews_setup 0.0.1 . , , comment , .

, , . , . , , . / тАФ Magento ( /var/cache ), .. Magento !



рдЪрд░рдг 18. рдЯреИрдм рдореЗрдВ рдбреЗрдЯрд╛ рдЧреНрд░рд┐рдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛
,

  1. Model/Category.php
     <?php class DS_News_Model_Category extends Mage_Core_Model_Abstract { protected function _construct(){ ... } protected function _afterDelete() { foreach($this->getNewsCollection() as $news){ $news->setCategoryId(0)->save(); } return parent::_afterDelete(); } public function getNewsCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $collection->addFieldToFilter('category_id', $this->getId()); return $collection; } } 

  2. Block/Adminhtml/Category/Edit/Tabs/News.php
     <?php class DS_News_Block_Adminhtml_Category_Edit_Tabs_News extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setId('categoryNewsGrid'); $this->setUseAjax(true); } protected function _prepareCollection() { $collection = Mage::registry('current_category')->getNewsCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('ajax_grid_news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('ajax_grid_title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('ajax_grid_created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } public function getGridUrl() { return $this->getUrl('*/*/news', array('_current' => true)); } } 

  3. Block/Adminhtml/Category/Edit/Tabs.php
     <?php class DS_News_Block_Adminhtml_Category_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct(){ ... } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_general')->toHtml(), )); $this->addTab('news_section', array( 'class' => 'ajax', 'label' => $helper->__('News'), 'title' => $helper->__('News'), 'url' => $this->getUrl('*/*/news', array('_current' => true)), )); return parent::_prepareLayout(); } } 

  4. controllers/Adminhtml/CategoryController.php ,
     <?php class DS_News_Adminhtml_CategoryController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction(){ ... } public function deleteAction(){ ... } public function newsAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/category')->load($id); Mage::register('current_category', $model); if (Mage::app()->getRequest()->isAjax()) { $this->loadLayout(); echo $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_news')->toHtml(); } } } 



, ┬лNews┬╗. , . , , , 3:
 <?php class DS_News_Block_Adminhtml_Category_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct(){ ... } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $category = Mage::registry('current_category'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_general')->toHtml(), )); if($category->getId()){ $this->addTab('news_section', array( 'class' => 'ajax', 'label' => $helper->__('News'), 'title' => $helper->__('News'), 'url' => $this->getUrl('*/*/news', array('_current' => true)), )); } return parent::_prepareLayout(); } } 


, , 2 $this->setId('categoryNewsGrid') , JavaScript , , JavaScript (, ).

ajax_grid_ 2. , , .

, - , ajax ( ) /, . getGridUrl -. array('_current' => true) , , , id .



рдЪрд░рдг 19. рдбреЗрдЯрд╛ рдЧреНрд░рд┐рдб рдореЗрдВ рдЪрдпрдирд┐рдд рд░рд┐рдХреЙрд░реНрдб рд╕рд╣реЗрдЬрдирд╛
, / . , . , -, . , - . Mage_Adminhtml_Block_Widget_Grid_Serializer .

  1. Block/Adminhtml/Category/Edit/Tabs/News.php
     <?php class DS_News_Block_Adminhtml_Category_Edit_Tabs_News extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setDefaultFilter(array('ajax_grid_in_category' => 1)); $this->setId('categoryNewsGrid'); $this->setSaveParametersInSession(false); $this->setUseAjax(true); } protected function _prepareCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('ajax_grid_in_category', array( 'align' => 'center', 'header_css_class' => 'a-center', 'index' => 'news_id', 'type' => 'checkbox', 'values' => $this->getSelectedNews(), )); $this->addColumn('ajax_grid_news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('ajax_grid_title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('ajax_grid_created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } protected function _addColumnFilterToCollection($column) { if ($column->getId() == 'ajax_grid_in_category') { $collection = $this->getCollection(); $selectedNews = $this->getSelectedNews(); if ($column->getFilter()->getValue()) { $collection->addFieldToFilter('news_id', array('in' => $selectedNews)); } elseif (!empty($selectedNews)) { $collection->addFieldToFilter('news_id', array('nin' => $selectedNews)); } } else { parent::_addColumnFilterToCollection($column); } return $this; } public function getGridUrl() { return $this->getUrl('*/*/news', array('_current' => true, 'grid_only' => 1)); } public function getSelectedNews() { if (!isset($this->_data['selected_news'])) { $selectedNews = Mage::app()->getRequest()->getParam('selected_news', null); if(is_null($selectedNews) || !is_array($selectedNews)){ $category = Mage::registry('current_category'); $selectedNews = $category->getNewsCollection()->getAllIds(); } $this->_data['selected_news'] = $selectedNews; } return $this->_data['selected_news']; } } 

  2. controllers/Adminhtml/CategoryController.php
     <?php class DS_News_Adminhtml_CategoryController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction() { $categoryId = $this->getRequest()->getParam('id'); if ($data = $this->getRequest()->getPost()) { try { $helper = Mage::helper('dsnews'); $model = Mage::getModel('dsnews/category'); $model->setData($data)->setId($categoryId); $model->save(); $categoryId = $model->getId(); $categoryNews = $model->getNewsCollection()->getAllIds(); if ($selectedNews = $this->getRequest()->getParam('selected_news', null)) { $selectedNews = Mage::helper('adminhtml/js')->decodeGridSerializedInput($selectedNews); } else { $selectedNews = array(); } $setCategory = array_diff($selectedNews, $categoryNews); $unsetCategory = array_diff($categoryNews, $selectedNews); foreach($setCategory as $id){ Mage::getModel('dsnews/news')->setId($id)->setCategoryId($categoryId)->save(); } foreach($unsetCategory as $id){ Mage::getModel('dsnews/news')->setId($id)->setCategoryId(0)->save(); } Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Category was saved successfully')); Mage::getSingleton('adminhtml/session')->setFormData(false); $this->_redirect('*/*/'); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); Mage::getSingleton('adminhtml/session')->setFormData($data); $this->_redirect('*/*/edit', array( 'id' => $categoryId )); } return; } Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save')); $this->_redirect('*/*/'); } public function deleteAction(){ ... } public function newsAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/category')->load($id); $request = Mage::app()->getRequest(); Mage::register('current_category', $model); if ($request->isAjax()) { $this->loadLayout(); $layout = $this->getLayout(); $root = $layout->createBlock('core/text_list', 'root', array('output' => 'toHtml')); $grid = $layout->createBlock('dsnews/adminhtml_category_edit_tabs_news'); $root->append($grid); if (!$request->getParam('grid_only')) { $serializer = $layout->createBlock('adminhtml/widget_grid_serializer'); $serializer->initSerializerBlock($grid, 'getSelectedNews', 'selected_news', 'selected_news'); $root->append($serializer); } $this->renderLayout(); } } } 



1, ajax_grid_in_category , / , ( / / ). _prepareCollection , _addColumnFilterToCollection . $this->setDefaultFilter(array('ajax_grid_in_category' => 1)); ( ). getSelectedNews , . , , POST- ( ), тАФ .

. . $root = $layout->createBlock(...) root , . , , , . .

initSerializerBlock , . 4 : , , ( ), , getSelectedNews .



рдЪрд░рдг 20. рд╕реБрдВрджрд░ URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
тАФ , HTML/CSS . тАФ . , . . , , , .

  1. sql/dsnews_setup/upgrade-0.0.2-0.0.3.php
     <?php echo '<h1>Upgrade DS News to version 0.0.3</h1>'; exit; $installer = $this; $tableNews = $installer->getTable('dsnews/table_news'); $installer->startSetup(); $installer->getConnection() ->addColumn($tableNews, 'link', array( 'comment' => 'News URL link', 'type' => Varien_Db_Ddl_Table::TYPE_TEXT, 'length' => '255', 'nullable' => true, )); $installer->getConnection() ->addKey($tableNews, 'IDX_UNIQUE_NEWS_LINK', 'link', Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE); foreach (Mage::getModel('dsnews/news')->getCollection() as $news) { try { $news->load($news->getId())->setDataChanges(true)->save(); } catch (Exception $e) { $news->setId($news->getId())->setLink($news->getId())->save(); } } $installer->endSetup(); 

  2. etc/config.xml
     <?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.3</version> </DS_News> </modules> ... </config> 

  3. Helper/Data.php
     <?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0){ ... } public function getImageUrl($id = 0){ ... } public function getCategoriesList(){ ... } public function getCategoriesOptions(){ ... } public function prepareUrl($url) { return trim(preg_replace('/-+/', '-', preg_replace('/[^a-z0-9]/sUi', '-', strtolower(trim($url)))), '-'); } } 

  4. Model/News.php
     <?php class DS_News_Model_News extends Mage_Core_Model_Abstract { protected function _construct(){ ... } protected function _afterDelete(){ ... } protected function _beforeSave() { $helper = Mage::helper('dsnews'); if (!$this->getData('link')) { $this->setData('link', $helper->prepareUrl($this->getTitle())); } else { $this->setData('link', $helper->prepareUrl($this->getData('link'))); } return parent::_beforeSave(); } public function getImageUrl(){ ... } } 

  5. Block/Adminhtml/News/Edit/Tabs/General.php
     <?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { ... $fieldset->addField('link', 'text', array( 'label' => $helper->__('Link'), 'name' => 'link', )); ... } } 

  6. etc/config.xml
     <?xml version="1.0" ?> <config> ... <global> ... <events> <controller_front_init_routers> <observers> <dsnews> <class>DS_News_Controller_Router</class> <method>initControllerRouters</method> </dsnews> </observers> </controller_front_init_routers> </events> ... </global> </config> 

  7. Controller/Router.php
     <?php class DS_News_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract { public function initControllerRouters($observer) { $front = $observer->getEvent()->getFront(); $front->addRouter('dsnews', $this); } public function match(Zend_Controller_Request_Http $request) { $identifier = trim($request->getPathInfo(), '/'); $cmd = explode('/', $identifier); if ($cmd[0] == 'news') { if (count($cmd) == 1) { return $this->_fillRequest($request); } else { $model = Mage::getModel('dsnews/news')->load($cmd[1], 'link'); if ($model->getId()) { $params = array( 'id' => $model->getId() ); return $this->_fillRequest($request, $params, 'index', 'view'); } } } return false; } protected function _fillRequest($request, $cmd = array(), $controller = 'index', $action = 'index') { $request->setModuleName('news') ->setControllerName($controller) ->setActionName($action) ->setParam('is_routed', 1); if (is_array($cmd) && count($cmd)) { foreach ($cmd as $key => $value) { $request->setParam($key, $value); } } $request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, $request->getPathInfo()); return true; } } 



Upgrade DS News to version 0.0.3 , тАФ , Magento ( ). 1 5 тАФ : . 7, 6 . http://site.com/news/{news-link}

. controller_front_init_routers , $this : $front->addRouter('dsnews', $this) . Mage_Core_Controller_Varien_Router_Abstract , match . , , . match , URL. , . true , , false . _fillRequest тАФ , .

, _fillRequest $request->setModuleName('news') frontName config.xml ( frontend/routers/[module Name]/args/frontName ), .

, , .



рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг, рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрдм рдкрд╛рда рдореЗрдВ рдХреЛрдб рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдХреЛрдб рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛, рдпрд╛ рдХреЛрдб рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдкреАрдПрдо рдореЗрдВ рд▓реЗрдЦрдХ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦреЗрдВ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдЧрд▓рддрд┐рдпрд╛рдБ рдпрд╛ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In180555/


All Articles