Pereiti prie turinio

Mokausi PHP OOP


Rekomenduojami pranešimai

Čia jau šiek tiek bėda: kiek pamenu, CodeIgniter neturi context processorių ar kažko panašaus.

 

Šita bėda yra nesunkiai išsprendžiama. Tuo pačiu atsakysiu ir į anksčiau užduotą klausimą dėl linkų visame puslapyje.

 

Tau reikia pasiruošti template. Tam reikės bilbiotekos(manau jau žinai kas tai yra):

class Template
{
   var $template_data = array();

   /**
    * Set data to the template
    * @param $name
    * @param $value
    */
   function set($name, $value)
   {
       $this->template_data[$name] = $value;
   }

   /**
    * Load template
    * @param string $template
    * @param string $view
    * @param array $view_data
    * @param bool $return
    * @return mixed
    */
   function load($template = '', $view = '', $view_data = array(), $return = FALSE)
   {
       $this->CI =& get_instance();
       $this->set('content', $this->CI->load->view($view, $view_data, TRUE));
       return $this->CI->load->view($template, $this->template_data, $return);
   }
}

 

Kaip tai veikia? Tu susikuri template, kuriame susidedi visą puslapio nekintančią struktūrą ir įterpti ten kint.

<?=$content?>

 

kitas žingsnis tai jau krauti ant to kintamojo informaciją, kurią perduosi, tam pasiskaityk google (su set parametrais). Dabar apie tai, kaip išlaikyti tuos pačius linkus:

 

galima apsižaisti su tuo templaye jeigu teisingai supratau, o jeigu ne, gali susikurti papildomą variklį, per kurį veiks puslapio controlleris, pvz:

 

class Puslapio_controller extends My_controller

 

tą controllerį gali susikurti system/core foldery, o kaip naudoti ir nustatyti "custom linkus" visiems psl paskaityt gali čia: http://stackoverflow.com/questions/8342232/extending-the-controller-class-in-codeigniter

 

Pakopinu savo controllerio, kuris veikia su šiuo template kodo struktūrą:

 

public function index(){        
       $data = array(
           'fb_data' => array(
               'app_id' => $this->system_model->getSystemInfo('fb_app_id'),
               'fb_secret' => $this->system_model->getSystemInfo('fb_secret'),
           ),
           'categories' => $this->system_model->getCategories(FALSE, FALSE, FALSE),
           'rate_items' => $this->items_model->getItems(FALSE, 10, 'id', 'DESC', FALSE, FALSE),
           'welcome_section' => TRUE // for welcome section display
       ); // array for items to page

       if(!$this->uri->segment(1) || $this->uri->segment(1) != CATEGORY_URI_1){
       	$this->template->set(
               'page_headers', array(
                   'title' => 'title - i want sex!',
                   'description' => 'Project description',
                   'keywords' => 'Project keywords',
                   'og' => array(
                       'description' => 'Project OG description for socials',
                       'app_id' => 'APP ID For project developement',
                       'title' => 'Project OG title for socials',
                       'image' => 'http://google.lt/no_image.jpg',
                       'site_name' => 'Project OG title for socials'
                   )            
           ));
       } else {
           if($this->system_model->getCategories(FALSE, FALSE, $this->uri->segment(2)) == FALSE)
               redirect(base_url());

           $data['categorie_data'] = $this->system_model->getCategories(FALSE, FALSE, $this->uri->segment(2));    
           $data['rate_items'] = $this->items_model->getItems(FALSE, 10, 'id', 'DESC', FALSE, $data['categorie_data']['id']);

           $this->template->set(
               'page_headers', array(
                   'title' => 'title to change! - category',
                   'description' => 'Project category description',
                   'keywords' => 'Project category keywords',
                   'og' => array(
                       'description' => 'Project category OG description for socials',
                       'app_id' => 'APP ID For project developement',
                       'title' => 'Project category OG title for socials',
                       'image' => 'http://google.lt/no_image.jpg',
                       'site_name' => 'Project category OG title for socials'
                   )            
           ));
       }
   	$this->template->load('Project_template', 'pages/main_view', $data);
   }

 

