Elxis CMS Forum

Ελληνικό Forum => Πρόσθετα => Topic started by: intefix on September 25, 2014, 13:58:04

Title: Δημιουργία Component
Post by: intefix on September 25, 2014, 13:58:04
Γεια χαρά σε όλους...
Συγγνώμη για το θράσος μου αλλά επειδή με κράξατε  (https://forum.elxis.org/index.php?topic=7864.0) σε άλλο νήμα θα προσπαθήσω να φτιάξω ένα απλό Component. Θα γράφω τη πρόοδο και όπου κολλάω θα με βοηθάτε.
Ουσιαστικά αυτό που θέλω να φτιάξω τό έχω ήδη φτιάξει, αλλά με ξεχωριστές σελίδες PHP, js, CSS κλπ κλπ.
Αφού ουσιατικά χρησιμοποιώ πάρα πολλά κομμάτια του Elxis γιατί να μην τα χρησιμοποιήσω και να το ενσωματώσω;

Το έργο αφορά την προέλευση της ονομασίας μιας οδού.
Μελλοντικά καλούμε την οδό αυτή τη δείχνουμε στο χάρτη της προσθέτουμε πληροφορίες κλπ κλπ ξέρετε που μπορούμε να φτάσουμε.
Για την ώρα λοιπόν θα ασχοληθούμε με αυτό που είναι ένα Component περιεχομένου. Θα τα φτιάξουμε όλα χειροκίνητα και μετά θα δημιουργήσουμε τα αρχεία εγκατάστασης. Όπως καταλαβαίνετε θα κοιτάξω τι κάνει ένα παρόμοιο Component και θα ακολουθήσω τη φιλοσοφία του.
Όπως έχω τώρα με τις απλές σελίδες έχω δυο ενότητες. Του διαχειριστή και του επισκέπτη. Τα αρχεία σύνδεσης, ελέγχου κλπ δεν μου χρειάζονται γιατί υπάρχουν ήδη.
Για να διαβάσουμε τι κάνει ένα ήδη εγκατεστημένο Component σε ένα καινούριο Elxis.
Πάω στο φάκελο C:\xampp\htdocs\elxis42\components και δημιουργώ αναλόγως com_namestreet έναν φάκελο.
Ανοίγω τον C:\xampp\htdocs\elxis42\components\com_content και δημιουργώ παρόμοιους φακέλους στον νέο που έφτιαξα. (http://www.dimos-pylou-nestoros.gr/images/make_com/com_content.jpg)
----------------------------------------------------------------------------------------------------------------------------------
Ανοίγοντας το /extmanager/components/ βλέπουμε ένα grid με τα components που έχει ήδη...Από κάπου τα διαβάζει αυτάαα.
Ωραία θα προσθέσουμε και το δικό μας...
Εγγραφή στο πίνακα elx_components
INSERT INTO `elx_components` (`id`, `name`, `component`, `route`, `iscore`, `params`) VALUES (NULL, 'Name Street', 'com_namestreet', NULL, 0, NULL);
Βλέπουμε να μπήκε η εγγραφή αλλά χωρίς έκδοση κλπ (από κάπου τα τραβάει αυτά). επίσης δεν έχουμε πρόσβαση..
(http://www.dimos-pylou-nestoros.gr/images/make_com/com_namestreet1.jpg)
Παρατηρούμε επίσης ότι στον πίνακα "elx_acl" έχει όλα τα elements του site με κάποια Permitions ...Για να γράψουμε και μεις το δικό μας εδώ...Επειδή θα μοιάζει με το com_content φτιάχνουμε αντίστοιχα αντίγραφα.
Παρατηρούμε με προσοχή το component Content extmanager/components/edit.html?id=2 και βλέπουμε τι θα χρειστούμε εμείς να πράξουμε αναλόγως στα αρχεία μας. Πχ com_content /Κατηγορία και com_content /Σχόλια στη δική μας περίπτωση δεν θέλουμε. Τώρα αν θέλει και Modules δεν το' ψαξα θα δούμε Κατάληξα εδώ
INSERT INTO `elx_acl` (`id`, `category`, `element`, `identity`, `action`, `minlevel`, `gid`, `uid`, `aclvalue`) VALUES
(NULL, 'component', 'com_namestreet', 0, 'view', 0, 0, 0, 1),
(NULL, 'component', 'com_namestreet', 0, 'manage', 70, 0, 0, 1),
Βλέποντας τα πεδία έκδοση. ημερομηνία, συγγραφέας βλέπουμε ότι τα τραβάει από το com_content/content.xml
Αντιγράφουμε το content.xml στον νέο φάκελο com_namestreet διορθώνουμε μέσα ότι χρειάζεται - Τώρα εδώ είναι μια μεγάλη κουβέντα - Αφαιρούμε το γκρούπ "CATEGORY" , "COMMENTS" Που όπως είπα πιο πάνω δεν τα θέλουμε. Επίσης διορθόνουμε τα πεδία έκδοση. ημερομηνία, συγγραφέας.
Ξανατρέχουμε και βλέπουμε να έχουν διορθωθεί...
(http://www.dimos-pylou-nestoros.gr/images/make_com/com_namestreet2.jpg)
Και επίσης μπορούμε να το διαχειριστούμε...λεμε τώρα..
(http://www.dimos-pylou-nestoros.gr/images/make_com/com_namestreet3.jpg)


   

Title: Re: Δημιουργία Component
Post by: intefix on September 25, 2014, 19:29:07
Συνεχίζω...
Έχουμε μέχρι στιγμής φτιάξει τους φακέλους τις προσθήκες στους υπάρχοντες πίνακες και 2 αρχεία το namestreet.xml και namestreet.php το xml το πειράξαμε λίγο το php ακόμα...
Στα αρχεία εκτος elxis είχαμε ένα view-search που θα μπει στο frontend και τα άλλα search-delete-add-edit στο backend
Title: Re: Δημιουργία Component
Post by: Dimitris Kanatas on September 25, 2014, 20:36:07
Θα σε παρακολουθώ...

Μου φαίνεται αρκετά ενδιαφέρουσα ή βήμα προς βήμα προσέγγιση της κατασκευής ενός πρόσθετου...
Title: Re: Δημιουργία Component
Post by: datahell on September 25, 2014, 20:59:21
Θα φτιάξεις ένα ωραίο tutorial αν συνεχίσεις όπως πας.
Κάνε τις εξής διορθώσεις και στο post σου πάνω ώστε να μην τα διαβάζουν λάθος όσοι παρακολουθούν.

Στη δήλωση του component στη βάση το "iscore" πρέπει να είναι 0 σε third party components. Μόνο τα ενσωματωμένα component στο Elxis έχουν iscore = 1.
INSERT INTO `elx_components` (`id`, `name`, `component`, `route`, `iscore`, `params`) VALUES (NULL, 'Name Street', 'com_namestreet', NULL, 0, NULL);

Επίσης όταν κάνεις insert την τιμή του primary key του πίνακα (εδώ id) δεν την ορίζεις καρφωτά αλλά την βάζεις NULL ώστε να την πάρει αυτόματα αφού το πεδίο είναι auto increment. Το ίδιο λάθος το έχεις κάνει και στο elx_components και στο elx_acl.

Ο φάκελος "plugins" δεν χρειάζεται, είναι μόνο για το component content. Οι φάκελοι css, js, images είναι κατα βούληση, μπορείς να κάνεις ότι δομή θέλεις εσύ. Οι "υποχρεωτικοί" (στην πραγματικότητα δεν υπάρχεουν υποχρεωτικοί φάκελοι) είναι τρεις: controllers, models, views. Οι controllers περιέχουν την λογική (εσωτερικός php κώδικας), τα models την άντληση των δεδομένων (από την βάση, κάποιο άρχείο ή άλλη πηγή) και τα view εμφανίζουν την τελική html που βλέπουμε στον browser.

Στο ACL έβαλες permissions που είναι ειδικά για το component content και μόνο. Αυτά να τα σβήσεις. Τα υποχρεωτικά permissions σε ένα component είναι view και manage. Το view δηλώνει ποιος μπορεί να δει το component στο δημόσιο τμήμα και το manage ποιος μπορεί να το διαχειριστεί/δει στην διαχείριση. Οι συνήθεις τιμές για το view είναι minlevel=0, gid=0, uid=0, aclvalue=1 που σημαίνει ότι μπορούν να το δουν όλοι. Οι συνήθεις τιμές για το manage είναι minlevel=70, gid=0, uid=0, aclvalue=1 που σημαίνει ότι μπορούν να το δουν στη διαχείριση όσοι έχουν επίπεδο πρόσβασης από 70 και πάνω (managers και administrators). Μπορείς να προσθέσεις επιπλέον permissions (ότι θες εσύ) ανάλογα του component και του τι κάνει.

H καρδιά ενός component είναι ο router του (αρχείο namestreet.php) στον οποία αναλύεις τα segments (τμήματα) της url που ζητήθηκε και φορτώνεις τα αντίστοιχα Controller Model View και εκτελείς το task (συνάρτηση) που επιλεγμένου controller. Στο αρχείο router υπάρχει μία κλάση με όνομα {component}Router η οποία επεκτείνει την κλάση elxisRouter του πυρήνα του Elxis.
class namestreetRouter extends elxisRouter {

Μέσα σε αυτή την κλάση πρέπει να υπάρχει μία public μέθοδος** με όνομα route. Αυτή είναι που καλεί το Elxis για να τρέξει το component σου.
public function route() {
...
}

*Συμβουλή: το component content που χρησιμοποιείς ως δείγμα είναι αρκετά μεγάλο και έχει διάφορα tasks και αρχεία που είναι ειδικού χαρακτήρα. Μην αντιγράφεις copy-paste τα πάντα στο component σου αν δεν σου χρειάζονται. Κράτα το όσο πιο λιτό γίνεται.
** Μία συνάρτηση (function) που βρίσκεται σε μία κλάση (class) την ονομάζουμε μέθοδο (method). Το ποιος μπορεί να καλέσει αυτή την μέθοδο το ορίζουμε από το visibility της (public, private, protected)
Title: Re: Δημιουργία Component
Post by: nikos on September 25, 2014, 21:18:39
Μπράβο intefix

Πάνω που έλεγα ότι λείπει ένας τέτοιος οδηγός, διότι η δημιουργία component πάντα με προβλημάτιζε και δεν ήξερα από που να το πιάσω, χαίρομαι που το τόλμησες και εφόσον σε παρακολουθεί και ο Δάσκαλος (datahell), θα πάει καλά.
Title: Re: Δημιουργία Component
Post by: intefix on September 25, 2014, 22:47:16
Ευχαριστώ για τις απαντήσεις και τη καθοδήγηση...ήθελα να ρωτήσω τι κάνουν αυτά τα πεδία αλλά με προλάβατε.
Οκ θα αλλάξω όπως σωστά δεν πρόσεξα το auto increment αυτόματη αρίθμηση.
Διάλεξα το Component content γιατί σηκώνει html_editor έχει κάμποσες παραμέτρους κλπ. Θα αφαιρέσω πολύ πράμα που δεν χρειάζεται. Επειδή δεν έχω τις γνώσεις σας θα πάω με την αφαιρετική μέθοδο. Αφού δουλεύει αφαιρώ ότι ΔΕΝ χρειάζεται.
Title: Re: Δημιουργία Component
Post by: intefix on September 25, 2014, 23:12:40
Quote
...
Στη δήλωση του component στη βάση το "iscore" πρέπει να είναι 0 σε third party components. Μόνο τα ενσωματωμένα component στο Elxis έχουν iscore = 1.
INSERT INTO `elx_components` (`id`, `name`, `component`, `route`, `iscore`, `params`) VALUES (NULL, 'Name Street', 'com_namestreet', NULL, 0, NULL);

Επίσης όταν κάνεις insert την τιμή του primary key του πίνακα (εδώ id) δεν την ορίζεις καρφωτά αλλά την βάζεις NULL ώστε να την πάρει αυτόματα αφού το πεδίο είναι auto increment. Το ίδιο λάθος το έχεις κάνει και στο elx_components και στο elx_acl.
Οκ φτιάχτηκαν
Quote
Ο φάκελος "plugins" δεν χρειάζεται, είναι μόνο για το component content. Οι φάκελοι css, js, images είναι κατα βούληση, μπορείς να κάνεις ότι δομή θέλεις εσύ. Οι "υποχρεωτικοί" (στην πραγματικότητα δεν υπάρχεουν υποχρεωτικοί φάκελοι) είναι τρεις: controllers, models, views. Οι controllers περιέχουν την λογική (εσωτερικός php κώδικας), τα models την άντληση των δεδομένων (από την βάση, κάποιο άρχείο ή άλλη πηγή) και τα view εμφανίζουν την τελική html που βλέπουμε στον browser.
Καλά θα δούμε τι θα χρειαστούμε

Quote
Στο ACL έβαλες permissions που είναι ειδικά για το component content και μόνο. Αυτά να τα σβήσεις. Τα υποχρεωτικά permissions σε ένα component είναι view και manage. Το view δηλώνει ποιος μπορεί να δει το component στο δημόσιο τμήμα και το manage ποιος μπορεί να το διαχειριστεί/δει στην διαχείριση. Οι συνήθεις τιμές για το view είναι minlevel=0, gid=0, uid=0, aclvalue=1 που σημαίνει ότι μπορούν να το δουν όλοι. Οι συνήθεις τιμές για το manage είναι minlevel=70, gid=0, uid=0, aclvalue=1 που σημαίνει ότι μπορούν να το δουν στη διαχείριση όσοι έχουν επίπεδο πρόσβασης από 70 και πάνω (managers και administrators). Μπορείς να προσθέσεις επιπλέον permissions (ότι θες εσύ) ανάλογα του component και του τι κάνει.
Αυτό δεν το καταλαβαίνω τι ακριβώς. Το πλήθος των εγγραφών ισχύει; και αλλάζω τα permition?
Για να λες σβήσε σημαίνει να διαγράψω εγγραφές του ACL μάλλον και να αφήσω 2...
Βλέποντας και τα άλλα components αυτό εννοείς τελικά ok...τα σβήνω και διορθώνω και το SQL.

edit----Μάλλον θα ξαναρωτήσω και μετά θα τα σβήσω. Αφού το component μοιάζει με content γράφεις articles κλπ ΔΕΝ χρειάζεσαι τις εγγραφές στον elx_acl και γιατί;
(NULL, 'com_namestreet', 'article', 0, 'add', 70, 0, 0, 2),
(NULL, 'com_namestreet', 'article', 0, 'edit', 70, 0, 0, 2),
(NULL, 'com_namestreet', 'article', 0, 'delete', 70, 0, 0, 2),
(NULL, 'com_namestreet', 'article', 0, 'publish', 70, 0, 0, 2),
(NULL, 'com_namestreet', 'frontpage', 0, 'edit', 70, 0, 0, 1)

Σημείωση: Καλό είναι να γράφουμε σε χαρτί τα βήματα για να τα βάλουμε μετά στα αρχεία εγκατάστασης του component.
Quote
H καρδιά ενός component είναι ο router του (αρχείο namestreet.php) στον οποία αναλύεις τα segments (τμήματα) της url που ζητήθηκε και φορτώνεις τα αντίστοιχα Controller Model View και εκτελείς το task (συνάρτηση) που επιλεγμένου controller. Στο αρχείο router υπάρχει μία κλάση με όνομα {component}Router η οποία επεκτείνει την κλάση elxisRouter του πυρήνα του Elxis.
class namestreetRouter extends elxisRouter {

Μέσα σε αυτή την κλάση πρέπει να υπάρχει μία public μέθοδος** με όνομα route. Αυτή είναι που καλεί το Elxis για να τρέξει το component σου.
public function route() {
...
}
Και εδώ αρχίζουμε με την ουσίαααα ...αύριο η συνέχεια

Title: Re: Δημιουργία Component
Post by: intefix on September 25, 2014, 23:54:38
Ας το πάμε και λίγο πιο κάτω...διαβάζοντας τα αρχεία των components το ποιο "μικρό" είναι το wraper.
Δε με χαλάει αν και θα προτιμούσα κάτι να πλησιάζει το δικό μου. Αφού μου λέτε πως το content είναι μεγάλο...Πράγματι είναι μεγάλο. Ισως εγκαταστήσω κάποιο και να κλέψω ιδέες...Ας πιάσουμε γραμμή - γραμμή το αρχείο namestreet.php
Βάζω μετά τη προστασία για κλήσεις εκτός login στο αρχείο
elxisLoader::loadFile('components/com_namestreet/controllers/base.php');
elxisLoader::loadFile('components/com_namestreet/views/base.html.php');
elxisLoader::loadFile('components/com_namestreet/models/base.model.php');
μετά υπάρχει πράγματι η...
class contentRouter extends elxisRouter {

   private $controller = 'fpage'; or 'public' ?
   private $task = 'frontpage';
   private $format = 'html';

   public function route() {...
Άρα τα αρχεία controllers/base.php, views/base.html.php είναι σε όλα απότι είδα components.
Ωραία τα βάζω και γω. (Τι θα γράφουν μέσα θα δούμε).
Title: Re: Δημιουργία Component
Post by: intefix on September 26, 2014, 07:43:38
Βέβαια που πρέπει να εμφανιστεί τι και πως ακόμα δεν έχω καταλήξει. Τι εννοώ...
Ας πάρουμε το project αυτό που έχουμε φτιάξει. Τι κάνει; (έχεις προετοιμάσει το έδαφος, συνδέσεις με Database, security, interface κλπ - αυτό φτιάχουμε τώρα, το κομμάτι ρύθμισης του component)
Καταχωρείς ένα όνομα (δρόμου) και τη περιγραφή του, το ιστορικό του τόοοσο απλά. Αυτά που βλέπουμε σε κάθε τετράγωνο. Στη πορεία βλέπουμε να προκύπτουν και άλλα δεδομένα. Μια σύντομη περιγραφή 2-3 λέξεις (να χωράει στη πινακίδα) άντε σε 2 γλώσσες...πχ
Άρα μαζεύονται 5-6 πεδία συν το longtext της περιγραφής. (Τώρα για δίγλωση περιγραφή; δεν τόχω σκεφθεί...) Τώρα μαζεύνται και κάτι άλλα βοηθητικά...ας δουμε συνολικά τα πεδία μας ακολουθώντας τη λογική του "content"
  `id` int(11) NOT NULL auto_increment,
  `catid` int(10) unsigned NOT NULL default '0',
  `name` varchar(255) default NULL,
  `seoname` varchar(255) default NULL,
  `desc` varchar(255) default NULL,
  `introtext` text,
  `maintext` longtext,

  `published` tinyint(4) unsigned NOT NULL default '0',
  `metakeys` varchar(255) default NULL,
  `created` datetime NOT NULL default '1970-01-01 00:00:00',
  `created_by` int(10) unsigned NOT NULL default '0',
  `created_by_name` varchar(120) default NULL,
  `modified` datetime NOT NULL default '1970-01-01 00:00:00',
  `modified_by` int(10) unsigned NOT NULL default '0',
  `modified_by_name` varchar(120) default NULL,
  `ordering` int(10) unsigned NOT NULL default '0',
  `hits` int(10) unsigned NOT NULL default '0',
  `alevel` int(10) unsigned NOT NULL default '0',
  `params` text,
Τελικά μάλλον τη κατηγορία θα τη βάλλουμε έστω και αν είναι 0....
Title: Re: Δημιουργία Component
Post by: datahell on September 26, 2014, 13:42:18
Ο τρόπος που σκέφτεσε κάνει τους developer να πηδάνε από τα παράθυρα ;D Έγραψες πολλά πανάθεμά σε, τι να πρωτοσχολιάσω;

- Τα plugins είναι επεκτάσεις του content, δεν έχουν νόημα πουθενά αλλού.
- Στο acl ΜΟΝΟ αυτά τα δύο που σου είπα (view, manage).
- Αν έχεις μόνο έναν controller δεν σου χρειάζεται το "base". Το "base" το χρησιμοποιείς όταν θες να έχεις συναρτήσεις κοινές σε όλους τους controller/models/views και θες το κάθε από αυτά να επεκτείνει το base.
- Η σκέψη ότι χρησιμοποιώ ένα component που έχει editor είναι αδιάφορη. Δεν χρειάζεται να κάνεις τίποτα απολύτως για τον editor, το κάνει μόνο του το Elxis. Ο editor φορτώνει μόνο με μία δήλωση (editor => html) σε οποιοδήποτε πεδίο textarea. Σε μία φόρμα για να φτιάξουμε ένα πεδίο textarea που να φορτώνει τον editor και να είναι και πολυγλωσσικό γράφουμε:

$clang = $elxis->getConfig('LANG');
$cinfo = $eLang->getallinfo($clang);
$trdata = array('category' => 'com_namestreet', 'element' => 'mydesc', 'elid' => (int)$row->id);
$form->addMLTextarea('mydesc', $trdata, $row->mydesc, 'My description' array('cols' => 80, 'rows' => 8, 'forcedir' => $cinfo['DIR'], 'editor' => 'html', 'contentslang' => $clang));
- Οι στήλες desc_el και desc_en είναι λάθος. Το Elxis είναι πολυγλωσσικό, δεν χρειάζεται να δημιουργήσεις ένα πεδίο για κάθε γλώσσα. Βάζεις μόνο ένα πεδίο που αποθηκεύει το κείμενο στην κύρια γλώσσα και τις μεταφράσεις τις αποθηκεύει το Elxis αυτόματα στον πίνακα elx_translations.
Title: Re: Δημιουργία Component
Post by: intefix on September 26, 2014, 14:24:48
Quote
Ο τρόπος που σκέφτεσε κάνει τους developer να πηδάνε από τα παράθυρα ;D Έγραψες πολλά πανάθεμά σε, τι να πρωτοσχολιάσω;
Και γω θα γελάω κάποτε με αυτά...όσο για τους dev έχω 4 με κουβέρτες από κάτω...οπότε 'ντάξει 2 όροφοι είναι μην κανετε έτσι...
Quote
- Τα plugins είναι επεκτάσεις του content, δεν έχουν νόημα πουθενά αλλού.
- Στο acl ΜΟΝΟ αυτά τα δύο που σου είπα (view, manage).
Οκ Datahell το χαμπάριασα αυτό μη βαράς. Εξάλλου είπα μόνο φακέλους έχουμε φτιάξει μέχρι στιγμής...
Θα γυρίσω στην αρχή να τους διορθώσω...
Quote
- Αν έχεις μόνο έναν controller δεν σου χρειάζεται το "base". Το "base" το χρησιμοποιείς όταν θες να έχεις συναρτήσεις κοινές σε όλους τους controller/models/views και θες το κάθε από αυτά να επεκτείνει το base.
Αυτό δεν το γνώριζα...έβλεπα κάποια που δεν είχανε τον base αλλά δεν ψυλιάστηκα τι κάνει τα base files...σιγα σιγα θα το μάθουμε...
Quote
- Η σκέψη ότι χρησιμοποιώ ένα component που έχει editor είναι αδιάφορη. Δεν χρειάζεται να κάνεις τίποτα απολύτως για τον editor, το κάνει μόνο του το Elxis. Ο editor φορτώνει μόνο με μία δήλωση (editor => html) σε οποιοδήποτε πεδίο textarea. Σε μία φόρμα για να φτιάξουμε ένα πεδίο textarea που να φορτώνει τον editor και να είναι και πολυγλωσσικό γράφουμε:

$clang = $elxis->getConfig('LANG');
$cinfo = $eLang->getallinfo($clang);
$trdata = array('category' => 'com_namestreet', 'element' => 'mydesc', 'elid' => (int)$row->id);
$form->addMLTextarea('mydesc', $trdata, $row->mydesc, 'My description' array('cols' => 80, 'rows' => 8, 'forcedir' => $cinfo['DIR'], 'editor' => 'html', 'contentslang' => $clang));
Χμμμμ με γλύτωσες από πολλά με αυτό...είμαι περίεργος στο τέλος τι θα βγει
Quote
- Οι στήλες desc_el και desc_en είναι λάθος. Το Elxis είναι πολυγλωσσικό, δεν χρειάζεται να δημιουργήσεις ένα πεδίο για κάθε γλώσσα. Βάζεις μόνο ένα πεδίο που αποθηκεύει το κείμενο στην κύρια γλώσσα και τις μεταφράσεις τις αποθηκεύει το Elxis αυτόματα στον πίνακα elx_translations.
Ναι; αυτό δεν το είχα μελετήσει γιατι δεν έχω δουλέψει πολυγλωσσικά να ψαχτώ...
Για να καταλάβω κάνει αντίγραφο σε άλλη γλώσσα ...τέλος πάντων θα του δώσω πιο πολύ προσοχή να καταλάβω πως δουλεύει αυτό...άρα ορθώς να διαγραφεί το desc_el και desc_en μένει το desc σκέτο.
Για να καταλάβω...άντε και το φτιάξαμε το backend κομμάτι πως θα το καλώ; Φαντάζομαι θα μπει στο μενού "Περιεχόμενο" και άλλος ένας σύνδεσμος που θα με πηγαίνει στο namestreet? η URLα πως θάναι;
Title: Re: Δημιουργία Component
Post by: datahell on September 26, 2014, 18:32:41
Οι URL ξεκινούν όπως το όνομα του component http://www.example.com/namestreet/
Από εκεί και μέσα φτιάχνεις ότι URL θες εσύ που οδηγούν όπου θέλεις εσύ. Για να δούμε ποιος controller/method θα τρέξει ανάλογα με το request, αναλύουμε στον router τα segments της URL όπως έγραψα πριν.

Παράδειγμα.
Segments: τα τμήματα της URL που χωρίζονται με slash (/) μετά το όνομα του component και χωρίς τυχόν query string (?ταδε=κεινο&αλλο=αποτάλλο)

$c = count($this->segments);
if ($c == 0) { δείξε αρχική σελίδα component } http://www.example.com/namestreet/

if ($this->segments[0] == 'sports') {
     if (!isset($this->segments[1])) {
            δείξε την κατηγορία αθλητικά http://www.example.com/namestreet/sports/
     } else if ($this->segments[1] == 'football.html') {
            δείξε την σελίδα ποδοσφαίρου http://www.example.com/namestreet/sports/football.html
     } else if ($this->segments[1] == 'golf.html') {
            δείξε την σελίδα γκολφ http://www.example.com/namestreet/sports/golf.html
     } else {
           η σελίδα δεν βρέθηκε, δείξε error 404
     }
}

Τις URL στον κώδικα δεν τις γράφουμε ΠΟΤΕ hard-coded αλλά τις δημιουργούμε έτσι (παράδειγμα):
$link = $elxis->makeURL('namestreet:sports/football.html');

Για τα link της διαχείρισης αντί της makeURL χρησιμοποιείς την makeAURL.
Για περισσότερα διάβασε το elxisURI στο www.elxis.net/docs/
Title: Re: Δημιουργία Component
Post by: intefix on September 27, 2014, 16:21:00
Πάρα πολύ ωραία αλλά έχασα τη μπάλα...βασικά τα βήματα που θακανα...αλλάζω τη σκέψη μου...
Θέλω ένα component εκτός elxis να πιάσω τι και πως το κάνει ο Dev. Θα επέλεγα το Micro τι λες Datahell?
Χονρά - ψιλά καταλάβατε τι θέλω να κάνω...μήπως κανα άλλο είναι πιο κοντά σ'αυτό; Να είναι συμβατό με 4.2 όμως...
Title: Re: Δημιουργία Component
Post by: datahell on September 27, 2014, 20:02:46
Τα φτυσες κιόλας;  :D

Σου ετοιμάζω ένα κενό Name Street component και ξεκίνα από εκεί. Σε μισή ωρίτσα το ανεβάζω εδώ.
Title: Component Name Street - Βάση εκκίνησης
Post by: datahell on September 27, 2014, 21:06:06
Σου έφτιαξα όλο τον βασικό σκελετό, controllers, συναρτήσεις, routing, εγκατάσταση, css, αρχεία γλώσσας, κλπ. Το επεκτείνεις και το συμπληρώνεις όπως θες.
Όποιος άλλος θέλει μπορεί επίσης να το κατεβάσει και να το έχει ως βάση εκκίνησης για κατασκευή component (είναι συνημμένο στο παρόν άρθρο - συνδεθείτε για να το κατεβάσετε).

Σημείωση: Επειδή το έφτιαξα γρήγορα και δεν το έχω εγκαταστήσει και δοκιμάσει ίσως περιέχει λάθη.
Title: Re: Δημιουργία Component
Post by: intefix on September 28, 2014, 07:34:55
Καλημέρα...δε κατάλαβες καλά ΔΕΝ υπάρχει περίπτωση να κάνω πίσω...
Απλά ήθελα να πιιάσω ένα που να δουλεύει και να το μετατρέψω.
Τωρα φτάχνουμε κάτι από την αρχή...Πρέπει να διαβάσω τα αρχεία...Υπομονή.
Title: Re: Δημιουργία Component
Post by: nikos on September 28, 2014, 11:11:04
Καλημέρα Γιάννη

Βάσει του βασικού σκελετού που μας παρέθεσες (να σαι καλά) δημιούργησα το δικό μου component το οποίο και εγκατέστησα σε τοπικό Elxis 4.2 rev1636. Επίσης εγκατεστησα και το μοντέλο com_namestreet για να βλέπω και να συγκρίνω. Δημιούργησα και σχετικά menu items για να τα βλέπω και τα 2 μπροστά και να τα δουλέψω.

Καλώντας λοιπόν το com_namestreet μου δίνει το εξής error

Code: [Select]

ERROR in file ..\components\com_namestreet\views\public.html.php line 42

Cannot redeclare class publicNstreetC


το οποίο όπως κοίταξα στο αρχείο έχει να κάνει με την δήλωση στην γραμμή 14

class publicNstreetC extends nstreetView {




Title: Re: Δημιουργία Component
Post by: datahell on September 28, 2014, 18:29:01
Όπως έγραψα πριν το έφτιαξα "στο φτερό". Είναι πολύ πιθανό να περιέχει μικρό-λάθη. Μην μου τα αναφέρετε, δεν υπάρχει λόγος. Το έφτιαξα ως βάση για να ξεκινήσετε, όχι ως έτοιμο για χρήση component.

Για το συγκεκριμένο άλλαξε αυτό:
class publicNstreetC extends nstreetView {
 σε αυτό:
class publicNstreetV extends nstreetView {

Ότι άλλο λάθος τυχόν έχει εντοπίστε το και διορθώστο το μόνοι σας. Αυτό είναι το νόημα, όχι να το φτιάξω εγώ.

Συνεχίστε! Ότι θέμα έχετε ρωτάτε αλλά θέλω να το παλεύετε και μόνοι σας. Αν κολάτε κάπου κοιτάξτε παρόμοιες περιπτώσεις σε άλλα component πως έχουν υλοποιηθεί και ανατρέξτε και στο Elxis Docs (https://www.elxis.net/docs/) για βοήθεια όπου υπάρχει. Αν κολήσετε ρωτάτε εδώ. Καμία ερώτηση δεν είναι χαζή ή εύκολη. Να το ψάχνετε όμως πρώτα, μην τα περιμένετε έτοιμα γιατί δεν θα μάθετε ποτέ. Το ζητούμενο δεν είναι να φτιάξετε το component αλλά να καταλάβετε τι γράφετε και γιατί.
Title: Re: Δημιουργία Component
Post by: intefix on September 29, 2014, 19:18:53
Παιδιά μην ανησυχήτε...λίγος χρόνος για κώδικες...καθότι μάζευα καρύδια το Σ/Κ και με μαύρα χέρια δεν έπιανα πληκτρολόγιο. 'Ενοιωθα κάπως. λέμε τώρα. Μου τύχανε και στραβές με τη δουλειά οπότε πάμε λίγο πιο αργά.
Εβαλα το com_namestreet_0.2 έκανα και κάποιες μικροδιορθώσεις σε λαθάκια αλλά...
Όταν κάνει εγκατάσταση "κολλάει". Τι εννοώ. Η χρονική μπάρα δεν τελειώνει. Επίσης παρατηρώ ότι δεν κάνει insert τον νεο πίνακα. Ακόμα δεν τοψαξα. Αλλά ελπίζω να το βρώ.
-------------------------------------------------------
Λοιπόν 2 λαθάκια σύνταξης.
1. Αρχείο namestreet.php γραμμή 99. Δίνουμε κατάληξη στο delete.html
2. Αρχείο \com_namestreet_0.2\includes\db\mysql.sql
Βάζουμε
DROP TABLE IF EXISTS `#__namestreet`;
CREATE TABLE  `#__namestreet` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(180) collate utf8_unicode_ci default NULL,
  `description` text collate utf8_unicode_ci NOT NULL,
  `published` int(3) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Για να είμαι ειλικρινής δεν έβλεπα λάθος αλλά δεν έπαιζε το sql.
Φτάσαμε τώρα σε ένα νέο σύνδεσμο στα components /estia/namestreet/streets.html πΟυ πρέπει να φτάξουμε.
Πρέπει να ξανακοιτάξω και τα άλλα αρχεία η λέτε να δουλεύουν; η πορεία θα δείξει
Η νέα έκδοση
Title: Re: Δημιουργία Component
Post by: datahell on September 29, 2014, 23:36:03
Κανένα από τα δύο δεν είναι λάθος.

Το delete είναι ajax request. Σε τέτοιες σελίδες προτιμούμε να μην δίνουμε κατάληξη στη σελίδα καθώς η απάντηση είναι έγγραφο text/plain ή application/json και όχι html. Όπως έγραψα πιο πριν θα πρέπει να σκεφτόμαστε τι γράφουμε -ή τι έχω γράψει εγώ στην συγκεκριμένη περίπτωση- και γιατί και μην κάνουμε copy-paste που δεν καταλαβαίνουμε επειδή το είδαμε κάπου αλλού ή μοιάζει με κάτι άλλο. Στην συγκεκριμένη function, το θυμάμαι, έχω γράψει εξεπίτηδες από πάνω "AJAX" ώστε να το προσέξετε και να καταλάβετε την διαφορά.

Η MySQL είναι επίσης σωστή. Τα παραπανήσια που έχεις προσθέσει κάπως μου φαίνονται, ειδικά το "unique" στο "title". Το προτιμώμενο collation είναι utf_general_ci και εφόσον το δηλώσεις ως default στη βάση δεν χρειάζεται να το δηλώνεις σε κάθε πίνακα ή στήλη ξεχωριστά. To auto_increment επίσης δεν χρειάζεται να το δηλώσεις αφού μόλις δημιουργήται ο πίνακας, υπάρχει περίπτωση να έχει άλλη τιμή εκτός από 1; Στο elxis η sql είναι όσο γίνεται πιο απλή. Την όποια πρόσθετη λειτουργικότητα την μετάφέρουμε στην php και όχι στην βάση προκειμένου να έχουμε μέγιστη συμβατότητα με όλες τις υποστηριζόμενες βάσεις δεδομένων από το PDO.
Title: Re: Δημιουργία Component
Post by: intefix on September 30, 2014, 06:25:30
Καλημέρα...
Όπως είπα τα διάβασα όλα. Αυτό δε σημαίνει ότι τα κατάλαβα κιόλας.
Στο delete που λες από που έπρεπε να καταλάβω τη διαφοροποίηση σαν AJAX;
Στο Sql τώρα. Όπως είπα δεν έβλεπα λάθος και συμφωνώ για τα extra που έχω βάλει.
Edit...------------------------
έχει τελικά ένα "," παραπάνω
  PRIMARY KEY  (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
------------------------------
Πάμε παρακάτω τώρα...αν έχω καταλάβει καλά βλέπω ότι δημιουργεί κάποιο Grid τουλάχιστον στο backend.
Έτσι είναι η σταματάει στο link που καλεί το streets.html?
Title: Re: Δημιουργία Component
Post by: intefix on September 30, 2014, 15:40:37
Πάμε παρακάτω...
Αφού λοιπόν έφτιαξε και τον πίνακα elx_namestreet κλπ διαβάζουμε το namestreet.php στη ρίζα του φακέλου.
Μετά τη γραμμή 71 και πριν το exitPage::make('404', 'CNST-0003'); στην ενότητα "MAKE FRONTEND ROUTE" πρέπει να γράψουμε κώδικα για την εμφάνιση στο εμπρός μέρος. (μετά αυτό)
Πηγαίνοντας στην επόμενη ενότητα "MAKE ADMIN ROUTE" βλέπουμε ότι αν είμαστε στη διαχείριση και έχει συνέχεια η URL μετά το component τότε γίνεται η
if ($c == 1) {
         if ($this->segments[1] == 'streets.html') {
            $this->task = 'streets';
            return;...
Οπότε για να κάνουμε τη λίστα "streets.html" πρέπει να πάμε στην ενότητα "PREPARE TO DISPLAY LIST OF STREETS" του /controllers/admin.php.
--H προηγούμενη ενότητα "PREPARE TO DISPLAY CONTROL PANEL" δεν νομίζω να θέλει πείραγμα συγκρίνοντας την με άλλου component καθότι "ELXIS_MULTISITE" και timers δεν θέλουμε στη παρούσα φάση.--
Συγκρίνοντας με άλλο C που δείχνει λίστα κατηγοριών και δεδομένου ότι κάτι τέτοιο θέλουμε προτείνω:
Code: [Select]
public function streets() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$pathway = eFactory::getPathway();
$eDoc = eFactory::getDocument();

$rows = $this->model->fetchNamestreet();

$pathway->deleteAllNodes();
$pathway->addNode('namestreet', 'namestreet:/');
$pathway->addNode($eLang->get('NAMESTREET'));
$eDoc->setTitle($eLang->get('NAMESTREET').' - namestreet');
$eDoc->addStyleLink($elxis->secureBase().'/components/com_namestreet/includes/css/namestreet'.$eLang->getinfo('RTLSFX').'.css');
$eDoc->addScriptLink($elxis->secureBase().'/components/com_namestreet/includes/namestreet.js');

$this->view->streetsHTML();
}

Για να τραβήξω και data πήγα στο /models/admin.model.php και πρόσθεσα
Code: [Select]
public function fetchNamestreet() {
$sql = "SELECT * FROM ".$this->db->quoteId('#__namestreet')." ORDER BY ".$this->db->quoteId('ordering')." ASC";
$stmt = $this->db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach ($rows.......εδώ δεν ξέρω....fetchResult();
}
Σιγά και με το μαλακό.... :P
Title: Re: Δημιουργία Component
Post by: datahell on September 30, 2014, 22:07:43
Στο admin > view > streetsHTML θα χρειαστεί να φτιάξεις ένα AJAX grid. Ως παράδειγμα δες ένα απλό grid στο component user.

Η εμφάνιση (html) του grid:
components/com_users/views/agroups.html.php , γραμμή 28:
public function listgroups() {
...
}

Τα data αν προσέξεις τα φορτώνει καλώντας αυτή την σελίδα:
$grid->setOption('url', $elxis->makeAURL('user:groups/getgroups.xml', 'inner.php'));

Οπότε θα βρεις τον σχετικό κώδικα εδώ:
components/com_users/controllers/agroups.php , γραμμή 48:
public function getgroups() {
....
}

Δες πως εκεί  ο controller συνδέετε στο model για να τραβήξει τις εγγραφές από την βάση δεδομένων και πως κάνει ταξινόμηση και limit των αποτελεσμάτων.
Title: Re: Δημιουργία Component
Post by: intefix on October 03, 2014, 16:43:38
Πάμε παλι...
Προσπαθώ να φτιάξω το "admin.html.php"
Έβαλα στο αρχείο el.com_namestreet.php και en.com_namestreet.php αντίστοιχα τη μετάφραση του "NAME_STREETS"
Παρατήρηση: ;Oταν βάλω στη fuction public
function apanelHTML
  echo '<h2>'.$eLang->get('NAME_STREETS')."</h2>\n";
Δεν μου επιστρέφει τίποτα και δεν δείχνει τίποτα. Κτυπάει. Γιατί;
Title: Re: Δημιουργία Component
Post by: datahell on October 03, 2014, 19:19:08
Διαχείριση > Ρυθμίσεις > Καρτέλα "Σφάλματα" > Αναφορά = Σημειώσεις

Κάνε αποθήκευση, τώρα θα βλέπεις όλα τα σφάλματα στον browser.
Αυτό μόνο για τοπικά site. Σε online site το βάζουμε σε Εκτός και αντ αυτού ενεργοποιούμε την καταγραφή σφαλμάτων.

Αφού ενεργοποιήσεις τα σφάλματα πήγαινε πάλι στην συγκεκριμένη σελίδα που δεν βλέπεις τίποτα. Τώρα θα δεις μία προειδοποίηση ότι η μεταβλητή $eLang δεν έχει οριστεί (για την ακρίβεια είναι ένα instance ενός object που δεν υπάρχει).

Στην php πρώτα ορίζουμε μία μεταβλητή και μετά την χρησιμοποιούμε.

Αυτό είναι σωστό:
$x = 45;
echo $x;

Αυτό όμως είναι λάθος γιατί η php δεν ξέρει τι είναι αυτό το $x που λες να εμφανιστεί:
echo $x;

Στο συγκεκριμένο δικό σου σφάλμα το $eLang θα πρέπει να είναι ένα instance της κλάσης elxisLanguage. Το instance αυτό το φορτώνουμε μέσω του factory του Elxis (eFactory) με την function getLang (static). Η getLang αναλαμβάνει να εκκινήσει την elxisLanguage και να αποθηκεύσει το instance της στο μητρώο του Elxis (eRegistry) με μία τεχνική που ονομάζεται singleton και διασφαλίζει πως η κλάση elxisLanguage θα εκκινηθεί μόνο μία φορά. Το factory του elxis παρέχει μία σειρά τέτοιων ευκολιών, για περισσότερα διάβασε εδώ (https://www.elxis.net/docs/el/developers/libraries/efactory.html).

Οπότε για διόρθωση:

public function apanelHTML() {
       $eLang = eFactory::getLang();

       echo '<h2>'.$eLang->get('NAME_STREETS')."</h2>\n";
}
Title: Re: Δημιουργία Component
Post by: intefix on October 04, 2014, 12:22:17
Quote
Διαχείριση > Ρυθμίσεις > Καρτέλα "Σφάλματα" > Αναφορά = Σημειώσεις Κάνε αποθήκευση, τώρα θα βλέπεις όλα τα σφάλματα στον browser. Αυτό μόνο για τοπικά site.
Σε online site το βάζουμε σε Εκτός και αντ αυτού ενεργοποιούμε την καταγραφή σφαλμάτων.
Προτιμώ να είναι On-line το site. Οπότε θα το στήσω στο -removed by datahell-. Και εκεί θα βλέπουμε το αποτέλεσμα με όλα τα σφάλματα ανοιχτά. Θα φτιάξω και ένα χρήστη -removed by datahell- για να βλέπουμε και από backend.
Quote
Αφού ενεργοποιήσεις τα σφάλματα πήγαινε πάλι στην συγκεκριμένη σελίδα που δεν βλέπεις τίποτα. Τώρα θα δεις μία προειδοποίηση ότι η μεταβλητή $eLang δεν έχει οριστεί (για την ακρίβεια είναι ένα instance ενός object που δεν υπάρχει).
Υπέθεσα ότι έχει οριστεί σε προηγούμενα βασικά αρχεία που φορτώνει καθ' οδόν. Εξάλλου δεν έβλεπα τα σφάλματα
Να ορίσω αποσφαλμάτωση "πλήρης" νομίζω.
Ευχαριστώ για την υπομονή σας...
Title: Re: Δημιουργία Component
Post by: intefix on October 06, 2014, 16:13:55
Οκ. τό' πιασα Συνεχίζω...
Είμαι στο admin.html.php στη class adminNstreetV extends nstreetView στη fuction streets
Code: [Select]

/*********************/
/* LIST STREETS HTML */
/*********************/
public function streets() {
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();

echo '<h2>'.$eLang->get('NAME_STREETS')."</h2>\n";

elxisLoader::loadFile('includes/libraries/elxis/grid.class.php');
$grid = new elxisGrid('lstreets', $eLang->get('NAME_STREETS'));
$grid->setOption('url', $elxis->makeAURL('namestreet:streets/getstreets.xml', 'inner.php'));
$grid->setOption('sortname', 'level');
$grid->setOption('sortorder', 'desc');
$grid->setOption('rp', $elxis->getCookie('rp', 10));
$grid->setOption('showToggleBtn', false);
$grid->setOption('singleSelect', true);
$grid->addColumn($eLang->get('ID'), 'id', 60, true, 'center');
$grid->addColumn($eLang->get('NAME'), 'title', 160, true, 'left');
$grid->addColumn($eLang->get('DESCRIPTION'), 'description', 350, false, 'auto');
$grid->addColumn($eLang->get('PUBLISHED'), 'published', 80, false, 'center');
$grid->addButton($eLang->get('NEW'), 'addname', 'add', 'nameaction');
$grid->addSeparator();
$grid->addButton($eLang->get('EDIT'), 'editname', 'edit', 'nameaction');
$grid->addSeparator();
$grid->addButton($eLang->get('DELETE'), 'deletename', 'delete', 'nameaction');
$grid->addSeparator();
?>

<script type="text/javascript">
/* <![CDATA[ */
function nameaction(task, grid) {
if (task == 'addname') {
var newurl = '<?php echo $elxis->makeAURL('namestreet:streets/edit.html'); ?>?id=0';
location.href = newurl;
} else if (task == 'editname') {
var nsel = $('.trSelected', grid).length;
if (nsel < 1) {
alert('<?php echo addslashes($eLang->get('NO_ITEMS_SELECTED')); ?>');
return false;
} else {
var newurl = '<?php echo $elxis->makeAURL('namestreet:streets/edit.html'); ?>?id=';
var items = $('.trSelected',grid);
var groupid = parseInt(items[0].id.substr(3));
newurl += groupid;
location.href = newurl;
}
} else if (task == 'deletename') {
var nsel = $('.trSelected', grid).length;
if (nsel < 1) {
alert('<?php echo $eLang->get('NO_ITEMS_SELECTED'); ?>');
return false;
} else {
if (confirm('<?php echo addslashes($eLang->get('AREYOUSURE')); ?>')) {
var items = $('.trSelected',grid);
var groupid = parseInt(items[0].id.substr(3));
var edata = {'id': groupid};
var eurl = '<?php echo $elxis->makeAURL('namestreet:streets/deletename''inner.php'); ?>';
var successfunc = function(xreply) {
var rdata = new Array();
rdata = xreply.split('|');
var rok = parseInt(rdata[0]);
if (rok == 1) {
$("#lstreets").flexReload();
} else {
alert(rdata[1]);
}
}
elxAjax('POST', eurl, edata, null, null, successfunc, null);
}
}
} else {
alert('Invalid request!');
}
}
/* ]]> */
</script>

<?php 
$grid->render();
unset($grid);
}
Grid δεν βλέπω. Τι άλλο δεν βλέπω;
Title: Re: Δημιουργία Component
Post by: datahell on October 06, 2014, 20:06:32
Γιατί θα πρεπε να δεις; Από που περιμένεις τα δεδομένα;
Title: Re: Δημιουργία Component
Post by: intefix on October 07, 2014, 15:35:16
Το αρχείο admin.html.php
Code: [Select]
<?php 
/**
* @version 1.0
* @package Component Name Street
* @author Write your name
* @copyright Write some copyright text
* @license Elxis Public License (https://www.elxis.org/elxis-public-license.html)
* @description  Name Street component
******************************************/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class 
adminNstreetV extends nstreetView {

/*********************/
/* MAGIC CONSTRUCTOR */
/*********************/
public function __construct() {
parent::__construct();
}


/**********************/
/* CONTROL PANEL HTML */
/**********************/
public function apanelHTML() {
$elxis eFactory::getElxis();
$eLang eFactory::getLang();

$link $elxis->makeAURL('namestreet:streets.html');
echo '<h2>'.$eLang->get('NAME_STREETS')."</h2>\n";



/*********************/
/* LIST STREETS HTML */
/*********************/
public function streets() {
$elxis eFactory::getElxis();
$eLang eFactory::getLang();

$link $elxis->makeAURL('namestreet:edit.html').'?id=0';
echo '<h2>'.$eLang->get('NAME_STREETS')."</h2>\n";
elxisLoader::loadFile('includes/libraries/elxis/grid.class.php');
$grid = new elxisGrid('lstreets'$eLang->get('NAME_STREETS'));
$grid->setOption('url'$elxis->makeAURL('namestreet:streets/getstreets.xml''inner.php'));
$grid->setOption('sortname''level');
$grid->setOption('sortorder''desc');
$grid->setOption('rp'$elxis->getCookie('rp'10));
$grid->setOption('showToggleBtn'false);
$grid->setOption('singleSelect'true);
$grid->addColumn($eLang->get('ID'), 'id'60true'center');
$grid->addColumn($eLang->get('NAME'), 'title'160true'center');
$grid->addColumn($eLang->get('DESCRIPTION'), 'description'350false'auto');
$grid->addColumn($eLang->get('PUBLISHED'), 'published'80false'center');
$grid->addButton($eLang->get('NEW'), 'addname''add''nameaction');
$grid->addSeparator();
$grid->addButton($eLang->get('EDIT'), 'editname''edit''nameaction');
$grid->addSeparator();
$grid->addButton($eLang->get('DELETE'), 'deletename''delete''nameaction');
$grid->addSeparator();
?>


<script type="text/javascript">
/* <![CDATA[ */
function nameaction(task, grid) {
if (task == 'addname') {
var newurl = '<?php echo $elxis->makeAURL('namestreet:streets/edit.html'); ?>?id=0';
location.href = newurl;
} else if (task == 'editname') {
var nsel = $('.trSelected', grid).length;
if (nsel < 1) {
alert('<?php echo addslashes($eLang->get('NO_ITEMS_SELECTED')); ?>');
return false;
} else {
var newurl = '<?php echo $elxis->makeAURL('namestreet:streets/edit.html'); ?>?id=';
var items = $('.trSelected',grid);
var nameid = parseInt(items[0].id.substr(3));
newurl += nameid;
location.href = newurl;
}
} else if (task == 'deletename') {
var nsel = $('.trSelected', grid).length;
if (nsel < 1) {
alert('<?php echo $eLang->get('NO_ITEMS_SELECTED'); ?>');
return false;
} else {
if (confirm('<?php echo addslashes($eLang->get('AREYOUSURE')); ?>')) {
var items = $('.trSelected',grid);
var nameid = parseInt(items[0].id.substr(3));
var edata = {'id': nameid};
var eurl = '<?php echo $elxis->makeAURL('namestreet:streets/deletename''inner.php'); ?>';
var successfunc = function(xreply) {
var rdata = new Array();
rdata = xreply.split('|');
var rok = parseInt(rdata[0]);
if (rok == 1) {
$("#lstreets").flexReload();
} else {
alert(rdata[1]);
}
}
elxAjax('POST', eurl, edata, null, null, successfunc, null);
}
}
} else {
alert('Invalid request!');
}
}
/* ]]> */
</script>

<?php 
$grid->render();
unset($grid);
}

/********************/
/* EDIT STREET HTML */
/********************/
public function editStreetHTML($row) {
$elxis eFactory::getElxis();
$eLang eFactory::getLang();

$clang $elxis->getConfig('LANG');
$cinfo $eLang->getallinfo($clang);

$action $elxis->makeAURL('namestreet:save.html''inner.php');
elxisLoader::loadFile('includes/libraries/elxis/form.class.php');
$formOptions = array(
'name' => 'nseditform',
'action' => $action,
'idprefix' => 'ens',
'label_width' => 140,
'label_align' => 'left',
'label_top' => 0,
'tip_style' => 1,
'jsonsubmit' => 'document.nseditform.submit()'
);

$form = new elxisForm($formOptions);

$trdata = array('title' => 'com_namestreet''element' => 'title''elid' => intval($row->id));
$form->addMLText('title'$trdata$row->title$eLang->get('TITLE'), array('required' => 1'size' => 45'maxlength' => 180));

$form->addYesNo('published'$eLang->get('PUBLISHED'), $row->published);

$trdata = array('category' => 'com_namestreet''element' => 'description''elid' => (int)$row->id);
$form->addMLTextarea(
'description'$trdata$row->description$eLang->get('DESCRIPTION'), 
array('cols' => 80'rows' => 8'forcedir' => $cinfo['DIR'], 'editor' => 'html''contentslang' => $clang)
);
$form->addHidden('id'$row->id);

$form->render();
}

}

?>
Στη function editStreetHTML($row) έχουμε μονο row. Τα $tree, $acllist, $readonly (από το Group users δεν τα βάζω.