berašydamas prisiminiau, kad forume kažkas seniau pasidalino sistema, kurta pasinaudojant CI frameworką ir prisiminiau, kad ten extendina custom klasę, tai ko tau ir reik. Sistemą rasi čia:

 

http://uzdarbis.lt/t276633/tuiraseu-sistema

 

P.S. kad lengviau suprastum CI pasimokink apie MVC - kaip tai veikia, kaip naudoti ir pan., o tada gali paimti CI ir pamatysi, kad jis yra pranašesnis už paprastą custom MVC karkasą. Kaip pvz paimkime tai, kad MVC tu negali kviesti model funkcijos iš viewso, o su CI gali tai padaryti, su CI gali apsirašyti custom configą, kuris tau veiks per visus puslapius.

 

http://ellislab.com/codeigniter%20/user-guide/libraries/config.html

Redagavo gio
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Šita bėda yra nesunkiai išsprendžiama. Tuo pačiu atsakysiu ir į anksčiau užduotą klausimą dėl linkų visame puslapyje.

 

Tau reikia pasiruošti template. Tam reikės bilbiotekos(manau jau žinai kas tai yra):

class Template
{
   var $template_data = array();

   /**
    * Set data to the template
    * @param $name
    * @param $value
    */
   function set($name, $value)
   {
       $this->template_data[$name] = $value;
   }

   /**
    * Load template
    * @param string $template
    * @param string $view
    * @param array $view_data
    * @param bool $return
    * @return mixed
    */
   function load($template = '', $view = '', $view_data = array(), $return = FALSE)
   {
       $this->CI =& get_instance();
       $this->set('content', $this->CI->load->view($view, $view_data, TRUE));
       return $this->CI->load->view($template, $this->template_data, $return);
   }
}

 

Kaip tai veikia? Tu susikuri template, kuriame susidedi visą puslapio nekintančią struktūrą ir įterpti ten kint.

<?=$content?>

 

kitas žingsnis tai jau krauti ant to kintamojo informaciją, kurią perduosi, tam pasiskaityk google (su set parametrais). Dabar apie tai, kaip išlaikyti tuos pačius linkus:

 

galima apsižaisti su tuo templaye jeigu teisingai supratau, o jeigu ne, gali susikurti papildomą variklį, per kurį veiks puslapio controlleris, pvz:

 

class Puslapio_controller extends My_controller

 

tą controllerį gali susikurti system/core foldery, o kaip naudoti ir nustatyti "custom linkus" visiems psl paskaityt gali čia: http://stackoverflow.com/questions/8342232/extending-the-controller-class-in-codeigniter

 

Pakopinu savo controllerio, kuris veikia su šiuo template kodo struktūrą:

 

public function index(){        
       $data = array(
           'fb_data' => array(
               'app_id' => $this->system_model->getSystemInfo('fb_app_id'),
               'fb_secret' => $this->system_model->getSystemInfo('fb_secret'),
           ),
           'categories' => $this->system_model->getCategories(FALSE, FALSE, FALSE),
           'rate_items' => $this->items_model->getItems(FALSE, 10, 'id', 'DESC', FALSE, FALSE),
           'welcome_section' => TRUE // for welcome section display
       ); // array for items to page

       if(!$this->uri->segment(1) || $this->uri->segment(1) != CATEGORY_URI_1){
       	$this->template->set(
               'page_headers', array(
                   'title' => 'title - i want sex!',
                   'description' => 'Project description',
                   'keywords' => 'Project keywords',
                   'og' => array(
                       'description' => 'Project OG description for socials',
                       'app_id' => 'APP ID For project developement',
                       'title' => 'Project OG title for socials',
                       'image' => 'http://google.lt/no_image.jpg',
                       'site_name' => 'Project OG title for socials'
                   )            
           ));
       } else {
           if($this->system_model->getCategories(FALSE, FALSE, $this->uri->segment(2)) == FALSE)
               redirect(base_url());

           $data['categorie_data'] = $this->system_model->getCategories(FALSE, FALSE, $this->uri->segment(2));    
           $data['rate_items'] = $this->items_model->getItems(FALSE, 10, 'id', 'DESC', FALSE, $data['categorie_data']['id']);

           $this->template->set(
               'page_headers', array(
                   'title' => 'title to change! - category',
                   'description' => 'Project category description',
                   'keywords' => 'Project category keywords',
                   'og' => array(
                       'description' => 'Project category OG description for socials',
                       'app_id' => 'APP ID For project developement',
                       'title' => 'Project category OG title for socials',
                       'image' => 'http://google.lt/no_image.jpg',
                       'site_name' => 'Project category OG title for socials'
                   )            
           ));
       }
   	$this->template->load('Project_template', 'pages/main_view', $data);
   }

 

berašydamas prisiminiau, kad forume kažkas seniau pasidalino sistema, kurta pasinaudojant CI frameworką ir prisiminiau, kad ten extendina custom klasę, tai ko tau ir reik. Sistemą rasi čia:

 

http://uzdarbis.lt/t276633/tuiraseu-sistema

 

P.S. kad lengviau suprastum CI pasimokink apie MVC - kaip tai veikia, kaip naudoti ir pan., o tada gali paimti CI ir pamatysi, kad jis yra pranašesnis už paprastą custom MVC karkasą. Kaip pvz paimkime tai, kad MVC tu negali kviesti model funkcijos iš viewso, o su CI gali tai padaryti, su CI gali apsirašyti custom configą, kuris tau veiks per visus puslapius.

 

http://ellislab.com/codeigniter%20/user-guide/libraries/config.html

 

Visų pirma, ačiū už išsamų atsakymą.

 

Kai ankščiau niekas nesigavo padaryti, kaip aš noriu, viską ištryniau ir pradėjau nuo pradžių.

Susiradau aprašymą kaip sujungti CodeIgniter su Smarty template (http://www.coolphptools.com/codeigniter-smarty), tad taip ir padariau. Toliau ieškodamas bet kokios naudingos informacijos su pavyzdžiais radau stackowerflow temą "How to access query return value in model (CodeIgniter) using Smarty?" (http://stackoverflow.com/questions/19830845/how-to-access-query-return-value-in-model-codeigniter-using-smarty) - išbandžiau tik minimaliai, tačiau kol kas atrodo, jog veikia būtent taip, kaip aš ir norėjau ankščiau... Jeigu gerai suprantu, dabar su $this->smartyci->assign('kazkas', $val) galiu susikelti visą reikiamą info į template ir vėliau naudojant $this->smartyci->display('template.tpl'); viską atvaizduoti. Taip pat statinius puslapius, kuriuose informacija yra nekintama galima kešuoti, tad manau, jog čia būtų gan geras variantas, tačiau kol nieko neprikūriau bereikalingai, norėčiau sužinoti ir Jūsų nuomonę.

 

beje, gio, dar vienas klausimas tau. Kaip pas tave atrodo modelis, kuris paima setingus ($this->system_model->getSystemInfo('fb_app_id'))? Prieš tai buvau papostinęs savo rašytą modelį ir įdomu ar gerai dariau? galbūt pasakytum ką būtų galima padaryti lengviau, nes pas mane yra svetainės settings, kontaktų settings atskirose db lentelėse, tad galbūt viską į vieną modelį kažkaip eitų sudėt? Bandžiau, bet nesigavo ir kol kas palikau tuos settings skirtinguose modeliuose.

 

Temos pradžioje minėjau, jog PHP pagrindus turiu, tad neprašau aiškinti konkrečiai viską nuo nulio (be OOP kūriau ne vieną svetainę, tačiau laikas išmokti ir objektinį programavimą). Tiesiog prašau pagalbos, kol užsikabinsiu ir bent minimaliai perprasiu patį MVC, framework veikimą. Ačiū už pagalbą man bei tikiuosi, jog Jūsų pateikta informacija ateityje pravers dar ne vienam tokiam žaliam, kaip aš. :)

 

---

Edit:

Taip pat prie CodeIgniter pridėjau ir PDO pasinaudodamas šia nuoroda: http://christopherickes.com/web-app-development/pdo-for-codeigniter-2/

 

 

Jeigu pastebėsite, jog kažkur kažką kažkaip galima pakeisti, ar padariau neteisingai, pasakykit. Mokausi ir tobulėju... :)

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš tai nematau jokios problemos ir naudoju globalųjį duomenų bazės kintamąjį savo metoduose. Jeigu WordPress sau tai leidžia, tai nematau, kodėl turėčiau sau to neleisti :)

Sorry, bet Wordpress imti kaip gera source pavyzdi yra degradacijos zenklas.

Praktiskai viskas kodas ten susvinkes, tiek pati pirmene implementacija, tiek visi addonai del jos.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sorry, bet Wordpress imti kaip gera source pavyzdi yra degradacijos zenklas.

Praktiskai viskas kodas ten susvinkes, tiek pati pirmene implementacija, tiek visi addonai del jos.

 

Ar galima paaiškinti, kodėl tai yra "degradacijos ženklas"? Ar čia tik išrinktas pats "šmaikščiausias" būdas įžeisti mane?

Ar aš prastėju, ar tampu kvailesnis, jei naudoju vienos iš populiariausių TVS'ų vieną bruožą - globalų duomenų bazės kintamąjį?

Ar tamsta bent yra pakankamai kompetetingas programuotojas, kad galėtų nuspręsti, koks kodas yra sušvinkęs, o koks ne? Ir toks kompetetingas, kad galėtumėte mane vadinti degraduojančiu?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ar galima paaiškinti, kodėl tai yra "degradacijos ženklas"? Ar čia tik išrinktas pats "šmaikščiausias" būdas įžeisti mane?

Ar aš prastėju, ar tampu kvailesnis, jei naudoju vienos iš populiariausių TVS'ų vieną bruožą - globalų duomenų bazės kintamąjį?

Ar tamsta bent yra pakankamai kompetetingas programuotojas, kad galėtų nuspręsti, koks kodas yra sušvinkęs, o koks ne? Ir toks kompetetingas, kad galėtumėte mane vadinti degraduojančiu?

Jeigu kada nors pamatysi, jog Wordpress yra kreiva sistema - sveikinsiu, nes kazko ismokai. Kol imsi pavyzdi is prasciausiu (wordpress), tol toks ir busi.

 

Galbut ir neprasteji, taciau visiskai netobuleji.

 

Per paskutinius 3 metus dirbau prie 2 dideliu tarptautiniu projektu, kuriu bendras lankomumas kas diena siekia 5 milijonus vartotoju, manau, turiu pakankamai ziniu ir patirties vertinti, kokie sprendimai yra priimtini, kokie - ne.

Redagavo Plx
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jau sakyta šioj temoj: nori mokytis OOP, tai OOP. Nebūtinai MVC ir login sistemas kartu dar. Nebūtinai net su web programavimu...

 

WP ir dauguma kitų kodo bazių, kurios nori laikyt kone amžiną compatibility, galop išeina ne tobuliausios, ne argumentas sakyti "globalai gerai, nes WP". Netiesa.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
beje, gio, dar vienas klausimas tau. Kaip pas tave atrodo modelis, kuris paima setingus ($this->system_model->getSystemInfo('fb_app_id'))? Prieš tai buvau papostinęs savo rašytą modelį ir įdomu ar gerai dariau? galbūt pasakytum ką būtų galima padaryti lengviau, nes pas mane yra svetainės settings, kontaktų settings atskirose db lentelėse, tad galbūt viską į vieną modelį kažkaip eitų sudėt? Bandžiau, bet nesigavo ir kol kas palikau tuos settings skirtinguose modeliuose.

 

/**
    * function for data receiving from system database
    * 
    * @param string
    * @access public
    * @return string
    */

   public function getSystemInfo($return){
       $query = $this->db->select($return)->get('system_info');
       if($query->num_rows() == 0)
           return false;

       $query = $query->row_array();
       return $query[$return];
   }

Nuoroda į pranešimą
Dalintis kituose puslapiuose

ko jūs čia prisikabinot dabar prie tos login sistemos? skaitykit temą iš eilės, gabūt suprasit apie ką toliau kalba eina!

Tik pasiūliau. Jei nori, mokykis taip – nesuprasdamas konceptų ir nesugebėdamas naudotis manualais.

 

Pastarosios problemos sprendimą jau daviau.

 

tame ir esmė, kad niekas nesigauna su tuo framework, MVC...

O platesnius patarimus dalinu dėl šito. Nu tai jei nieks nesigauna, tai visiškai nuo antro galo mokaisi. Jei tau svarbiausia (kažkodėl per dieną tapo) CodeIgniter, tai imk CI knygą/manualą/tutorialą į rankas ir daryk. O čia už tave žmonės kodą turi rašyt. Copy-paste find-replace programavimo neišmoksi.

 

Jei bent normaliai apibūdintum problemą, gal ir įmanoma būtų padėti. Dabar yra „nesigauna, help“.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

kažkodėl gio suprato ir padėjo, aprašė viską išsamiai ir su pavyzdžiais - supratau ir išspręndžiau problemą, o Jūs tik rašot svarbu rašyt... Taip, kartais duodat gerus patarimus, bet kartais jau kai nuvažiuojat, tai nuvažiuojat į pievas...

 

beje, asmeniškai man, mokytis sekasi visada kažką atliekant praktiškai, nei skaitant sausą teoriją...

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai nieks ir neneigia, kad praktikos reikia, bet irgi ne bet kokios. Tiesiog nei nebandai apsvarstyt pasiūlymų, tik neri stačia galvą į pirmą pasitaikiusį buzzwordą ir tada ieškai copy-paste pagalbos. Gio tokią ir suteikė. Jei tau tokia atrodo vertingiausia – ok, ne man čia aiškint.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

na, mvc != oop. codeigniter irgi ne išimtis. Jeigu nori išmokti vien OOP tai ir mokiniesi vien OOP. Vieną dieną paskaitęs teoriją, kitą dieną gali bandyt praktikoje, jei viskas gaunasi kabini MVC. Man kažkada pasakė, kad mokytis kaip veikia MVC iš CI yra blogas pavyzdys, paklausiau ir pasimokiau per naują OOP ir MVC, tada tas pats codeigniter tapo daug draugiškesnis.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

na, mvc != oop. codeigniter irgi ne išimtis. Jeigu nori išmokti vien OOP tai ir mokiniesi vien OOP. Vieną dieną paskaitęs teoriją, kitą dieną gali bandyt praktikoje, jei viskas gaunasi kabini MVC. Man kažkada pasakė, kad mokytis kaip veikia MVC iš CI yra blogas pavyzdys, paklausiau ir pasimokiau per naują OOP ir MVC, tada tas pats codeigniter tapo daug draugiškesnis.

na kažkaip visai neblogai sekasi jau su tuo CI.

pasidariau template pagal tą kur tu buvai parašęs, šiek tiek dasirašiau pagal rastus pavyzdžius ir oplia - nuorodos ir kitas statinis turinys sukeltas :)

 

dabar dar vienas klausimas įdomus...

Kaip būtų galima padaryti friendly URLs? Kažkaip kontrolerius, funkrijas lietuviškais pavadinimais rašyt neatrodo protingas variantas :D skaičiau, kad per routes.php būtų galima, bet jei pas mane portale naujienų bus ~4k tai aš visų linkų ranka gal nesuvedinėsiu į failą :D bandžiau su _remap, bet nesigavo ir taip.

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 mėnesių...

/**
    * function for data receiving from system database
    * 
    * @param string
    * @access public
    * @return string
    */

   public function getSystemInfo($return){
       $query = $this->db->select($return)->get('system_info');
       if($query->num_rows() == 0)
           return false;

       $query = $query->row_array();
       return $query[$return];
   }

 

Visgi nelabai suprantu šioje vietoje, kaip čia veikia viskas su tais custom config failais...

Susikūriau main.php failą, įkėliau į config katalogą, per autoload.php užlaudinau.

Kol kas šis failas yra tuščias, bet norėčiau padaryti taip, jog galėčiau per šį failą iš duomenų bazės išsitrauki tam tikrus duomenis...

 

Mestelk, jei negaila, visą failą, kaip jis atrodo...

 

---

Edit:

Supratau... Reikia jį daryt su modeliu, o ne per config failus :)

Kai pradėjau modelius rašyt ir pasidarė viskas aišku...

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...